Ifception der Wordle-Server Klasse

An der Bearbeitung der Abfragen gearbeitet, versucht die giveGuess-Methode zu fixen
This commit is contained in:
2022-03-20 15:56:05 +01:00
parent 02d6252537
commit 81e54b9d39
5 changed files with 124 additions and 87 deletions

View File

@@ -1,14 +1,13 @@
public class Game { public class Game {
private String word; private String word;
private String[] guesses; private String[] guesses;
private boolean won;
// TODO: // TODO:
Game() { Game() {
word = ""; word = "";
} won = false;
guesses = new String[5];
public void startGame() {
} }
/** /**
@@ -22,17 +21,17 @@ public class Game {
* @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 guess) {
String g = guess; StringBuilder g = new StringBuilder(guess);
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 < word.length(); i++) {
if (guess.charAt(0) == word.charAt(0)) { if (g.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 = 0; r < word.length(); r++) { for (int r = 1; r < word.length(); r++) {
if (r != i && guess.charAt(0) == word.charAt(r)) { if (g.charAt(0) == word.charAt(r)) {
s += "1"; s += "1";
found = true; found = true;
word.deleteCharAt(r); word.deleteCharAt(r);
@@ -43,10 +42,11 @@ public class Game {
s += "0"; s += "0";
} }
} }
guess.replaceFirst(guess, ""); g.deleteCharAt(0);
} }
if(storeInArray(g)) { if(storeInArray(g.toString())) {
stopGame(); stopGame();
won = !word.isEmpty();
} }
return s; return s;
} }
@@ -67,12 +67,16 @@ public class Game {
return true; return true;
} }
public void startWOTD(String wotd) { public void startGame(String word) {
word = wotd; this.word = word;
} }
public boolean isGameRunning() { public boolean isGameRunning() {
return word.equals("") || word.equals(null); return !word.equals("") || !word.equals(null);
}
public boolean won() {
return won;
} }
private void stopGame() { private void stopGame() {

View File

@@ -59,7 +59,7 @@ public class Query {
*/ */
public boolean checkLogin(String username, String password) { public boolean checkLogin(String username, String password) {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return false; return true;
} }
/** /**
* Gibt ein Zufälliges Wort aus der Datenbank zurück * Gibt ein Zufälliges Wort aus der Datenbank zurück
@@ -67,7 +67,7 @@ public class Query {
*/ */
public String getWord() { public String getWord() {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return ""; 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.
@@ -75,7 +75,7 @@ public class Query {
*/ */
public String getWOTD() { public String getWOTD() {
// TODO: Methode fertigstellen // TODO: Methode fertigstellen
return ""; return "abcde";
} }
/** /**
* Prüft ob das Wort in der Datenbank vorhanden ist * Prüft ob das Wort in der Datenbank vorhanden ist

View File

@@ -116,4 +116,8 @@ public class User {
public void setWonInTurn(int[] wonInTurn) { public void setWonInTurn(int[] wonInTurn) {
this.wonInTurn = wonInTurn; this.wonInTurn = wonInTurn;
} }
public boolean loggedIn() {
return password != null && username != null;
}
} }

View File

@@ -1,4 +1,6 @@
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.HashMap; import java.util.HashMap;
/** /**
@@ -48,37 +50,41 @@ public class WordleServer extends Server {
String connectionID = pClientIP + ":" + Integer.toString(pClientPort); String connectionID = pClientIP + ":" + Integer.toString(pClientPort);
User u = users.get(connectionID); User u = users.get(connectionID);
u.setConnectionID(connectionID); u.setConnectionID(connectionID);
if (pMessage.length() < 4) {
send(pClientIP, pClientPort, "-ERR Command not valid in this state");
} else {
String m = pMessage.substring(0, 4);
System.out.println("Message: " + m + " State: " + u.getState());
if (pMessage.equals("QUIT")) { if (pMessage.equals("QUIT")) {
send(pClientIP, pClientPort, "+OK Bye"); send(pClientIP, pClientPort, "+OK Bye");
close(); close();
} }
String m = pMessage.substring(0, 3);
switch (u.getState()) { switch (u.getState()) {
case 1: case 1:
// Anmeldephase // Anmeldephase
if (m.equalsIgnoreCase("USER")) { if (m.equalsIgnoreCase("USER")) {
m = pMessage.substring(6, pMessage.length() - 1); m = pMessage.substring(5, pMessage.length() - 1);
u.setUsername(m); u.setUsername(m);
send(pClientIP, pClientPort, "+OK"); send(pClientIP, pClientPort, "+OK");
} else if (m.equalsIgnoreCase("PASS")) { } else if (m.equalsIgnoreCase("PASS")) {
m = pMessage.substring(6, pMessage.length() - 1); m = pMessage.substring(5, pMessage.length() - 1);
u.setPassword(m); u.setPassword(m);
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); u.setState(3);
} else { } else {
send(pClientIP, pClientPort, "+ERR login not valid"); u.setPassword("");
u.setUsername("");
send(pClientIP, pClientPort, "-ERR login not valid");
} }
} }
} else if (m.equalsIgnoreCase("WOTD")) { } else if (m.equalsIgnoreCase("WOTD")) {
// TODO: Prüfen, wie weit der Spieler schon mit dem Spiel ist // TODO: Prüfen, wie weit der Spieler schon mit dem Spiel ist
u.getGame().startGame(query.getWOTD());
u.setState(2); u.setState(2);
send(pClientIP, pClientPort, "+OK Game ready"); send(pClientIP, pClientPort, "+OK Game ready");
} else if(m.equalsIgnoreCase("PLAY")) {
} else { } else {
send(pClientIP, pClientPort, "-ERR Command not valid in this state"); send(pClientIP, pClientPort, "-ERR Command not valid in this state");
} }
@@ -86,7 +92,26 @@ public class WordleServer extends Server {
case 2: case 2:
// Spielphase // Spielphase
if (m.equalsIgnoreCase("SEND")) { if (m.equalsIgnoreCase("SEND")) {
m = pMessage.substring(5, pMessage.length());
if(m.length() == 5) {
if(query.checkWord(m)) {
String a = "+OK " + u.getGame().giveGuess(m);
if(!u.getGame().isGameRunning()) {
if(u.getGame().won()) {
a += " game won";
} else {
a += " game lost";
}
} else {
a += " game continues";
}
send(pClientIP, pClientPort, a);
} else {
send(pClientIP, pClientPort, "-ERR word not in dict");
}
} else {
send(pClientIP, pClientPort, "-ERR wrong format");
}
} else if (m.equalsIgnoreCase("INFO")) { } else if (m.equalsIgnoreCase("INFO")) {
int n = Integer.parseInt("0" + pMessage.substring(4, pMessage.length()).replaceAll(" ", "")); int n = Integer.parseInt("0" + pMessage.substring(4, pMessage.length()).replaceAll(" ", ""));
if (n != 0) { if (n != 0) {
@@ -103,29 +128,33 @@ public class WordleServer extends Server {
case 3: case 3:
// Zwischenphase(Angemeldet) // Zwischenphase(Angemeldet)
if (m.equalsIgnoreCase("STAT")) { if (m.equalsIgnoreCase("STAT")) {
send(pClientIP, pClientPort, "+OK" + send(pClientIP, pClientPort,
'\n' + "times played: " + u.getTimesPlayed() + "+OK" + '\n' + "times played: " + u.getTimesPlayed() + '\n' + "win percentage: "
'\n' + "win percentage: " + u.getWinPercentage() + + u.getWinPercentage() + '\n' + "current streak: " + u.getCurrentStreak() + '\n'
'\n' + "current streak: " + u.getCurrentStreak() + + "max streak: " + u.getMaxStreak() + '\n' + "won in 1 turn: "
'\n' + "max streak: " + u.getMaxStreak() + + u.getWonInTurnIndex(1) + '\n' + "won in 2 turn: " + u.getWonInTurnIndex(2) + '\n'
'\n' + "won in 1 turn: " + u.getWonInTurnIndex(1) + + "won in 3 turn: " + u.getWonInTurnIndex(3) + '\n' + "won in 4 turn: "
'\n' + "won in 2 turn: " + u.getWonInTurnIndex(2) + + u.getWonInTurnIndex(4) + '\n' + "won in 5 turn: " + u.getWonInTurnIndex(5) + '\n'
'\n' + "won in 3 turn: " + u.getWonInTurnIndex(3) + + "won in 6 turn: " + u.getWonInTurnIndex(6) + '\n' + ".");
'\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' + ".");
} else if (m.equalsIgnoreCase("PLAY")) { } else if (m.equalsIgnoreCase("PLAY")) {
if (isToday(u.getLastDayWOTDFinished())) {
u.getGame().startGame(query.getWord());
u.setState(2);
send(pClientIP, pClientPort, "+OK Game ready");
} else {
send(pClientIP, pClientPort, "-ERR wotd not finished");
}
} else { } else {
send(pClientIP, pClientPort, "-ERR Command not valid in this state"); send(pClientIP, pClientPort, "-ERR Command not valid in this state");
} }
break; break;
}
} }
} }
public boolean isToday(int pDay) { public boolean isToday(int pDay) {
return pDay == (int) (86400000.0 / Instant.now().toEpochMilli()); LocalDate now = LocalDate.now();
LocalDate epoch = LocalDate.ofEpochDay(0);
return pDay == ChronoUnit.DAYS.between(epoch, now);
} }
} }

BIN
wordle.db

Binary file not shown.