Kniffel/tui/TUI.java

237 lines
7.2 KiB
Java

package tui;
import domain.Player;
import fassade.KniffelSystem;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class TUI {
static KniffelSystem gameSystem;
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) throws IOException {
System.out.println("Welcome to the PR2 Kniffel game!");
while (true){
mainMenuOutput();
}
// DEV:
// gameSystem = new KniffelSystem();
// gameSystem.creteDevPlayers(1);
// gameLoop();
}
private static void mainMenuOutput() throws IOException {
System.out.println("What do you want to do?");
System.out.println("1 - Play");
System.out.println("2 - See leaderboard");
System.out.println("3 - Exit");
System.out.print("> ");
String mainMenuUserInput = sc.nextLine().toLowerCase();
if ((mainMenuUserInput.equals("1"))
|| (mainMenuUserInput.equals("play"))){
mainMenuPlay();
}
else if ((mainMenuUserInput.equals("2"))
|| (mainMenuUserInput.equals("see leaderboard"))
|| (mainMenuUserInput.equals("see"))
|| (mainMenuUserInput.equals("leaderboard"))){
mainMenuLeaderBoard();
}
else {
mainMenuExit();
}
}
private static void mainMenuPlay() throws IOException {
gameSystem = new KniffelSystem();
System.out.println("Do you want to play the default mode (1) or the starwars mode (2)");
System.out.print("> ");
String mainMenuGamemodeOutput = sc.nextLine();
decideGamemode(mainMenuGamemodeOutput);
System.out.println("How many players are you? (1-6)");
System.out.print("> ");
String mainMenuPlayAmountPlayersInput = sc.nextLine().toLowerCase();
int amountPlayers = Integer.parseInt(mainMenuPlayAmountPlayersInput);
for (int i = 0; i < amountPlayers; i++){
System.out.printf("Player %d: ", i + 1);
System.out.println("Enter your name: ");
System.out.print("> ");
String playerName = sc.nextLine();
String coloredPlayerName = gameSystem.addPlayer(i+1, playerName);
System.out.printf("Welcome %s! \n\n", coloredPlayerName);
}
gameLoop();
afterGame();
}
private static void decideGamemode(String userInput){
System.out.println(gameSystem.setGamemode(userInput));
System.out.println();
}
private static void gameLoop(){
String[] playerStrings = gameSystem.getAllPlayerStrings();
System.out.println("Participating players:");
for (String player : playerStrings){
System.out.println(player);
}
System.out.println();
int turncounter = 0;
int rollscount;
while (true){
if (gameSystem.checkGameEnd()){
return;
}
rollscount = 0;
System.out.printf("It's your turn %s!\n\n", gameSystem.getCurrentPlayer());
ArrayList<Integer> rolls = new ArrayList<Integer>();
String keptDice = "";
while(rollscount < 3){
rolls = gameSystem.rollDices(rolls, keptDice);
String newRollsString = diceArrToString(rolls);
System.out.println(newRollsString);
String evaluatedRolls = gameSystem.evaluateRoll(rolls);
System.out.println(evaluatedRolls);
if (rollscount < 2) {
String keeping = gameSystem.changeStringFormat("Which dice do you want to keep?", "\u001B[32m");
System.out.println(keeping);
System.out.println("Empty for none, single digit for one dice or (1,3,4) for multiple dice.");
System.out.print("> ");
keptDice = sc.nextLine();
}
rollscount++;
}
writeToSheet();
triggerNextTurn();
}
}
private static void writeToSheet(){
ArrayList<String> unusedRows = gameSystem.getUnusedRows();
StringBuilder sb = new StringBuilder();
sb.append("Unused rows: \n");
for (String unusedRow : unusedRows){
sb.append(String.format("- %s \n", unusedRow));
}
System.out.println(sb.toString());
String keeping = gameSystem.changeStringFormat("Which row do you want to fill?", "\u001B[31m");
System.out.println(keeping);
System.out.print(">");
String sheetInput = sc.nextLine();
gameSystem.writeToSheet(sheetInput);
}
private static String diceArrToString(ArrayList<Integer> diceArr){
StringBuilder sb = new StringBuilder();
sb.append("Throwing dice... \n");
sb.append("Your rolls: \n");
for (int i = 0; i < diceArr.size(); i++){
sb.append(String.format("Dice %d: %s \n", i+1, Integer.toString(diceArr.get(i))));
}
return sb.toString();
}
private static void triggerNextTurn(){
gameSystem.nextPlayer();
}
private static void afterGame() throws IOException {
System.out.println(gameSystem.afterGame());
}
private static void mainMenuLeaderBoard() throws IOException {
gameSystem = new KniffelSystem(); // Scorboard System
ArrayList<String> leaderboardRows = gameSystem.readFromFile();
if(leaderboardRows.isEmpty()){
System.out.println("\nThe leadboard is empty, be the first one! \n");
return;
}
StringBuilder sb = new StringBuilder();
for(String leaderboardRow : leaderboardRows) {
String[] row = leaderboardRow.split(",");
sb.append(String.format("%s - %s - %s \n", row[1], row[0], row[2]));
}
System.out.println("\nLEADERBOARD");
System.out.println(sb.toString());
String deleteLeaderboardOutput = deleteLeaderboardInput();
if (!(deleteLeaderboardOutput.isEmpty())){
System.out.println(deleteLeaderboardOutput);
}
else {
System.out.println();
}
}
private static String deleteLeaderboardInput() throws IOException {
System.out.println("Clear lederboard? (y/N)");
System.out.print("> ");
String deleteInput = sc.nextLine().toLowerCase();
if ((deleteInput.equals("y")) || (deleteInput.equals("yes"))){
gameSystem.clearLeaderboard();
return "Cleared leaderboard \n";
}
return "";
}
private static void mainMenuExit() throws IOException {
System.out.println("Do you really want to exit? (Y/n)");
System.out.print("> ");
String mainMenuExitUserInput = sc.nextLine().toLowerCase();
if ((mainMenuExitUserInput.equals("y"))
|| (mainMenuExitUserInput.equals("yes"))
|| mainMenuExitUserInput.isBlank()){
System.out.print("Exiting, see you next time!");
System.exit(0);
}
else {
System.out.println("Returning to main menu");
System.out.println();
mainMenuOutput();
}
}
}