diff --git a/Game.java b/Game.java index 4d83148..7b96f4c 100644 --- a/Game.java +++ b/Game.java @@ -2,11 +2,13 @@ public class Game { private String word; private String[] guesses; private int guessCount; + private int isWOTD; // 0 wenn es keinen Wert gibt, 1 wenn das letzte Spiel gewonnen wurde und 2 wenn // es verloren wurde private int won; Game() { + isWOTD = 0; word = ""; won = 0; guesses = new String[5]; @@ -113,7 +115,8 @@ public class Game { } } - public void startGame(String word) { + public void startGame(String word, int isWOTD) { + this.isWOTD = isWOTD; System.out.println(word); guessCount = 0; this.word = word; @@ -129,21 +132,47 @@ public class Game { } public String getGuessIndex(int index) { - return guesses[index]; + if (guesses[index] != null) { + return "'" + guesses[index] + "'"; + } + return null; + } + + public int getIsWOTD() { + return isWOTD; } public void setGuessesIndex(String guess, int index) { guesses[index] = guess; } + public void updateGuessCount() { + int r = 0; + for (int i = 0; i < guesses.length; i++) { + if (guesses[i] != null) { + r++; + } else { + guessCount = r; + } + } + guessCount = r; + } + public void setWord(String word) { if (word != null) { this.word = word; } } + public void setIsWOTD(int isWOTD) { + this.isWOTD = isWOTD; + } + public String getWord() { - return word; + if (word.equals("")) { + return null; + } + return "'" + word + "'"; } public int getGuessesCount() { diff --git a/Query.java b/Query.java index 5f303bb..9297108 100644 --- a/Query.java +++ b/Query.java @@ -16,11 +16,11 @@ public class Query { */ public void pullStats(User user) { String[][] r; - db.executeStatement("SELECT * FROM Stats " + "INNER JOIN won_on_n " + "ON Stats.ID = won_on_n.Stats_ID " - + "INNER JOIN last_Game " + "ON Stats.ID = last_Game.Stats_ID " + "WHERE user_username = '" - + user.getUsername() + "'"); + db.executeStatement("SELECT * FROM Stats INNER JOIN won_on_n ON Stats.ID = won_on_n.Stats_ID " + + "INNER JOIN last_Game ON Stats.ID = last_Game.Stats_ID WHERE user_username = '" + user.getUsername() + + "'"); r = db.getCurrentQueryResult().getData(); - if (r != null && r.length != 0 && r[0].length == 21) { + if (r != null && r.length != 0 && r[0].length == 22) { user.setCurrentStreak(Integer.parseInt(r[0][2])); user.setMaxStreak(Integer.parseInt(r[0][3])); user.setWinPercentage(Float.parseFloat(r[0][4])); @@ -36,13 +36,15 @@ public class Query { } for (int i = 0; i < 5; i++) { - try { - user.setWonInTurnIndex(Integer.parseInt(r[0][8 + i]), i); - } catch (NumberFormatException e) { - user.getGame().setGuessesIndex(r[0][15 + i], i); - } + user.getGame().setGuessesIndex(r[0][15 + i], i); } user.getGame().setWord(r[0][20]); + + try { + user.getGame().setIsWOTD(Integer.parseInt(r[0][21])); + } catch (NumberFormatException e) { + user.getGame().setIsWOTD(0); + } } else { System.out.println("Fehler beim Abfragen der Daten für den User " + user.getUsername()); } @@ -64,12 +66,12 @@ public class Query { + user.getWonInTurnIndex(5) + " WHERE Stats_ID IN( SELECT user_username FROM Stats WHERE user_username LIKE '" + user.getUsername() + "')"); - db.executeStatement("UPDATE last_Game SET last_guess_1 = " + user.getGame().getGuessIndex(0) + ", last_guess_2 = " - + user.getGame().getGuessIndex(1) + ", last_guess_3 = " + user.getGame().getGuessIndex(2) - + ", last_guess_4 = " + user.getGame().getGuessIndex(3) + ", last_guess_5 = " - + user.getGame().getGuessIndex(4) + ", word = " + user.getGame().getWord() - + " WHERE Stats_ID IN( SELECT user_username FROM Stats WHERE user_username LIKE '" + user.getUsername() - + "')"); + db.executeStatement("UPDATE last_Game SET last_guess_1 = " + user.getGame().getGuessIndex(0) + + ", last_guess_2 = " + user.getGame().getGuessIndex(1) + ", last_guess_3 = " + + user.getGame().getGuessIndex(2) + ", last_guess_4 = " + user.getGame().getGuessIndex(3) + + ", last_guess_5 = " + user.getGame().getGuessIndex(4) + ", word = " + user.getGame().getWord() + + ", isWOTD = " + user.getGame().getIsWOTD() + + " WHERE Stats_ID IN( SELECT ID FROM Stats WHERE user_username LIKE '" + user.getUsername() + "')"); } /** @@ -105,13 +107,14 @@ public class Query { /** * Gibt das Wordle des Tages, welches aus der Datenbank stammt, zur�ck. Ergibt - * pro Tag immer das gleiche Wordle, aber trotzdem für jeden neuen Tag ein anderes Wort + * pro Tag immer das gleiche Wordle, aber trotzdem für jeden neuen Tag ein + * anderes Wort * * @return Das Wort als String */ public String getWOTD() { db.executeStatement("SELECT COUNT(*) FROM words"); - String [][] r = db.getCurrentQueryResult().getData(); + String[][] r = db.getCurrentQueryResult().getData(); int words = Integer.parseInt(r[0][0]); Random random = new Random(); random.setSeed((int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now())); diff --git a/User.java b/User.java index 1fdd812..91a08cb 100644 --- a/User.java +++ b/User.java @@ -74,16 +74,31 @@ public class User { public void setCurrentStreak(int currentStreak) { this.currentStreak = currentStreak; - } - - public void updateLastDayWOTDPlayed() { - lastDayWOTDPlayed = (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now()); + if (maxStreak < currentStreak) { + maxStreak = currentStreak; + } } public void setMaxStreak(int maxStreak) { this.maxStreak = maxStreak; } + private int getTotalWins() { + int w = 0; + for (int i = 0; i < wonInTurn.length; i++) { + w += wonInTurn[i]; + } + return w; + } + + public void updateWinPercentage() { + winPercentage = (int) (getTotalWins() / timesPlayed) * 100; + } + + public void updateLastDayWOTDPlayed() { + lastDayWOTDPlayed = (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now()); + } + public void setPassword(String password) { this.password = password; } diff --git a/WordleServer.java b/WordleServer.java index 0ae44d1..c9e6a9a 100644 --- a/WordleServer.java +++ b/WordleServer.java @@ -50,6 +50,7 @@ public class WordleServer extends Server { String connectionID = pClientIP + ":" + Integer.toString(pClientPort); User u = users.get(connectionID); u.setConnectionID(connectionID); + u.getGame().updateGuessCount(); if (pMessage.length() < 4) { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } else { @@ -57,7 +58,7 @@ public class WordleServer extends Server { System.out.println("Message: " + m + " State: " + u.getState()); if (pMessage.equalsIgnoreCase("QUIT")) { send(pClientIP, pClientPort, "+OK Bye"); - close(); + closeConnection(pClientIP, pClientPort); } switch (u.getState()) { case 1: @@ -82,10 +83,10 @@ public class WordleServer extends Server { } else if (m.equalsIgnoreCase("WOTD")) { if (!isToday(u.getLastDayWOTDPlayed())) { send(pClientIP, pClientPort, "+OK game ready"); - u.getGame().startGame(query.getWOTD()); + u.getGame().startGame(query.getWOTD(), 1); u.setState(2); u.updateLastDayWOTDPlayed(); - } else if (u.getGame().getGameStatus() == 1) { + } else if (u.getGame().getGameStatus() == 1 && u.getGame().getIsWOTD() == 1) { send(pClientIP, pClientPort, "+OK Game continues"); u.setState(2); u.updateLastDayWOTDPlayed(); @@ -93,10 +94,15 @@ public class WordleServer extends Server { send(pClientIP, pClientPort, "-ERR game finished"); } } else if (m.equalsIgnoreCase("PLAY")) { - if (isToday(u.getLastDayWOTDPlayed()) && u.getGame().getGameStatus() != 1) { - u.getGame().startGame(query.getWord()); - u.setState(2); - send(pClientIP, pClientPort, "+OK Game ready"); + if (isToday(u.getLastDayWOTDPlayed())) { + if (u.getGame().getGameStatus() != 1) { + u.getGame().startGame(query.getWord(), 0); + u.setState(2); + send(pClientIP, pClientPort, "+OK Game ready"); + } else if (u.getGame().getIsWOTD() == 0) { + u.setState(2); + send(pClientIP, pClientPort, "+OK Game continues"); + } } else { send(pClientIP, pClientPort, "-ERR wotd not finished"); } @@ -118,14 +124,18 @@ public class WordleServer extends Server { case (2): a += " game won"; u.increaseWonInTurnIndex(u.getGame().getGuessesCount() - 1); + u.setCurrentStreak(u.getCurrentStreak() + 1); + u.setTimesPlayed(u.getTimesPlayed() + 1); + u.updateWinPercentage(); u.setState(3); break; case (3): a += " game lost"; + u.setTimesPlayed(u.getTimesPlayed() + 1); + u.setCurrentStreak(0); + u.updateWinPercentage(); u.setState(3); break; - default: - a += " what"; } send(pClientIP, pClientPort, a); } else { @@ -143,7 +153,6 @@ public class WordleServer extends Server { int n = Integer.parseInt("0" + substring); String[] guesses = u.getGame().getGuesses(); if (6 >= n && n >= 1) { - //TODO: if (guesses[n - 1] != null) { String guess = guesses[n - 1]; send(pClientIP, pClientPort, "+OK " + guess + " " + u.getGame().checkGuess(guess)); @@ -151,13 +160,13 @@ public class WordleServer extends Server { send(pClientIP, pClientPort, "-ERR word not typed yet"); } } else if (n == 0) { - String a = "+OK "; + String a = "+OK"; for (int i = 0; i < 5; i++) { if (guesses[i] != null) { - a += " " + guesses[i] + " " + u.getGame().checkGuess(guesses[i]); + send(pClientIP, pClientPort, guesses[i] + " " + u.getGame().checkGuess(guesses[i])); } } - send(pClientIP, pClientPort, a); + send(pClientIP, pClientPort, "."); } } else if (m.equalsIgnoreCase("EXIT")) { u.updateLastDayWOTDPlayed(); @@ -171,19 +180,28 @@ public class WordleServer extends Server { case 3: // Zwischenphase(Angemeldet) if (m.equalsIgnoreCase("STAT")) { - send(pClientIP, pClientPort, - "+OK" + '\n' + "times played: " + u.getTimesPlayed() + "\n" + "win percentage: " - + u.getWinPercentage() + "\n" + "current streak: " + u.getCurrentStreak() + "\n" - + "max streak: " + u.getMaxStreak() + "\n" + "won in 1 turn: " - + u.getWonInTurnIndex(0) + "\n" + "won in 2 turn: " + u.getWonInTurnIndex(1) + "\n" - + "won in 3 turn: " + u.getWonInTurnIndex(2) + "\n" + "won in 4 turn: " - + u.getWonInTurnIndex(3) + "\n" + "won in 5 turn: " + u.getWonInTurnIndex(4) + "\n" - + "won in 6 turn: " + u.getWonInTurnIndex(5) + "\n" + "."); + send(pClientIP, pClientPort, "+OK"); + send(pClientIP, pClientPort, "times played: " + u.getTimesPlayed()); + send(pClientIP, pClientPort, "times played: " + u.getTimesPlayed()); + send(pClientIP, pClientPort, "win percentage: " + u.getWinPercentage()); + send(pClientIP, pClientPort, "current streak: " + u.getCurrentStreak()); + send(pClientIP, pClientPort, "max streak: " + u.getMaxStreak()); + send(pClientIP, pClientPort, "won in 1 turn: " + u.getWonInTurnIndex(0)); + send(pClientIP, pClientPort, "won in 2 turn: " + u.getWonInTurnIndex(1)); + send(pClientIP, pClientPort, "won in 3 turn: " + u.getWonInTurnIndex(2)); + send(pClientIP, pClientPort, "won in 4 turn: " + u.getWonInTurnIndex(3)); + send(pClientIP, pClientPort, "won in 5 turn: " + u.getWonInTurnIndex(4)); + send(pClientIP, pClientPort, "won in 6 turn: " + u.getWonInTurnIndex(5)); } else if (m.equalsIgnoreCase("PLAY")) { - if (isToday(u.getLastDayWOTDPlayed()) && u.getGame().getGameStatus() != 1) { - u.getGame().startGame(query.getWord()); - u.setState(2); - send(pClientIP, pClientPort, "+OK Game ready"); + if (isToday(u.getLastDayWOTDPlayed())) { + if (u.getGame().getGameStatus() != 1) { + u.getGame().startGame(query.getWord(), 0); + u.setState(2); + send(pClientIP, pClientPort, "+OK Game ready"); + } else if (u.getGame().getIsWOTD() == 0) { + u.setState(2); + send(pClientIP, pClientPort, "+OK Game continues"); + } } else { send(pClientIP, pClientPort, "-ERR wotd not finished"); }