From 556ae98e3ba86204dd85b2a77e4c6d2c3bb60892 Mon Sep 17 00:00:00 2001 From: maxlm128 Date: Fri, 25 Mar 2022 19:06:43 +0100 Subject: [PATCH] ZU VIEL gemacht Mein Brain ist kaputt --- Game.java | 141 +++++++++++++++++++++++++++------------------- Query.java | 96 ++++++++++++++++++++----------- User.java | 34 +++++------ WordleServer.java | 63 +++++++++++++++------ wordle.db | Bin 73728 -> 77824 bytes 5 files changed, 205 insertions(+), 129 deletions(-) diff --git a/Game.java b/Game.java index 232a472..4d83148 100644 --- a/Game.java +++ b/Game.java @@ -1,15 +1,15 @@ public class Game { private String word; private String[] guesses; + private int guessCount; // 0 wenn es keinen Wert gibt, 1 wenn das letzte Spiel gewonnen wurde und 2 wenn // es verloren wurde private int won; - // TODO: Game() { word = ""; won = 0; - guesses = new String[4]; + guesses = new String[5]; } /** @@ -23,106 +23,131 @@ public class Game { * @return Eine Zahlenfolge mit der Korrektheit des Worts */ public String giveGuess(String g) { - StringBuilder guess = new StringBuilder(g); - StringBuilder word = new StringBuilder(this.word); + String[] guess = transformToArray(g); + String[] word = transformToArray(this.word); String s = ""; - for (int i = 0; i < this.word.length(); i++) { - if (guess.charAt(0) == word.charAt(0)) { - word.deleteCharAt(0); - s += "2"; - } else { - boolean found = false; - for (int r = 1; r < word.length(); r++) { - if (guess.charAt(0) == word.charAt(r)) { - s += "1"; - found = true; - word.deleteCharAt(r); - break; + if (word.length == 5 && guess.length == 5) { + for (int i = 0; i < this.word.length(); i++) { + if (guess[i].equalsIgnoreCase(word[i])) { + word[i] = null; + s += "2"; + } else { + boolean found = false; + for (int r = 0; r < word.length; r++) { + if (guess[i].equalsIgnoreCase(word[r]) && (guess[r] == null || !guess[r].equals(word[r]))) { + s += "1"; + found = true; + word[r] = null; + break; + } + } + if (!found) { + s += "0"; } } - if (!found) { - s += "0"; - } + guess[i] = null; + } + guessCount++; + storeInArray(g); + if (s.contains("22222")) { + won = 1; + stopGame(); + } else if (guessCount >= 6) { + won = 2; + stopGame(); } - guess.deleteCharAt(0); - } - if (word.isEmpty()) { - won = 1; - stopGame(); - } else if (storeInArray(guess.toString())) { - won = 2; - stopGame(); } return s; } - + + private String[] transformToArray(String s) { + String[] temp = new String[s.length()]; + for (int i = 0; i < s.length(); i++) { + temp[i] = "" + s.charAt(i); + } + return temp; + } + public String checkGuess(String g) { - StringBuilder guess = new StringBuilder(g); - StringBuilder word = new StringBuilder(this.word); + String[] guess = transformToArray(g); + String[] word = transformToArray(this.word); String s = ""; - for (int i = 0; i < this.word.length(); i++) { - if (guess.charAt(0) == word.charAt(0)) { - word.deleteCharAt(0); - s += "2"; - } else { - boolean found = false; - for (int r = 1; r < word.length(); r++) { - if (guess.charAt(0) == word.charAt(r)) { - s += "1"; - found = true; - word.deleteCharAt(r); - break; + if (word.length == 5 && guess.length == 5) { + for (int i = 0; i < this.word.length(); i++) { + if (guess[i].equalsIgnoreCase(word[i])) { + word[i] = null; + s += "2"; + } else { + boolean found = false; + for (int r = 0; r < word.length; r++) { + if (guess[i].equalsIgnoreCase(word[r]) && (guess[r] == null || !guess[r].equals(word[r]))) { + s += "1"; + found = true; + word[r] = null; + break; + } + } + if (!found) { + s += "0"; } } - if (!found) { - s += "0"; - } + guess[i] = null; } - guess.deleteCharAt(0); } return s; } /** * Speichert das Wort in der nächsten freien Stelle im Array und gibt danach - * zurück, ob das Array voll ist + * zurück, ob das Array voll ist, d.h. das Spiel beendet werden muss * * @param word * @return Boolean */ - private boolean storeInArray(String word) { + private void storeInArray(String word) { for (int i = 0; i < guesses.length; i++) { if (guesses[i] == null) { guesses[i] = word; - return false; + break; } } - return true; } public void startGame(String word) { + System.out.println(word); + guessCount = 0; this.word = word; } - public boolean isGameRunning() { - return !word.equals("") || !word.equals(null); - } - public void stopGame() { word = ""; - guesses = new String[guesses.length - 1]; + guesses = new String[guesses.length]; } public String[] getGuesses() { return guesses; } - public void setGuesses(String[] guesses) { - this.guesses = guesses; + public String getGuessIndex(int index) { + return guesses[index]; + } + + public void setGuessesIndex(String guess, int index) { + guesses[index] = guess; } public void setWord(String word) { - this.word = word; + if (word != null) { + this.word = word; + } + } + + public String getWord() { + return word; + } + + public int getGuessesCount() { + return guessCount; } /** diff --git a/Query.java b/Query.java index ded86a6..5f303bb 100644 --- a/Query.java +++ b/Query.java @@ -1,3 +1,7 @@ +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Random; + public class Query { DatabaseConnector db; @@ -12,24 +16,36 @@ public class Query { */ public void pullStats(User user) { String[][] r; - db.executeStatement("SELECT * FROM user WHERE user LIKE '"+ 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(); - user.setCurrentStreak(Integer.parseInt(r[1][0])); - user.setMaxStreak(Integer.parseInt(r[2][0])); - user.setWins(Integer.parseInt(r[3][0])); - user.setTimesPlayed(Integer.parseInt(r[4][0])); + if (r != null && r.length != 0 && r[0].length == 21) { + user.setCurrentStreak(Integer.parseInt(r[0][2])); + user.setMaxStreak(Integer.parseInt(r[0][3])); + user.setWinPercentage(Float.parseFloat(r[0][4])); + user.setTimesPlayed(Integer.parseInt(r[0][5])); + user.setLastDayWOTDPlayed(Integer.parseInt(r[0][6])); - int wonInTurn[] = new int[6]; - wonInTurn[0] = Integer.parseInt(r[5][0]); - wonInTurn[1] = Integer.parseInt(r[6][0]); - wonInTurn[2] = Integer.parseInt(r[7][0]); - wonInTurn[3] = Integer.parseInt(r[8][0]); - wonInTurn[4] = Integer.parseInt(r[9][0]); - wonInTurn[5] = Integer.parseInt(r[10][0]); - user.setWonInTurn(wonInTurn); - - user.setLastDayWOTDPlayed(Integer.parseInt(r[11][0])); + for (int i = 0; i < 6; i++) { + try { + user.setWonInTurnIndex(Integer.parseInt(r[0][8 + i]), i); + } catch (NumberFormatException e) { + user.setWonInTurnIndex(0, i); + } + } + 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().setWord(r[0][20]); + } else { + System.out.println("Fehler beim Abfragen der Daten für den User " + user.getUsername()); + } } /** @@ -38,16 +54,22 @@ public class Query { * @param user */ public void pushStats(User user) { -// TODO: Testen und vllt korrigieren - db.executeStatement("UPDATE INTO Stats (current_streak," + " max_streak, " + "wins, " + "times_played, " - + "won_on_1, " + "won_on_2, " + "won_on_3, " + "won_on_4, " + "won_on_5, " + "won_on_6, " - + "last_day_WOTD_finished) " + "VALUES (" + Integer.toString(user.getCurrentStreak()) - + Integer.toString(user.getMaxStreak()) + Integer.toString(user.getWins()) - + Integer.toString(user.getTimesPlayed()) + Integer.toString(user.getWonInTurnIndex(0)) - + Integer.toString(user.getWonInTurnIndex(1)) + Integer.toString(user.getWonInTurnIndex(2)) - + Integer.toString(user.getWonInTurnIndex(3)) + Integer.toString(user.getWonInTurnIndex(4)) - + Integer.toString(user.getWonInTurnIndex(5)) + Integer.toString(user.getLastDayWOTDPlayed()) + ")" - + "WHERE user_username LIKE \"" + user.getUsername() + "\""); + db.executeStatement("UPDATE Stats SET current_streak = " + user.getCurrentStreak() + ", max_streak = " + + user.getMaxStreak() + ", win_percentage = " + user.getWinPercentage() + ", times_played = " + + user.getTimesPlayed() + ", last_day_WOTD_finished = " + user.getLastDayWOTDPlayed() + + " WHERE user_username LIKE '" + user.getUsername() + "'"); + db.executeStatement("UPDATE won_on_n SET won_on_1 = " + user.getWonInTurnIndex(0) + ", won_on_2 = " + + user.getWonInTurnIndex(1) + ", won_on_3 = " + user.getWonInTurnIndex(2) + ", won_on_4 = " + + user.getWonInTurnIndex(3) + ", won_on_5 = " + user.getWonInTurnIndex(4) + ", won_on_6 = " + + 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() + + "')"); } /** @@ -63,7 +85,6 @@ public class Query { db.executeStatement("SELECT 1 FROM user WHERE username LIKE \"" + username + "\" " + "AND passwort LIKE \"" + password + "\""); QueryResult r = db.getCurrentQueryResult(); - System.out.println(db.getErrorMessage()); if (r != null && r.getRowCount() == 1) { return true; } else { @@ -77,19 +98,27 @@ public class Query { * @return Ein Word als String */ public String getWord() { -// TODO: Methode fertigstellen - return "12345"; + db.executeStatement("SELECT word FROM words ORDER BY random() LIMIT 1"); + String[][] s = db.getCurrentQueryResult().getData(); + return s[0][0]; } /** * Gibt das Wordle des Tages, welches aus der Datenbank stammt, zur�ck. Ergibt - * pro Tag immer das gleiche Wordle. + * pro Tag immer das gleiche Wordle, aber trotzdem für jeden neuen Tag ein anderes Wort * * @return Das Wort als String */ public String getWOTD() { -// TODO: Methode fertigstellen - return "abcde"; + db.executeStatement("SELECT COUNT(*) FROM words"); + 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())); + int randNumber = random.nextInt() % words; + db.executeStatement("SELECT word FROM words WHERE ID LIKE '" + randNumber + "'"); + r = db.getCurrentQueryResult().getData(); + return r[0][0]; } /** @@ -99,7 +128,8 @@ public class Query { * @return Boolean */ public boolean checkWord(String word) { -// TODO: Methode fertigstellen - return true; + db.executeStatement("SELECT 1 FROM words WHERE word LIKE '" + word + "'"); + String[][] r = db.getCurrentQueryResult().getData(); + return r.length != 0; } } diff --git a/User.java b/User.java index 1d2d40a..1fdd812 100644 --- a/User.java +++ b/User.java @@ -6,18 +6,18 @@ public class User { private String username; private String password; private int timesPlayed; - private int winPercentage; + private float winPercentage; private int currentStreak; private int maxStreak; private int lastDayWOTDPlayed; private int state; - private int wins; private int[] wonInTurn; private Game game; public User(String pConnectionID) { connectionID = pConnectionID; game = new Game(); + wonInTurn = new int[6]; } public Game getGame() { @@ -48,11 +48,7 @@ public class User { return state; } - public void setWins(int wins) { - this.wins = wins; - } - - public int getWinPercentage() { + public float getWinPercentage() { return winPercentage; } @@ -72,10 +68,6 @@ public class User { return username; } - public int getWins() { - return wins; - } - public void setConnectionID(String connectionID) { this.connectionID = connectionID; } @@ -108,29 +100,29 @@ public class User { this.username = username; } - public void setWinPercentage(int winPercentage) { + public void setWinPercentage(float winPercentage) { this.winPercentage = winPercentage; } - public void setWonInTurnIndex(int index, int content) { - this.wonInTurn[index] = content; + public void setWonInTurnIndex(int content, int index) { + wonInTurn[index] = content; } - public void setWonInTurn(int[] wonInTurn) { - this.wonInTurn = wonInTurn; + public void increaseWonInTurnIndex(int index) { + wonInTurn[index]++; } public boolean loggedIn() { - return password != null && username != null; + if (password != null && username != null) { + return (!password.equals("") && !username.equals("")); + } else { + return false; + } } public String[] getLastGuesses() { return game.getGuesses(); } - - public void setLastGuesses(String[] guesses) { - game.setGuesses(guesses); - } public void setLastDayWOTDPlayed(int time) { lastDayWOTDPlayed = time; diff --git a/WordleServer.java b/WordleServer.java index 27e9e00..0ae44d1 100644 --- a/WordleServer.java +++ b/WordleServer.java @@ -1,4 +1,3 @@ -import java.time.Instant; import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.HashMap; @@ -63,11 +62,11 @@ public class WordleServer extends Server { switch (u.getState()) { case 1: // Anmeldephase - if (m.equalsIgnoreCase("USER")) { + if (m.equalsIgnoreCase("USER") && !u.loggedIn()) { m = pMessage.substring(5, pMessage.length()); u.setUsername(m); send(pClientIP, pClientPort, "+OK"); - } else if (m.equalsIgnoreCase("PASS")) { + } else if (m.equalsIgnoreCase("PASS") && !u.loggedIn()) { m = pMessage.substring(5, pMessage.length()); u.setPassword(m); if (u.getPassword() != null && u.getUsername() != null) { @@ -93,6 +92,14 @@ public class WordleServer extends Server { } else { 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"); + } else { + send(pClientIP, pClientPort, "-ERR wotd not finished"); + } } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } @@ -110,12 +117,15 @@ public class WordleServer extends Server { break; case (2): a += " game won"; + u.increaseWonInTurnIndex(u.getGame().getGuessesCount() - 1); u.setState(3); break; case (3): a += " game lost"; u.setState(3); break; + default: + a += " what"; } send(pClientIP, pClientPort, a); } else { @@ -125,27 +135,35 @@ public class WordleServer extends Server { send(pClientIP, pClientPort, "-ERR wrong format"); } } else if (m.equalsIgnoreCase("INFO")) { + bruh(); String substring = "0"; - if (m.length() > 4) { - substring += pMessage.substring(5, pMessage.length()).replaceAll(" ", ""); + if (pMessage.length() > 4) { + substring += pMessage.substring(4, pMessage.length()).replaceAll(" ", ""); } int n = Integer.parseInt("0" + substring); String[] guesses = u.getGame().getGuesses(); if (6 >= n && n >= 1) { - String guess = guesses[n]; - send(pClientIP, pClientPort, "+OK " + guess + " " + u.getGame().checkGuess(guess)); + //TODO: + if (guesses[n - 1] != null) { + String guess = guesses[n - 1]; + send(pClientIP, pClientPort, "+OK " + guess + " " + u.getGame().checkGuess(guess)); + } else { + send(pClientIP, pClientPort, "-ERR word not typed yet"); + } } else if (n == 0) { String a = "+OK "; - for (int i = 0; i < 6; i++) { - if (guesses[i] == null) { - a += guesses[i] + " " + u.getGame().checkGuess(guesses[i]); + for (int i = 0; i < 5; i++) { + if (guesses[i] != null) { + a += " " + guesses[i] + " " + u.getGame().checkGuess(guesses[i]); } } send(pClientIP, pClientPort, a); } } else if (m.equalsIgnoreCase("EXIT")) { + u.updateLastDayWOTDPlayed(); u.getGame().stopGame(); u.setState(3); + send(pClientIP, pClientPort, "+OK"); } else { send(pClientIP, pClientPort, "-ERR Command not valid in this state"); } @@ -154,13 +172,13 @@ public class WordleServer extends Server { // 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(1) + '\n' + "won in 2 turn: " + u.getWonInTurnIndex(2) + '\n' - + "won in 3 turn: " + u.getWonInTurnIndex(3) + '\n' + "won in 4 turn: " - + u.getWonInTurnIndex(4) + '\n' + "won in 5 turn: " + u.getWonInTurnIndex(5) + '\n' - + "won in 6 turn: " + u.getWonInTurnIndex(6) + '\n' + "."); + "+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" + "."); } else if (m.equalsIgnoreCase("PLAY")) { if (isToday(u.getLastDayWOTDPlayed()) && u.getGame().getGameStatus() != 1) { u.getGame().startGame(query.getWord()); @@ -178,7 +196,18 @@ public class WordleServer extends Server { } + /** + * Gibt zurück ob es sich bei dem im Parameter angegebenen Tag um den heutigen + * handelt + * + * @param pDay ,die Anzahl der Tage seit dem Epoch-Day + * @return true oder false + */ public boolean isToday(int pDay) { return pDay == (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now()); } + + public void bruh() { + + } } diff --git a/wordle.db b/wordle.db index 501be6e00a69cc2d3f67942355f43b81e96edee3..bd3062a6d6b54ba8f1915a9c50150200db5faf08 100644 GIT binary patch delta 696 zcmZoTz|!!5WrDPzG6MsHFcdQb>A;CP#+u3udj7S%9ETaW*-ta@UEmGmQ{es1ewynj zcNo_c&SuUCPF-$c5ZpMCo6VHtFe4C|itFn$wg{IbCgr3S7v?0zm!#$v#DlrHo zli#w*F&a(&z|kleUyxdqoSIjXn4YS{8RY8dGr5{GX!2?HA6#5N7_v0=*~D$dCqLwr z5DYF!EGdpR1XF^Xz6=tRAM%JWIT}sA&!fnuX$(_0IfI9f)dRVzksabwpbvO~T!uSXJkAdk z-w5=$*5-3OX3T7i{9hUPzit*3c+Jnv$;iRL!NI}L!C|mSp@D}B7@ds#e;9y>38>&b z|K#86Ie{9!G4Ou_^55`_aR4=Vo?TWW=>9s3Evs`fe2_fA6Ty>2eUXQ*aE0~n1Hk( N5QB6+=jVh=0{}i-zNP>G delta 579 zcmZp8z|wGlWrDPz3#n= zoYZ&|p2;WJa0GVhF zwpkly^W?`|qFjw7O6=mYvW(5vlM}c_83iVnad%A?;t`t6&tomcvw$JmTa}R^GcP5z z0%&ArNosszX-U4LI>?^MyZA+zc{LR$>vL)`Dga3(Zo}Y`#FAou-b)M(lOOVEZ9d0i z#>~VZuvu`yYyOD={EHMCc);FgU|