forked from IF-LK-2020/wordle
Ifception der Wordle-Server Klasse
An der Bearbeitung der Abfragen gearbeitet, versucht die giveGuess-Methode zu fixen
This commit is contained in:
30
Game.java
30
Game.java
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user