From e2604101bfae06232f747c7efa87bef93fbbb026 Mon Sep 17 00:00:00 2001 From: 3013050 <3013050@stud.hs-mannheim.de> Date: Mon, 6 May 2024 22:55:58 +0200 Subject: [PATCH] Completed default gamemode Added complete default gamemode, added leaderboard saved and loaded from file, added beginings of the starwars mode implementation. --- domain/Game.java | 24 ++++++++- domain/Player.java | 25 ++++++++- domain/Sheet.java | 46 +++++++++++++++- domain/StarwarsSheet.java | 52 +++++++++++++++++++ domain/sheets/Eights.java | 10 ++++ domain/sheets/R2D2.java | 5 ++ domain/sheets/Sevens.java | 10 ++++ domain/sheets/StarWarsDay.java | 6 +++ fassade/KniffelSystem.java | 95 ++++++++++++++++++++++++++++++++-- scores.csv | 0 tui/TUI.java | 80 ++++++++++++++++++++++------ 11 files changed, 329 insertions(+), 24 deletions(-) create mode 100644 domain/StarwarsSheet.java create mode 100644 domain/sheets/Eights.java create mode 100644 domain/sheets/R2D2.java create mode 100644 domain/sheets/Sevens.java create mode 100644 domain/sheets/StarWarsDay.java create mode 100644 scores.csv diff --git a/domain/Game.java b/domain/Game.java index 420607e..1daa1ab 100644 --- a/domain/Game.java +++ b/domain/Game.java @@ -8,11 +8,30 @@ public class Game { private ArrayList currentPlayers; private int turnPlayer; private Dice dice; + private String gamemode; public Game(){ currentPlayers = new ArrayList(); turnPlayer = 0; - dice = new Dice(6); + + } + + + public String setGamemode(String gamemode){ + if (gamemode.equals("1")){ + this.gamemode = "default"; + dice = new Dice(6); + return "Default mode selected."; + } else { + this.gamemode = "starwars"; + dice = new Dice(8); + return "Starwars mode selected."; + } + } + + + public String getGamemode(){ + return this.gamemode; } @@ -20,10 +39,12 @@ public class Game { Collections.rotate(currentPlayers, -1); } + public Player getCurrentPlayer(){ return currentPlayers.getFirst(); } + public int rollDice(){ return dice.roll(); } @@ -33,6 +54,7 @@ public class Game { currentPlayers.add(playerToAdd); } + public ArrayList getPlayers(){ return currentPlayers; } diff --git a/domain/Player.java b/domain/Player.java index ca6d615..5759b16 100644 --- a/domain/Player.java +++ b/domain/Player.java @@ -7,12 +7,19 @@ public class Player { int score; Sheet sheet; - public Player(int playerNumber, String name, String color, int score) { + public Player(int playerNumber, String name, String color, int score, String gamemode) { this.playerNumber = playerNumber; this.name = name; this.color = color; this.score = score; this.sheet = new Sheet(); + + if (gamemode.equals("default")){ + this.sheet = new Sheet(); + } + else if (gamemode.equals("starwars")){ + this.sheet = new StarwarsSheet(); + } } @@ -24,11 +31,25 @@ public class Player { return this.sheet; } + + public void setScore(int score){ + this.score = score; + } + + public int getScore(){ + return this.score; + } + + + public String getName(){ + return this.name; + } + + @Override public String toString() { String ANSI_RESET = "\u001B[0m"; String coloredName = String.format(this.color + this.name + ANSI_RESET); - // return String.format("Player %d: %s", this.playerNumber, coloredName); return String.format("%s", coloredName); } } diff --git a/domain/Sheet.java b/domain/Sheet.java index 9ee7bca..7cfa83c 100644 --- a/domain/Sheet.java +++ b/domain/Sheet.java @@ -11,7 +11,7 @@ public class Sheet { ArrayList usedRows = new ArrayList<>(); ArrayList crossedRows = new ArrayList<>(); - // Sheet rows, first half + //? Sheet rows, upper half Aces aces; Twos twos; Threes threes; @@ -19,7 +19,7 @@ public class Sheet { Fives fives; Sixes sixes; - // Sheet rows, second half + //? Sheet rows, lower half ThreeOfKind threeOfKind; FourOfKind fourOfKind; FullHouse fullHouse; @@ -143,6 +143,48 @@ public class Sheet { } + public int calcSheet(){ + int upperSum = calcUpperHalf(); + int upperScore = calcUpperBonus(upperSum); + + int lowerScore = calcLowerHalf(); + + return upperScore + lowerScore; + } + + private int calcUpperHalf(){ + int upperSum = 0; + upperSum += aces.getValue(); + upperSum += twos.getValue(); + upperSum += threes.getValue(); + upperSum += fours.getValue(); + upperSum += fives.getValue(); + upperSum += sixes.getValue(); + + return upperSum; + } + + private int calcLowerHalf(){ + int lowerSum = 0; + lowerSum += threeOfKind.getValue(); + lowerSum += fourOfKind.getValue(); + lowerSum += fullHouse.getValue(); + lowerSum += smallStraight.getValue(); + lowerSum += largeStraight.getValue(); + lowerSum += yahtzee.getValue(); + lowerSum += chance.getValue(); + + return lowerSum; + } + + private int calcUpperBonus(int upperSum){ + if (upperSum >= 63){ + upperSum += 35; + } + return upperSum; + } + + public boolean checkGameEnd(){ return (usedRows.size() + crossedRows.size()) == amountTurns; } diff --git a/domain/StarwarsSheet.java b/domain/StarwarsSheet.java new file mode 100644 index 0000000..04d6482 --- /dev/null +++ b/domain/StarwarsSheet.java @@ -0,0 +1,52 @@ +package domain; + +import domain.sheets.*; + +public class StarwarsSheet extends Sheet{ + //? Additional upper half + Sevens sevens; + Eights eights; + + //? Additional lower half + StarWarsDay starWarsDay; + R2D2 r2D2; + + public StarwarsSheet(){ + super(); + this.sevens = new Sevens(); + super.unusedRows.add(this.sevens.toString()); + + this.eights = new Eights(); + super.unusedRows.add(this.eights.toString()); + + this.starWarsDay = new StarWarsDay(); + super.unusedRows.add(this.starWarsDay.toString()); + + this.r2D2 = new R2D2(); + super.unusedRows.add(this.r2D2.toString()); + } + + + public void writeStarwarsCategory(Category categoryToWrite, boolean crossing){ + switch (categoryToWrite.toString()){ + case "Sevens": + sevens = (Sevens) categoryToWrite; + break; + case "Eights": + eights = (Eights) categoryToWrite; + break; + case "StarWarsDay": + starWarsDay = (StarWarsDay) categoryToWrite; + break; + case "R2D2": + r2D2 = (R2D2) categoryToWrite; + break; + default: + super.writeCategory(categoryToWrite, crossing); + break; + } + } + + + +} diff --git a/domain/sheets/Eights.java b/domain/sheets/Eights.java new file mode 100644 index 0000000..0f7a66f --- /dev/null +++ b/domain/sheets/Eights.java @@ -0,0 +1,10 @@ +package domain.sheets; + +public class Eights extends Category{ + + @Override + public int calcValueFromAmount() { + this.value = this.amount * 8; + return this.value; + } +} diff --git a/domain/sheets/R2D2.java b/domain/sheets/R2D2.java new file mode 100644 index 0000000..97503b6 --- /dev/null +++ b/domain/sheets/R2D2.java @@ -0,0 +1,5 @@ +package domain.sheets; + +public class R2D2 extends Category{ + //TODO +} diff --git a/domain/sheets/Sevens.java b/domain/sheets/Sevens.java new file mode 100644 index 0000000..4a31a1c --- /dev/null +++ b/domain/sheets/Sevens.java @@ -0,0 +1,10 @@ +package domain.sheets; + +public class Sevens extends Category{ + + @Override + public int calcValueFromAmount() { + this.value = this.amount * 7; + return this.value; + } +} diff --git a/domain/sheets/StarWarsDay.java b/domain/sheets/StarWarsDay.java new file mode 100644 index 0000000..4f6fe33 --- /dev/null +++ b/domain/sheets/StarWarsDay.java @@ -0,0 +1,6 @@ +package domain.sheets; + +public class StarWarsDay extends Category{ + + //TODO +} diff --git a/fassade/KniffelSystem.java b/fassade/KniffelSystem.java index fe4eeff..eabcb55 100644 --- a/fassade/KniffelSystem.java +++ b/fassade/KniffelSystem.java @@ -5,9 +5,13 @@ import domain.Player; import domain.Sheet; import domain.sheets.Category; +import java.io.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; public class KniffelSystem { + String lederboardLocation = "scores.csv"; ArrayList playerColors; ArrayList allValidCombinations = new ArrayList<>(); Game game; @@ -22,14 +26,18 @@ public class KniffelSystem { } - public String LeaderBaordData(){ - return "Leaderboard - TODO \n"; + public String setGamemode(String gamemode){ + return game.setGamemode(gamemode); + } + + private String getGamemode(){ + return game.getGamemode(); } public String addPlayer(int playerNumber, String name) { String playerColor = colorPicker(playerNumber); - Player playerToAdd = new Player(playerNumber, name, playerColor, 0); + Player playerToAdd = new Player(playerNumber, name, playerColor, 0, getGamemode()); game.addPlayer(playerToAdd); return changeStringFormat(name, playerColor); @@ -326,7 +334,11 @@ public class KniffelSystem { } if (contains){ - currentPlayerSheet.writeCategory(categoryToWrite, false); + if (getGamemode().equals("default")) { + currentPlayerSheet.writeCategory(categoryToWrite, false); + }else { + currentPlayerSheet.wr + } }else { currentPlayerSheet.writeCategory(categoryToWrite, true); } @@ -344,6 +356,81 @@ public class KniffelSystem { } + public String afterGame() throws IOException { + StringBuilder sb = new StringBuilder(); + + for (Player player : game.getPlayers()){ + int score = player.getSheet().calcSheet(); + player.setScore(score); + sb.append(String.format("%s scored %d points!", player.toString(), score)); + writeToFile(createLeaderboardString(player)); + } + + return sb.toString(); + } + + + private String createLeaderboardString(Player player){ + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyy"); + LocalDateTime now = LocalDateTime.now(); + + String date = dtf.format(now); + int score = player.getScore(); + String name = player.getName(); + + return String.format("%d - %s - %s \n", score, name, date); + } + + + public ArrayList readFromFile() throws FileNotFoundException { + ArrayList leaderboardRows = new ArrayList<>(); + Scanner fsc = null; + try { + fsc = new Scanner(new File(lederboardLocation)); + } catch (FileNotFoundException e) { + System.out.println("There is an error opening the leaderboard."); + System.out.println("Returning to main menu \n"); + return leaderboardRows; + } + + while (fsc.hasNextLine()){ + leaderboardRows.add(fsc.nextLine()); + } + return leaderboardRows; + } + + + public void writeToFile(String stringToEnter) throws IOException { + + if (stringToEnter.isEmpty()){ + BufferedWriter writer = new BufferedWriter(new FileWriter(lederboardLocation)); + writer.write(""); + return; + } + System.out.printf("Not empty |%s| \n", stringToEnter); + + ArrayList currentRows = readFromFile(); + + currentRows.add(stringToEnter); + + StringBuilder sb = new StringBuilder(); + for(String leaderboardRow : currentRows) { + System.out.println(leaderboardRow); + String[] row = leaderboardRow.split(","); + System.out.printf("len row: %d \n", row.length); + sb.append(String.format("%s - %s - %s \n", row[1], row[0], row[2])); + } + + BufferedWriter writer = new BufferedWriter(new FileWriter(lederboardLocation)); + writer.write(sb.toString()); + } + + + public void clearLeaderboard() throws IOException { + writeToFile(""); + } + + private HashMap createCategoryHashMap(){ // TODO starwars sheet implementieren Sheet sheet = new Sheet(); diff --git a/scores.csv b/scores.csv new file mode 100644 index 0000000..e69de29 diff --git a/tui/TUI.java b/tui/TUI.java index 14c7be2..b097ba7 100644 --- a/tui/TUI.java +++ b/tui/TUI.java @@ -3,6 +3,8 @@ package tui; import domain.Player; import fassade.KniffelSystem; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; @@ -10,21 +12,21 @@ public class TUI { static KniffelSystem gameSystem; static Scanner sc = new Scanner(System.in); - public static void main(String[] args) { + public static void main(String[] args) throws IOException { System.out.println("Welcome to the PR2 Kniffel game!"); -// while (true){ -// mainMenuOutput(); -// } + while (true){ + mainMenuOutput(); + } // DEV: - gameSystem = new KniffelSystem(); - gameSystem.creteDevPlayers(1); - gameLoop(); +// gameSystem = new KniffelSystem(); +// gameSystem.creteDevPlayers(1); +// gameLoop(); } - private static void mainMenuOutput(){ + 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"); @@ -48,9 +50,15 @@ public class TUI { } } - private static void mainMenuPlay(){ + 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(); @@ -68,9 +76,13 @@ public class TUI { } gameLoop(); - System.out.println("GAME END"); //! TEST afterGame(); } + private static void decideGamemode(String userInput){ + System.out.println(gameSystem.setGamemode(userInput)); + System.out.println(); + } + private static void gameLoop(){ String[] playerStrings = gameSystem.getAllPlayerStrings(); @@ -155,18 +167,56 @@ public class TUI { } - private static void afterGame(){ - //TODO sheet berechnen, gewinner entscheiden + private static void afterGame() throws IOException { + System.out.println(gameSystem.afterGame()); } - private static void mainMenuLeaderBoard(){ + private static void mainMenuLeaderBoard() throws IOException { gameSystem = new KniffelSystem(); // Scorboard System - System.out.println(gameSystem.LeaderBaordData()); // TODO + + 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(){ + + 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();