Viel hinzugefügt

-Datenbank-Tabellen hinzugefügt (zum letzten Wordle-game und won_on_turn_n Tabelle)
-Ifception fortgesetzt, das geben eines guesses funktioniert nun
-give guess gefixt
This commit is contained in:
2022-03-23 21:01:11 +01:00
parent 81e54b9d39
commit 2c14b051df
5 changed files with 242 additions and 173 deletions

View File

@@ -1,13 +1,15 @@
public class Game { public class Game {
private String word; private String word;
private String[] guesses; private String[] guesses;
private boolean won; // 0 wenn es keinen Wert gibt, 1 wenn das letzte Spiel gewonnen wurde und 2 wenn
// es verloren wurde
private int won;
// TODO: // TODO:
Game() { Game() {
word = ""; word = "";
won = false; won = 0;
guesses = new String[5]; guesses = new String[4];
} }
/** /**
@@ -20,18 +22,18 @@ public class Game {
* @param guess ,der String mit dem Wort * @param guess ,der String mit dem Wort
* @return Eine Zahlenfolge mit der Korrektheit des Worts * @return Eine Zahlenfolge mit der Korrektheit des Worts
*/ */
public String giveGuess(String guess) { public String giveGuess(String g) {
StringBuilder g = new StringBuilder(guess); StringBuilder guess = new StringBuilder(g);
StringBuilder word = new StringBuilder(this.word); StringBuilder word = new StringBuilder(this.word);
String s = ""; String s = "";
for (int i = 0; i < word.length(); i++) { for (int i = 0; i < this.word.length(); i++) {
if (g.charAt(0) == word.charAt(0)) { if (guess.charAt(0) == word.charAt(0)) {
word.deleteCharAt(0); word.deleteCharAt(0);
s += "2"; s += "2";
} else { } else {
boolean found = false; boolean found = false;
for (int r = 1; r < word.length(); r++) { for (int r = 1; r < word.length(); r++) {
if (g.charAt(0) == word.charAt(r)) { if (guess.charAt(0) == word.charAt(r)) {
s += "1"; s += "1";
found = true; found = true;
word.deleteCharAt(r); word.deleteCharAt(r);
@@ -42,17 +44,22 @@ public class Game {
s += "0"; s += "0";
} }
} }
g.deleteCharAt(0); guess.deleteCharAt(0);
} }
if(storeInArray(g.toString())) { if (word.isEmpty()) {
System.out.println("öasdlkihg");
won = 1;
stopGame();
} else if (storeInArray(guess.toString())) {
won = 2;
stopGame(); stopGame();
won = !word.isEmpty();
} }
return s; return s;
} }
/** /**
* Speichert das Wort in der nächsten freien Stelle im Array und gibt danach zurück, ob das Array voll ist * Speichert das Wort in der nächsten freien Stelle im Array und gibt danach
* zurück, ob das Array voll ist
* *
* @param word * @param word
* @return Boolean * @return Boolean
@@ -61,7 +68,7 @@ public class Game {
for (int i = 0; i < guesses.length; i++) { for (int i = 0; i < guesses.length; i++) {
if (guesses[i] == null) { if (guesses[i] == null) {
guesses[i] = word; guesses[i] = word;
return i == guesses.length - 1; return false;
} }
} }
return true; return true;
@@ -75,11 +82,39 @@ public class Game {
return !word.equals("") || !word.equals(null); return !word.equals("") || !word.equals(null);
} }
public boolean won() {
return won;
}
private void stopGame() { private void stopGame() {
word = ""; word = "";
guesses = new String[guesses.length - 1];
}
public String[] getGuesses() {
return guesses;
}
public void setGuesses(String[] guesses) {
this.guesses = guesses;
}
public void setWord(String word) {
this.word = word;
}
/**
* Gibt 0 zurück wenn das Spiel nicht läuft und noch kein Spiel gespielt wurde
* seitdem das Objekt existiert. Gibt 1 zurück wenn das Spiel läuft. Gibt 2
* zurück wenn das letzte beendete Spiel gewonnen wurde und kein Spiel läuft.
* Gibt 3 zurück wenn das letzte beendete Spiel verloren wurde und kein Spiel
* läuft.
*
* @return Eine Zahl von 0 bis 3
*/
public int getGameStatus() {
if (word.equals("") && won == 0) {
return 0;
}
if (!word.equals("")) {
return 1;
}
return won + 1;
} }
} }

View File

@@ -4,10 +4,12 @@ public class Query {
Query() { Query() {
db = new DatabaseConnector("", 0, "wordle.db", "", ""); db = new DatabaseConnector("", 0, "wordle.db", "", "");
} }
/**
* Speichert die Daten des Users aus der Datenbank auf dem User-Objekt /**
* @param user * Speichert die Daten des Users aus der Datenbank auf dem User-Objekt
*/ *
* @param user
*/
public void pullStats(User user) { public void pullStats(User user) {
String[][] r; String[][] r;
db.executeStatement("SELECT * FROM user WHERE user LIKE" + user.getUsername()); db.executeStatement("SELECT * FROM user WHERE user LIKE" + user.getUsername());
@@ -26,59 +28,64 @@ public class Query {
wonInTurn[5] = Integer.parseInt(r[10][0]); wonInTurn[5] = Integer.parseInt(r[10][0]);
user.setWonInTurn(wonInTurn); user.setWonInTurn(wonInTurn);
user.setLastDayWOTDFinished(Integer.parseInt(r[11][0])); user.setLastDayWOTDPlayed(Integer.parseInt(r[11][0]));
} }
/**
* Pusht die Daten des Users im Parameter auf die Datenbank /**
* @param user * Pusht die Daten des Users im Parameter auf die Datenbank
*/ *
* @param user
*/
public void pushStats(User user) { public void pushStats(User user) {
// TODO: Methode korrigieren (Update ist nicht auf den User beschränkt) // TODO: Methode korrigieren (Update ist nicht auf den User beschränkt) und neue Tabelle lastGuesses berücksichtigen
db.executeStatement("UPDATE INTO Stats (current_streak," + " max_streak, " + "wins, " + "times_played, " 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, " + "won_on_1, " + "won_on_2, " + "won_on_3, " + "won_on_4, " + "won_on_5, " + "won_on_6, "
+ "last_day_WOTD_finished) " + "VALUES (" + "last_day_WOTD_finished) " + "VALUES (" + Integer.toString(user.getCurrentStreak())
+ Integer.toString(user.getCurrentStreak()) + Integer.toString(user.getMaxStreak()) + Integer.toString(user.getWins())
+ Integer.toString(user.getMaxStreak()) + Integer.toString(user.getTimesPlayed()) + Integer.toString(user.getWonInTurnIndex(0))
+ Integer.toString(user.getWins()) + Integer.toString(user.getWonInTurnIndex(1)) + Integer.toString(user.getWonInTurnIndex(2))
+ Integer.toString(user.getTimesPlayed()) + Integer.toString(user.getWonInTurnIndex(3)) + Integer.toString(user.getWonInTurnIndex(4))
+ Integer.toString(user.getWonInTurnIndex(0)) + Integer.toString(user.getWonInTurnIndex(5)) + Integer.toString(user.getLastDayWOTDPlayed()) + ")");
+ 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.getLastDayWOTDFinished())
+ ")");
} }
/**
* Überprüft ob es den Username und das Passwort in der Datenbank gibt und gibt den Erfolg als Boolean zurück /**
* @param username * Überprüft ob es den Username und das Passwort in der Datenbank gibt und gibt
* @param password * den Erfolg als Boolean zurück
* @return Ein Boolean *
*/ * @param username
* @param password
* @return Ein Boolean
*/
public boolean checkLogin(String username, String password) { public boolean checkLogin(String username, String password) {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return true; return true;
} }
/**
* Gibt ein Zufälliges Wort aus der Datenbank zurück /**
* @return Ein Word als String * Gibt ein Zufälliges Wort aus der Datenbank zurück
*/ *
* @return Ein Word als String
*/
public String getWord() { public String getWord() {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return "12345"; return "12345";
} }
/** /**
* Gibt das Wordle des Tages, welches aus der Datenbank stammt, zurück. Ergibt pro Tag immer das gleiche Wordle. * Gibt das Wordle des Tages, welches aus der Datenbank stammt, zurück. Ergibt
* pro Tag immer das gleiche Wordle.
*
* @return Das Wort als String * @return Das Wort als String
*/ */
public String getWOTD() { public String getWOTD() {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return "abcde"; return "abcde";
} }
/** /**
* Prüft ob das Wort in der Datenbank vorhanden ist * Prüft ob das Wort in der Datenbank vorhanden ist
*
* @param word ,ein String mit dem Wort * @param word ,ein String mit dem Wort
* @return Boolean * @return Boolean
*/ */

203
User.java
View File

@@ -1,123 +1,138 @@
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class User { public class User {
private String connectionID; private String connectionID;
private String username; private String username;
private String password; private String password;
private int timesPlayed; private int timesPlayed;
private int winPercentage; private int winPercentage;
private int currentStreak; private int currentStreak;
private int maxStreak; private int maxStreak;
private int lastDayWOTDFinished; private int lastDayWOTDPlayed;
private int state; private int state;
private int wins; private int wins;
private int [] wonInTurn; private int[] wonInTurn;
private Game game; private Game game;
public User (String pConnectionID){ public User(String pConnectionID) {
connectionID = pConnectionID; connectionID = pConnectionID;
game = new Game(); game = new Game();
} }
public Game getGame(){ public Game getGame() {
return game; return game;
} }
public String getConnectionID() { public String getConnectionID() {
return connectionID; return connectionID;
} }
public int getCurrentStreak() { public int getCurrentStreak() {
return currentStreak; return currentStreak;
} }
public int getLastDayWOTDFinished() { public int getLastDayWOTDPlayed() {
return lastDayWOTDFinished; return lastDayWOTDPlayed;
} }
public int getMaxStreak() { public int getMaxStreak() {
return maxStreak; return maxStreak;
} }
public int getTimesPlayed() { public int getTimesPlayed() {
return timesPlayed; return timesPlayed;
} }
public int getState() { public int getState() {
return state; return state;
} }
public void setWins(int wins) { public void setWins(int wins) {
this.wins = wins; this.wins = wins;
} }
public int getWinPercentage() { public int getWinPercentage() {
return winPercentage; return winPercentage;
} }
public int getWonInTurnIndex(int index) { public int getWonInTurnIndex(int index) {
return wonInTurn[index]; return wonInTurn[index];
} }
public int[] getWonInTurn() { public int[] getWonInTurn() {
return wonInTurn; return wonInTurn;
} }
public String getPassword() { public String getPassword() {
return password; return password;
} }
public String getUsername() { public String getUsername() {
return username; return username;
} }
public int getWins() { public int getWins() {
return wins; return wins;
} }
public void setConnectionID(String connectionID) { public void setConnectionID(String connectionID) {
this.connectionID = connectionID; this.connectionID = connectionID;
} }
public void setCurrentStreak(int currentStreak) { public void setCurrentStreak(int currentStreak) {
this.currentStreak = currentStreak; this.currentStreak = currentStreak;
} }
public void setLastDayWOTDFinished(int lastDayWOTDFinished) { public void updateLastDayWOTDPlayed() {
this.lastDayWOTDFinished = lastDayWOTDFinished; lastDayWOTDPlayed = (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now());
} }
public void setMaxStreak(int maxStreak) { public void setMaxStreak(int maxStreak) {
this.maxStreak = maxStreak; this.maxStreak = maxStreak;
} }
public void setPassword(String password) { public void setPassword(String password) {
this.password = password; this.password = password;
} }
public void setState(int state) { public void setState(int state) {
this.state = state; this.state = state;
} }
public void setTimesPlayed(int timesPlayed) { public void setTimesPlayed(int timesPlayed) {
this.timesPlayed = timesPlayed; this.timesPlayed = timesPlayed;
} }
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
public void setWinPercentage(int winPercentage) { public void setWinPercentage(int winPercentage) {
this.winPercentage = winPercentage; this.winPercentage = winPercentage;
} }
public void setWonInTurnIndex(int index, int content) { public void setWonInTurnIndex(int index, int content) {
this.wonInTurn[index] = content; this.wonInTurn[index] = content;
} }
public void setWonInTurn(int[] wonInTurn) { public void setWonInTurn(int[] wonInTurn) {
this.wonInTurn = wonInTurn; this.wonInTurn = wonInTurn;
} }
public boolean loggedIn() { public boolean loggedIn() {
return password != null && username != null; return password != null && username != null;
} }
public String[] getLastGuesses() {
return game.getGuesses();
}
public void setLastGuesses(String[] guesses) {
game.setGuesses(guesses);
}
public void setLastDayWOTDPlayed(int time) {
lastDayWOTDPlayed = time;
}
} }

View File

@@ -14,8 +14,6 @@ public class WordleServer extends Server {
new WordleServer(); new WordleServer();
} }
private DatabaseConnector db;
private HashMap<String, User> users; private HashMap<String, User> users;
private Query query; private Query query;
@@ -26,7 +24,6 @@ public class WordleServer extends Server {
public WordleServer(int pPort) { public WordleServer(int pPort) {
super(pPort); super(pPort);
query = new Query(); query = new Query();
db = new DatabaseConnector("", 0, "wordle.db", "", "");
users = new HashMap<>(); users = new HashMap<>();
} }
@@ -42,7 +39,11 @@ public class WordleServer extends Server {
@Override @Override
public void processClosingConnection(String pClientIP, int pClientPort) { public void processClosingConnection(String pClientIP, int pClientPort) {
String connectionID = pClientIP + ":" + Integer.toString(pClientPort);
User u = users.get(connectionID);
if (u.loggedIn()) {
query.pushStats(u);
}
} }
@Override @Override
@@ -56,7 +57,7 @@ public class WordleServer extends Server {
} else { } else {
String m = pMessage.substring(0, 4); String m = pMessage.substring(0, 4);
System.out.println("Message: " + m + " State: " + u.getState()); System.out.println("Message: " + m + " State: " + u.getState());
if (pMessage.equals("QUIT")) { if (pMessage.equalsIgnoreCase("QUIT")) {
send(pClientIP, pClientPort, "+OK Bye"); send(pClientIP, pClientPort, "+OK Bye");
close(); close();
} }
@@ -73,7 +74,6 @@ public class WordleServer extends Server {
if (u.getPassword() != null && u.getUsername() != null) { if (u.getPassword() != null && u.getUsername() != null) {
if (query.checkLogin(u.getUsername(), u.getPassword())) { if (query.checkLogin(u.getUsername(), u.getPassword())) {
send(pClientIP, pClientPort, "+OK welcome"); send(pClientIP, pClientPort, "+OK welcome");
u.setState(3);
} else { } else {
u.setPassword(""); u.setPassword("");
u.setUsername(""); u.setUsername("");
@@ -81,10 +81,18 @@ public class WordleServer extends Server {
} }
} }
} else if (m.equalsIgnoreCase("WOTD")) { } else if (m.equalsIgnoreCase("WOTD")) {
// TODO: Prüfen, wie weit der Spieler schon mit dem Spiel ist if (!isToday(u.getLastDayWOTDPlayed())) {
u.getGame().startGame(query.getWOTD()); send(pClientIP, pClientPort, "+OK game ready");
u.setState(2); u.getGame().startGame(query.getWOTD());
send(pClientIP, pClientPort, "+OK Game ready"); u.setState(2);
u.updateLastDayWOTDPlayed();
} else if (u.getGame().getGameStatus() == 1) {
send(pClientIP, pClientPort, "+OK Game continues");
u.setState(2);
u.updateLastDayWOTDPlayed();
} else {
send(pClientIP, pClientPort, "-ERR game finished");
}
} else { } else {
send(pClientIP, pClientPort, "-ERR Command not valid in this state"); send(pClientIP, pClientPort, "-ERR Command not valid in this state");
} }
@@ -93,17 +101,22 @@ public class WordleServer extends Server {
// Spielphase // Spielphase
if (m.equalsIgnoreCase("SEND")) { if (m.equalsIgnoreCase("SEND")) {
m = pMessage.substring(5, pMessage.length()); m = pMessage.substring(5, pMessage.length());
if(m.length() == 5) { if (m.length() == 5) {
if(query.checkWord(m)) { if (query.checkWord(m)) {
String a = "+OK " + u.getGame().giveGuess(m); String a = "+OK " + u.getGame().giveGuess(m);
if(!u.getGame().isGameRunning()) { System.out.println(u.getGame().getGameStatus());
if(u.getGame().won()) { switch (u.getGame().getGameStatus()) {
a += " game won"; case (1):
} else { a += " game continues";
a += " game lost"; break;
} case (2):
} else { a += " game won";
a += " game continues"; u.setState(3);
break;
case (3):
a += " game lost";
u.setState(3);
break;
} }
send(pClientIP, pClientPort, a); send(pClientIP, pClientPort, a);
} else { } else {
@@ -137,7 +150,7 @@ public class WordleServer extends Server {
+ u.getWonInTurnIndex(4) + '\n' + "won in 5 turn: " + u.getWonInTurnIndex(5) + '\n' + u.getWonInTurnIndex(4) + '\n' + "won in 5 turn: " + u.getWonInTurnIndex(5) + '\n'
+ "won in 6 turn: " + u.getWonInTurnIndex(6) + '\n' + "."); + "won in 6 turn: " + u.getWonInTurnIndex(6) + '\n' + ".");
} else if (m.equalsIgnoreCase("PLAY")) { } else if (m.equalsIgnoreCase("PLAY")) {
if (isToday(u.getLastDayWOTDFinished())) { if (isToday(u.getLastDayWOTDPlayed()) && u.getGame().getGameStatus() != 1) {
u.getGame().startGame(query.getWord()); u.getGame().startGame(query.getWord());
u.setState(2); u.setState(2);
send(pClientIP, pClientPort, "+OK Game ready"); send(pClientIP, pClientPort, "+OK Game ready");
@@ -150,11 +163,10 @@ public class WordleServer extends Server {
break; break;
} }
} }
} }
public boolean isToday(int pDay) { public boolean isToday(int pDay) {
LocalDate now = LocalDate.now(); return pDay == (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now());
LocalDate epoch = LocalDate.ofEpochDay(0);
return pDay == ChronoUnit.DAYS.between(epoch, now);
} }
} }

BIN
wordle.db

Binary file not shown.