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 rolls = new ArrayList(); 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 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 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 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(); } } }