Compare commits

...

52 Commits

Author SHA1 Message Date
Asecave
fc8d803d32 Update wordle.db 2022-03-26 00:38:09 +01:00
Asecave
68549bbc8b IT'S DONE! I think... 2022-03-25 20:45:13 +01:00
Asecave
92d4f15e75 fixed wrong game start message 2022-03-25 20:44:28 +01:00
Asecave
a78fac1baf added info <n> 2022-03-25 20:43:58 +01:00
Asecave
84a81bf2b4 info und saveGame funkt 2022-03-25 20:19:29 +01:00
Asecave
37736dbfad wotd finished requirement to play 2022-03-25 16:27:54 +01:00
Asecave
09ea7ea01e Spielstand wird gespeichert (und gelesen) 2022-03-25 15:42:22 +01:00
Tim Tersch
4d01389e2e working stats 2022-03-24 11:30:17 +01:00
Tim Tersch
f212bed8de fixed sql requests in user and replaced requests 2022-03-24 10:51:19 +01:00
Tim Tersch
93a419f10c removed unused DatabaseConnector 2022-03-24 10:18:31 +01:00
Asecave
e64344b5a2 wordle richtigkeits check 2022-03-23 20:08:09 +01:00
Alperen
1204f952c6 finished END_PHASE 2022-03-20 20:57:11 +01:00
Tim Tersch
bf90f74b03 asdasd 2022-03-17 11:37:10 +01:00
Tim Tersch
5e14802934 Revert "wotd !untested!"
This reverts commit 0c77b295d1.
2022-03-17 11:06:20 +01:00
Tim Tersch
0c77b295d1 wotd !untested! 2022-03-17 10:41:24 +01:00
Asecave
6f117b6b30 wotd 2022-03-07 16:07:07 +01:00
Asecave
e203a8747c phase constants 2022-03-07 15:50:37 +01:00
Asecave
86d449cba2 login detection 2022-03-07 15:38:35 +01:00
Tim Tersch
91ed88d15d asdasda 2022-03-03 11:37:50 +01:00
Tim Tersch
8e9a9218be Merge branch 'main' of https://git.ngb.schule/Tim/wordle
# Conflicts:
#	src/Game.java
2022-03-03 11:37:41 +01:00
Tim Tersch
de0133d1b1 login angefangen 2022-03-03 11:31:11 +01:00
Alperen Semih Baldan
7d66b9c043 . 2022-03-03 11:29:46 +01:00
Alperen Semih Baldan
55fe449643 added lib and changed db 2022-03-03 11:28:20 +01:00
Tim Tersch
a5ffccc596 datendtypen geändert 2022-03-03 10:54:50 +01:00
Tim Tersch
16e4382902 Befehle 2022-03-02 13:30:28 +01:00
Alperen Semih Baldan
da1167b8d4 Guest entfernt 2022-03-02 13:25:21 +01:00
Tim Tersch
a7a4848737 Rename 2022-03-02 13:22:05 +01:00
Tim Tersch
2cf96672fc methoden für phasen 2022-03-02 13:05:29 +01:00
Alperen
98522653b2 update umlet.uxf 2022-02-20 17:51:49 +01:00
Alperen
08f6a3f68a added guest class 2022-02-20 17:44:44 +01:00
Alperen
c3e91b9ae4 Revert "Merge branch 'main' of https://git.ngb.schule/Tim/wordle"
This reverts commit ae7093a555, reversing
changes made to 9c47fb0885.
2022-02-18 00:07:18 +01:00
Alperen
ae7093a555 Merge branch 'main' of https://git.ngb.schule/Tim/wordle 2022-02-14 09:45:58 +01:00
Alperen
9c47fb0885 Update umlet.uxf 2022-02-14 09:45:55 +01:00
Tim Tersch
4419bbee88 added user table 2022-02-14 09:44:20 +01:00
Tim Tersch
f6734a51ab added lib 2022-02-14 09:36:10 +01:00
Alperen
6ca53fcd10 Merge branch 'main' of https://git.ngb.schule/Tim/wordle 2022-02-14 09:33:16 +01:00
Alperen
ed124899bb finished user class 2022-02-14 09:29:56 +01:00
Tim Tersch
e7a785f968 quit 2022-02-14 09:27:40 +01:00
Tim Tersch
e3e899908f set ip and port 2022-02-14 09:23:31 +01:00
Tim Tersch
031f73abfa Game instance for every connection 2022-02-14 09:15:13 +01:00
Tim Tersch
86119bcb6a Update umlet.uxf 2022-02-14 09:09:37 +01:00
Tim Tersch
e1103cf78e game instances 2022-02-14 08:53:01 +01:00
Tim Tersch
2278d6ae6d moved gui to different folder 2022-02-14 08:47:43 +01:00
Tim Tersch
fbfc559a45 disabled GUI 2022-02-14 08:32:31 +01:00
Asecave
755f2d5a9d letter rendering 2022-02-12 21:01:25 +01:00
Asecave
c56b0d755e fonst test 2022-02-11 20:43:46 +01:00
Asecave
b84ff5459e Readdded letter code 2022-02-11 19:31:28 +01:00
Asecave
78e83c500d Create Letter.java 2022-02-11 19:20:12 +01:00
Asecave
9fe5d3c753 Update .gitignore
Update .gitignore
2022-02-11 19:20:12 +01:00
Asecave
65a8467b89 source dir
added package declaration

removed package declaration

ist doch nicht nötig
2022-02-11 19:20:12 +01:00
Alperen
dd3713bda1 Merge remote-tracking branch 'origin/main' 2022-02-10 11:36:22 +01:00
Alperen
120b704cd2 User klasse increase fehlt 2022-02-10 11:35:59 +01:00
19 changed files with 1030 additions and 285 deletions

4
.gitignore vendored
View File

@@ -13,7 +13,6 @@ Dokumente*
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
@@ -26,3 +25,6 @@ hs_err_pid*
# Engine-Alpha files
engine-alpha.log
.classpath
.project
/bin/

View File

@@ -1,34 +0,0 @@
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GUI extends JPanel {
private static final long serialVersionUID = 1L;
private JFrame frame;
private Letter[][] letters;
public GUI() {
frame = new JFrame();
frame.setSize(1000, 800);
frame.setTitle("Wordle");
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
letters = new Letter[5][6];
for (int x = 0; x < letters.length; x++) {
for (int y = 0; y < letters[0].length; y++) {
letters[x][y] = new Letter();
}
}
}
@Override
protected void paintComponent(Graphics g) {
g.drawRect(100, 100, 100, 100);
}
}

View File

@@ -1,21 +0,0 @@
public class Game {
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
WordleServer wordleServer;
User user;
GUI gui;
DatabaseConnector databaseConnector;// Datenbankverbindung aufstellen
private String wordle;
private String[] words;
private int count;
public static void main(String[] args) {
new Game();
}
public Game() {
wordleServer = new WordleServer();
user = new User();
gui = new GUI();
}
}

View File

@@ -1,67 +0,0 @@
/**
* Beschreiben Sie hier die Klasse User.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class User
{
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
private String name;
private String password;
private int timesPlayed;
private int winPercentage;
private int currentStreak;
private int maxStreak;
private int[] winInTurn;
/**
* Konstruktor für Objekte der Klasse User
*/
public User()
{
// Instanzvariable initialisieren
}
/**
* Ein Beispiel einer Methode - ersetzen Sie diesen Kommentar mit Ihrem eigenen
*
* @param y ein Beispielparameter für eine Methode
* @return die Summe aus x und y
*/
public void setPassword(String pW)
{
// tragen Sie hier den Code ein
password = pW;
}
public String getPassword()
{
return password;
}
public void setName(String pN)
{
// tragen Sie hier den Code ein
name = pN;
}
public String getName()
{
return name;
}
public void setName(String pN)
{
// tragen Sie hier den Code ein
name = pN;
}
public String getName()
{
return name;
}
}

93
gui (not in use)/GUI.java Normal file
View File

@@ -0,0 +1,93 @@
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GUI extends JPanel {
private static final long serialVersionUID = 1L;
private JFrame frame;
private Letter[][] letters;
private boolean running;
private float marginRatio = 0.2f;
public GUI() {
frame = new JFrame();
frame.setSize(1000, 800);
frame.setTitle("Wordle");
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
letters = new Letter[5][6];
for (int x = 0; x < letters.length; x++) {
for (int y = 0; y < letters[0].length; y++) {
letters[x][y] = new Letter();
}
}
new Thread(new Runnable() {
@Override
public void run() {
running = true;
while (running) {
repaint();
try {
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
if (letters == null) {
return;
}
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setFont(new Font(null, Font.BOLD, 48));
g2d.setStroke(new BasicStroke(4));
int framew = getSize().width;
int frameh = getSize().height;
g2d.setColor(Color.DARK_GRAY);
g2d.fillRect(0, 0, framew, frameh);
int letterSize = frameh / 10;
int margin = (int) (letterSize * marginRatio);
int offsetX = framew / 2 - (5 * letterSize + 4 * margin) / 2;
int offsetY = frameh / 2 - (6 * letterSize + 5 * margin) / 2;
for (int x = 0; x < letters.length; x++) {
for (int y = 0; y < letters[0].length; y++) {
int posX = offsetX + x * (letterSize + margin);
int posY = offsetY + y * (letterSize + margin);
g2d.setColor(letters[x][y].getColor());
g2d.fillRect(posX, posY, letterSize, letterSize);
g2d.setColor(Color.BLACK);
g2d.drawRect(posX, posY, letterSize, letterSize);
String letter = "" + letters[x][y].getLetter();
int letterWidth = g2d.getFontMetrics().stringWidth(letter);
g2d.drawString(letter, posX + letterSize / 2 - letterWidth / 2, posY + letterSize / 2 + 20);
}
}
}
}

141
gui (not in use)/Guest.java Normal file
View File

@@ -0,0 +1,141 @@
/**
* Beschreiben Sie hier die Klasse User.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class Guest
{
// Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
private String name;
private String password;
private float winPercentage;
private int timesPlayed;
private int currentStreak;
private int maxStreak;
private int[] wonInTurn = {0,0,0,0,0,0};
/**
* Konstruktor für Objekte der Klasse User
*/
public Guest()
{
// Instanzvariable initialisieren
}
public void setPassword(String password)
{
// tragen Sie hier den Code ein
this.password = password;
}
public String getPassword()
{
return password;
}
public void setName(String name)
{
// tragen Sie hier den Code ein
this.name = name;
}
public String getName()
{
return name;
}
public void setWinPercentage(float winPercentage)
{
// tragen Sie hier den Code ein
this.winPercentage = winPercentage;
}
public float getWinPercentage()
{
int sum = 0;
for(int i = 0;i < wonInTurn.length;i++)
{
sum += wonInTurn[i];
}
winPercentage = sum / timesPlayed;
return winPercentage;
}
public void setTimesPlayed(int timesPlayed)
{
// tragen Sie hier den Code ein
this.timesPlayed = timesPlayed;
}
public int getTimesPlayed()
{
return timesPlayed;
}
public void increaseTimesPlayed()
{
timesPlayed = timesPlayed + 1;
}
public void setCurrentStreak(int currentStreak)
{
// tragen Sie hier den Code ein
this.currentStreak = currentStreak;
}
public int getCurrentStreak()
{
return currentStreak;
}
public void increaseCurrentStreak()
{
currentStreak = currentStreak + 1;
}
public void setMaxStreak(int maxStreak)
{
this.maxStreak = maxStreak;
}
public int getMaxStreak()
{
return maxStreak;
}
public void increaseMaxStreak()
{
maxStreak = maxStreak + 1;
}
public void setWonInTurn(int row, int value)
{
this.wonInTurn[row] = value;
}
public int getWonInTurn(int row)
{
int temp = wonInTurn[row];
return temp;
}
public void increaseWonInTurn(int row)
{
int temp = getWonInTurn(row) + 1;
setWonInTurn(row, temp);
}
public int[] getWonInTurnFull()
{
return wonInTurn;
}
}

View File

@@ -0,0 +1,43 @@
import java.awt.Color;
public class Letter {
public static final byte WHITE = -1;
public static final byte GRAY = 0;
public static final byte YELLOW = 1;
public static final byte GREEN = 2;
private char letter;
private byte color;
public Letter() {
letter = 'A';
color = (byte) ((byte) (Math.random() * 4) - 1);
}
public void setColor(byte color) {
this.color = color;
}
public Color getColor() {
switch (color) {
case WHITE:
return new Color(200, 200, 200);
case GRAY:
return new Color(100, 100, 100);
case YELLOW:
return new Color(220, 220, 0);
case GREEN:
return new Color(0, 220, 0);
}
return Color.BLACK;
}
public void setLetter(char letter) {
this.letter = letter;
}
public char getLetter() {
return letter;
}
}

Binary file not shown.

415
src/Game.java Normal file
View File

@@ -0,0 +1,415 @@
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Game {
private static final int LOGIN_PHASE = 0;
private static final int GAME_PHASE = 1;
private static final int END_PHASE = 2;
WordleServer wordleServer;
User user;
static DatabaseConnector databaseConnector;// Datenbankverbindung aufstellen
private String ip;
private int port;
private String wordle;
private String[] words;
private int count;
private int phase;
private String tempLoginName;
static {
databaseConnector = new DatabaseConnector(null, 0, "wordle.db", null, null);
if (databaseConnector.getErrorMessage() != null) {
System.err.println(databaseConnector.getErrorMessage());
}
}
public Game(WordleServer wordleServer, String pClientIP, int pClientPort) {
this.wordleServer = wordleServer;
this.ip = pClientIP;
this.port = pClientPort;
words = new String[5];
send("+OK Hello there");
}
public void processMessage(String msg) {
msg = msg.toLowerCase().trim();
if (msg.equals("quit")) {
if (user != null) {
saveGame();
}
send("+OK bye");
wordleServer.closeConnection(ip, port);
}
switch (phase) {
case LOGIN_PHASE:
loginPhase(msg);
break;
case GAME_PHASE:
gamePhase(msg);
break;
case END_PHASE:
endPhase(msg);
break;
}
}
private void loginPhase(String msg) {
if (msg.startsWith("user ")) {
if (msg.length() <= 5) {
sendUniversalError();
return;
}
String args = msg.substring(5);
databaseConnector.executeStatement("SELECT * FROM User WHERE name = '" + args + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0) {
tempLoginName = result.getData()[0][0];
send("+OK");
} else {
send("-ERR User not found.");
}
} else if (msg.startsWith("pass ")) {
if (msg.length() <= 5) {
sendUniversalError();
return;
}
String args = msg.substring(5);
int pw = args.hashCode();
databaseConnector.executeStatement(
"SELECT * FROM User WHERE password = '" + pw + "' AND name = '" + tempLoginName + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0) {
user = new User(tempLoginName);
send("+OK welcome");
} else {
send("-ERR login not valid");
}
} else if (msg.startsWith("wotd")) {
databaseConnector.executeStatement("SELECT word FROM words WHERE id = " + getWOTDIndex());
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0) {
wordle = result.getData()[0][0].toLowerCase();
phase = GAME_PHASE;
if (user != null) {
loadGame();
} else {
send("+OK game ready");
}
} else {
send("-ERR fatal error: WOTD could not be generated.");
}
} else if (msg.startsWith("play")) {
if (user == null) {
send("-ERR not logged in.");
} else {
databaseConnector
.executeStatement("SELECT lastFinishedWotdDay FROM User WHERE name = '" + user.getName() + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0) {
if (result.getData()[0][0] != null && Integer.parseInt(result.getData()[0][0]) == currentDay()) {
playRandomWordle();
} else {
send("-ERR WOTD not finished.");
}
}
}
} else {
sendUniversalError();
}
}
private void gamePhase(String msg) {
if (msg.startsWith("send ")) {
String args = msg.substring(5);
if (args.length() == 5) {
databaseConnector.executeStatement("SELECT word FROM words WHERE word LIKE '" + args + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result.getData().length > 0) {
String input = result.getData()[0][0].toLowerCase();
String code = generateCode(input);
send("+OK " + code);
if (code.equals("22222")) { // und ein wordle ist 5 Buchstaben lang :D
send("game won");
wordle = null;
if (user != null) {
setLastPlayedTimestamp();
user.increaseCurrentStreak();
if (user.getMaxStreak() < user.getCurrentStreak()) {
user.setMaxStreak(user.getCurrentStreak());
}
user.increaseWonInTurn(count + 1);
updateStats();
phase = END_PHASE;
} else {
phase = LOGIN_PHASE;
}
count = 0;
clearWords();
} else if (count == 5) {
send("game lost");
wordle = null;
if (user != null) {
setLastPlayedTimestamp();
user.setCurrentStreak(0);
updateStats();
phase = END_PHASE;
} else {
phase = LOGIN_PHASE;
}
count = 0;
clearWords();
} else {
words[count] = input;
send("game continues");
count++;
}
} else {
send("-ERR word not in dictionary.");
}
} else {
send("-ERR wrong format.");
}
} else if (msg.startsWith("info")) {
if (msg.length() == 4) {
send("+OK");
for (int i = 0; i < words.length; i++) {
if (words[i] == null) {
break;
}
send(words[i] + " " + generateCode(words[i]));
}
send(".");
} else if (msg.length() == 6) {
String rawLine = msg.substring(5);
int line = -1;
try {
line = Integer.parseInt(rawLine) - 1;
} catch (NumberFormatException e) {
send("-ERR wrong argument.");
}
if (line >= 0 && line < 5) {
if (words[line] != null) {
send("+OK " + words[line] + " " + generateCode(words[line]));
} else {
send("-ERR game hasn't progressed to this line yet.");
}
} else {
send("-ERR couldn't parse line.");
}
} else {
sendUniversalError();
}
} else if (msg.startsWith("exit")) {
if (user != null) {
saveGame();
phase = END_PHASE;
send("+OK");
} else {
send("-ERR not logged in.");
}
} else {
sendUniversalError();
}
}
private void endPhase(String msg) {
if (msg.startsWith("stat")) {
send("+OK");
send("times Played: " + user.getTimesPlayed());
send("win Percentage: " + (int) user.getWinPercentage() + "%");
send("current Streak: " + user.getCurrentStreak());
send("max Streak: " + user.getMaxStreak());
for (int i = 1; i <= 6; i++) {
send("won in Turn" + i + ": " + user.getWonInTurn(i));
}
send(".");
} else if (msg.startsWith("play")) {
if (wordle == null) {
playRandomWordle();
} else {
loadGame();
phase = GAME_PHASE;
}
} else {
sendUniversalError();
}
}
private void saveGame() {
databaseConnector.executeStatement("SELECT * FROM Spielstand WHERE Username LIKE '" + user.getName() + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result == null || result.getData().length == 0) {
databaseConnector.executeStatement("INSERT INTO Spielstand (Username) VALUES('" + user.getName() + "')");
}
for (int i = 0; i < words.length; i++) {
databaseConnector.executeStatement("UPDATE Spielstand SET word" + (i + 1) + " = '" + words[i]
+ "' WHERE Username LIKE '" + user.getName() + "'");
}
}
private void loadGame() {
databaseConnector.executeStatement("SELECT * FROM Spielstand WHERE Username = '" + user.getName() + "'");
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0 && !result.getData()[0][0].equals("null")) {
boolean foundEnd = false;
for (int i = 0; i < 5; i++) {
if (!result.getData()[0][i].equals("null")) {
words[i] = result.getData()[0][i];
} else if (!foundEnd) {
count = i;
foundEnd = true;
}
}
send("+OK game running");
} else {
send("+OK game ready");
}
}
private void setLastPlayedTimestamp() {
databaseConnector.executeStatement(
"UPDATE User SET lastFinishedWotdDay = " + currentDay() + " WHERE name LIKE '" + user.getName() + "'");
}
private void clearWords() {
for (int i = 0; i < words.length; i++) {
words[i] = null;
}
}
private String generateCode(String input) {
String code = "";
outer: for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == wordle.charAt(i)) {
code += "2";
} else {
for (int j = 0; j < wordle.length(); j++) {
if (c == wordle.charAt(j)) {
code += "1";
continue outer;
}
}
code += "0";
}
}
return code;
}
private void updateStats() {
user.increaseTimesPlayed();
int totalWins = 0;
for (int i = 1; i <= 6; i++) {
totalWins += user.getWonInTurn(i);
}
float winP = (float) totalWins / user.getTimesPlayed();
user.setWinPercentage(Math.round(winP * 100));
}
private void playRandomWordle() {
databaseConnector.executeStatement("SELECT word FROM words WHERE id = " + (int) (Math.random() * 950));
QueryResult result = databaseConnector.getCurrentQueryResult();
if (result != null && result.getData().length > 0) {
wordle = result.getData()[0][0].toLowerCase();
phase = GAME_PHASE;
send("+OK game ready");
} else {
send("-ERR fatal error: Wordle could not be generated.");
}
}
private void send(String msg) {
wordleServer.send(ip, port, msg);
}
private void sendUniversalError() {
send("-ERR command not valid in this state");
}
private int getWOTDIndex() {
int days = currentDay();
int hash = ("" + days).hashCode();
return hash % 949 + 1;
}
private int currentDay() {
return (int) ChronoUnit.DAYS.between(LocalDate.ofEpochDay(0), LocalDate.now());
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}

137
src/User.java Normal file
View File

@@ -0,0 +1,137 @@
public class User {
private String name = "default";
/**
* Konstruktor für Objekte der Klasse User
*/
public User(String name) {
this.name = name;
}
public void setPassword(String password) {
Game.databaseConnector
.executeStatement("UPDATE User SET password = " + password + " Where name LIKE '" + this.name + "'");
}
public String getPassword() {
Game.databaseConnector.executeStatement("SELECT password FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
return result;
}
public void setName(String name) {
Game.databaseConnector
.executeStatement("UPDATE User SET name = " + name + " Where name LIKE '" + this.name + "'");
}
public String getName() {
return name;
}
public void setWinPercentage(float winPercentage) {
Game.databaseConnector.executeStatement(
"UPDATE User SET winPercentage = " + winPercentage + " Where name LIKE '" + this.name + "'");
}
public float getWinPercentage() {
Game.databaseConnector.executeStatement("SELECT winPercentage FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
if (result == null) {
return 0f;
} else {
return Float.parseFloat(result);
}
}
public void setTimesPlayed(int timesPlayed) {
Game.databaseConnector.executeStatement(
"UPDATE User SET timesPlayed = " + timesPlayed + " Where name LIKE '" + this.name + "'");
}
public int getTimesPlayed() {
Game.databaseConnector.executeStatement("SELECT timesPlayed FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
if (result == null) {
return 0;
} else {
return Integer.parseInt(result);
}
}
public void increaseTimesPlayed() {
int temp = getTimesPlayed();
temp++;
setTimesPlayed(temp);
}
public void setCurrentStreak(int currentStreak) {
Game.databaseConnector.executeStatement(
"UPDATE User SET currentStreak = " + currentStreak + " Where name LIKE '" + this.name + "'");
}
public int getCurrentStreak() {
Game.databaseConnector.executeStatement("SELECT currentStreak FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
if (result == null) {
return 0;
} else {
return Integer.parseInt(result);
}
}
public void increaseCurrentStreak() {
int temp = getCurrentStreak();
temp++;
setCurrentStreak(temp);
}
public void setMaxStreak(int maxStreak) {
Game.databaseConnector
.executeStatement("UPDATE User SET maxStreak = " + maxStreak + " Where name LIKE '" + this.name + "'");
}
public int getMaxStreak() {
Game.databaseConnector.executeStatement("SELECT maxStreak FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
if (result == null) {
return 0;
} else {
return Integer.parseInt(result);
}
}
public void increaseMaxStreak() {
int temp = getMaxStreak();
temp++;
setMaxStreak(temp);
}
public void setWonInTurn(int row, int value) {
Game.databaseConnector.executeStatement(
"UPDATE User SET wonInTurn" + row + " = " + value + " Where name LIKE '" + this.name + "'");
}
public int getWonInTurn(int row) {
Game.databaseConnector
.executeStatement("SELECT wonInTurn" + row + " FROM User Where name LIKE '" + this.name + "'");
String result = Game.databaseConnector.getCurrentQueryResult().getData()[0][0];
if (result == null) {
return 0;
} else {
return Integer.parseInt(result);
}
}
public void increaseWonInTurn(int row) {
int temp = getWonInTurn(row) + 1;
setWonInTurn(row, temp);
}
public int[] getWonInTurnFull() {
int[] result = { getWonInTurn(1), getWonInTurn(2), getWonInTurn(3), getWonInTurn(4), getWonInTurn(5),
getWonInTurn(6) };
return result;
}
}

View File

@@ -1,42 +1,50 @@
/**
* Server für das WORDLE Spiel.
*/
public class WordleServer extends Server {
public static final int DEFAULT_PORT = 1000;
List<Game> games;
public static void main( String[] args ) {
new WordleServer();
}
private DatabaseConnector db;
public WordleServer() {
this(DEFAULT_PORT);
}
public WordleServer( int pPort ) {
super(pPort);
db = new DatabaseConnector("", 0, "wordle.db", "", "");
games = new List<>();
}
@Override
public void processNewConnection( String pClientIP, int pClientPort ) {
System.out.println("New connection: " + pClientPort);
games.append(new Game(this, pClientIP, pClientPort));
}
@Override
public void processClosingConnection( String pClientIP, int pClientPort ) {
System.out.println("Closed connection: " + pClientPort);
find(pClientIP, pClientPort);
games.remove();
}
@Override
public void processMessage( String pClientIP, int pClientPort, String pMessage ) {
System.out.println("Message: " + pMessage);
find(pClientIP, pClientPort).processMessage(pMessage);
}
private Game find(String ip, int port) {
games.toFirst();
while (games.hasAccess()) {
Game g = games.getContent();
if (g.getIp().equals(ip) && g.getPort() == port) {
return g;
}
}
return null;
}
}

126
package.bluej → src/package.bluej Executable file → Normal file
View File

@@ -2,6 +2,12 @@
dependency1.from=DatabaseConnector
dependency1.to=QueryResult
dependency1.type=UsesDependency
dependency10.from=Game
dependency10.to=DatabaseConnector
dependency10.type=UsesDependency
dependency11.from=Game
dependency11.to=QueryResult
dependency11.type=UsesDependency
dependency2.from=DatabaseConnector
dependency2.to=Queue
dependency2.type=UsesDependency
@@ -9,39 +15,45 @@ dependency3.from=Server
dependency3.to=List
dependency3.type=UsesDependency
dependency4.from=WordleServer
dependency4.to=DatabaseConnector
dependency4.to=List
dependency4.type=UsesDependency
dependency5.from=Game
dependency5.to=WordleServer
dependency5.from=WordleServer
dependency5.to=Game
dependency5.type=UsesDependency
dependency6.from=Game
dependency6.to=User
dependency6.from=WordleServer
dependency6.to=DatabaseConnector
dependency6.type=UsesDependency
dependency7.from=Game
dependency7.to=DatabaseConnector
dependency7.from=User
dependency7.to=Game
dependency7.type=UsesDependency
editor.fx.0.height=722
editor.fx.0.width=800
editor.fx.0.x=346
editor.fx.0.y=91
objectbench.height=96
objectbench.width=1201
dependency8.from=Game
dependency8.to=WordleServer
dependency8.type=UsesDependency
dependency9.from=Game
dependency9.to=User
dependency9.type=UsesDependency
editor.fx.0.height=1056
editor.fx.0.width=1936
editor.fx.0.x=-8
editor.fx.0.y=-8
objectbench.height=152
objectbench.width=1896
package.divider.horizontal=0.6
package.divider.vertical=0.8476331360946746
package.editor.height=553
package.editor.width=1090
package.editor.x=39
package.editor.y=24
package.frame.height=776
package.frame.width=1241
package.numDependencies=7
package.divider.vertical=0.8336820083682008
package.editor.height=790
package.editor.width=1785
package.editor.x=0
package.editor.y=0
package.frame.height=1056
package.frame.width=1936
package.numDependencies=11
package.numTargets=9
package.showExtends=true
package.showUses=true
project.charset=UTF-8
readme.height=60
project.charset=windows-1252
readme.height=58
readme.name=@README
readme.width=49
readme.width=47
readme.x=10
readme.y=10
target1.height=70
@@ -49,61 +61,61 @@ target1.name=DatabaseConnector
target1.showInterface=false
target1.type=ClassTarget
target1.width=150
target1.x=370
target1.y=20
target2.height=70
target1.x=220
target1.y=80
target2.height=60
target2.name=QueryResult
target2.showInterface=false
target2.type=ClassTarget
target2.width=120
target2.x=110
target2.y=80
target3.height=70
target3.name=User
target2.width=100
target2.x=100
target2.y=600
target3.height=100
target3.name=Game
target3.showInterface=false
target3.type=ClassTarget
target3.width=120
target3.x=770
target3.y=50
target3.width=180
target3.x=680
target3.y=320
target4.height=70
target4.name=Game
target4.name=User
target4.showInterface=false
target4.type=ClassTarget
target4.width=120
target4.x=960
target4.y=30
target4.width=130
target4.x=930
target4.y=180
target5.height=70
target5.name=Server
target5.showInterface=false
target5.type=AbstractTarget
target5.width=120
target5.x=770
target5.y=300
target5.width=110
target5.x=310
target5.y=500
target6.height=70
target6.name=WordleServer
target6.showInterface=false
target6.type=ClassTarget
target6.width=120
target6.x=540
target6.y=210
target6.width=110
target6.x=480
target6.y=500
target7.height=70
target7.name=List
target7.name=Guest
target7.showInterface=false
target7.type=ClassTarget
target7.width=140
target7.x=390
target7.y=380
target8.height=70
target8.name=GUI
target7.width=130
target7.x=10
target7.y=180
target8.height=60
target8.name=List
target8.showInterface=false
target8.type=ClassTarget
target8.width=120
target8.x=630
target8.y=80
target8.width=150
target8.x=560
target8.y=640
target9.height=60
target9.name=Queue
target9.showInterface=false
target9.type=ClassTarget
target9.width=120
target9.x=80
target9.y=380
target9.width=160
target9.x=100
target9.y=520

206
umlet.uxf
View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.3.0">
<zoom_level>9</zoom_level>
<zoom_level>8</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>648</x>
<y>198</y>
<w>90</w>
<h>27</h>
<x>400</x>
<y>48</y>
<w>80</w>
<h>24</h>
</coordinates>
<panel_attributes>Server</panel_attributes>
<additional_attributes/>
@@ -15,10 +15,10 @@
<element>
<id>UMLClass</id>
<coordinates>
<x>648</x>
<y>315</y>
<w>90</w>
<h>27</h>
<x>400</x>
<y>152</y>
<w>80</w>
<h>24</h>
</coordinates>
<panel_attributes>WordleServer</panel_attributes>
<additional_attributes/>
@@ -26,10 +26,10 @@
<element>
<id>Relation</id>
<coordinates>
<x>684</x>
<y>216</y>
<w>27</w>
<h>117</h>
<x>432</x>
<y>64</y>
<w>24</w>
<h>104</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;10.0;110.0</additional_attributes>
@@ -37,45 +37,50 @@
<element>
<id>UMLClass</id>
<coordinates>
<x>171</x>
<y>405</y>
<w>261</w>
<h>351</h>
<x>448</x>
<y>424</y>
<w>248</w>
<h>384</h>
</coordinates>
<panel_attributes>User
<panel_attributes>Guest
--
-name: String
-password: String
-timesPlayed: int
-winPercentage: int
-winPercentage: float
-currentStreak: int
-maxStreak: int
-wonInTurn: int[]
--
+setPassword(String pw): void
+setPassword(String password): void
+getPassword(): String
+setName(String name): void
+getName(): String
+setWinPercentage(float winPercentage): void
+getWinPercentage(): float
+setTimesPlayed(int timesPlayed): void
+getTimesPlayed(): int
+setWinPercentage(int winPercentage): void
+getWinPercentage(): int
+increaseTimesPlayed(): void
+setCurrentStreak(int currentStreak): void
+getCurrentStreak(): int
+increaseCurrentStreak(): void
+setMaxStreak(int maxStreak): void
+getMaxStreak(): int
+setWonInTurn(int[] wonInTurn): void
+getWonInTurn(int turn): int</panel_attributes>
+increaseMaxStreak(): void
+setWonInTurn(int row, int value): void
+getWonInTurn(int row): int
+increaseWonInTurn(int row): void
+getWonInTurnFull(): int</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>306</x>
<y>297</y>
<w>126</w>
<h>27</h>
<x>96</x>
<y>136</y>
<w>112</w>
<h>24</h>
</coordinates>
<panel_attributes>DatabaseConnector</panel_attributes>
<additional_attributes/>
@@ -83,10 +88,10 @@
<element>
<id>Relation</id>
<coordinates>
<x>684</x>
<y>333</y>
<w>108</w>
<h>90</h>
<x>432</x>
<y>168</y>
<w>96</w>
<h>80</h>
</coordinates>
<panel_attributes>lt=&lt;.
-wordleServer</panel_attributes>
@@ -95,13 +100,16 @@
<element>
<id>UMLClass</id>
<coordinates>
<x>558</x>
<y>405</y>
<w>270</w>
<h>99</h>
<x>320</x>
<y>232</y>
<w>240</w>
<h>88</h>
</coordinates>
<panel_attributes>Game
--
-ip: String
-port: int
-wordle: String
-words: String[]
-wordCount: int
@@ -113,24 +121,10 @@
<element>
<id>UMLClass</id>
<coordinates>
<x>936</x>
<y>405</y>
<w>216</w>
<h>63</h>
</coordinates>
<panel_attributes>GUI
--
+setLetter(char letter): void
+setLetterColor(byte color): void</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>252</x>
<y>207</y>
<w>90</w>
<h>27</h>
<x>48</x>
<y>56</y>
<w>80</w>
<h>24</h>
</coordinates>
<panel_attributes>QueryResult</panel_attributes>
<additional_attributes/>
@@ -138,34 +132,22 @@
<element>
<id>Relation</id>
<coordinates>
<x>423</x>
<y>396</y>
<w>153</w>
<h>36</h>
<x>536</x>
<y>312</y>
<w>56</w>
<h>128</h>
</coordinates>
<panel_attributes>lt=&lt;.
-user</panel_attributes>
<additional_attributes>10.0;20.0;150.0;20.0</additional_attributes>
-guest</panel_attributes>
<additional_attributes>10.0;140.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>819</x>
<y>396</y>
<w>135</w>
<h>36</h>
</coordinates>
<panel_attributes>lt=&lt;.
-gui</panel_attributes>
<additional_attributes>130.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>423</x>
<y>297</y>
<w>198</w>
<h>126</h>
<x>200</x>
<y>136</y>
<w>176</w>
<h>112</h>
</coordinates>
<panel_attributes>lt=&lt;.
-databaseConnector</panel_attributes>
@@ -174,35 +156,69 @@
<element>
<id>UMLClass</id>
<coordinates>
<x>936</x>
<y>90</y>
<w>216</w>
<h>225</h>
<x>136</x>
<y>424</y>
<w>240</w>
<h>392</h>
</coordinates>
<panel_attributes>Letter
<panel_attributes>User
--
WHITE: byte = -1
GRAY: byte = 0
YELLOW: byte = 1
GREEN: byte = 2
-name: String
-letter: char
-color: byte
--
+setColor(byte color): void
+getColor(): byte</panel_attributes>
+setPassword(String password): void
+getPassword(): String
+setName(String name): void
+getName(): String
+setTimesPlayed(int timesPlayed): void
+getTimesPlayed(): int
+increaseTimesPlayed(): void
+setWinPercentage(float winPercentage): void
+getWinPercentage(): float
+setCurrentStreak(int currentStreak): void
+getCurrentStreak(): int
+increaseCurrentStreak(): void
+setMaxStreak(int maxStreak): void
+getMaxStreak(): int
+increaseMaxStreak(): void
+setWonInTurn(int row, int value): void
+getWonInTurn(int row): int
+getWonInTurnFull(): int</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1035</x>
<y>306</y>
<w>117</w>
<h>117</h>
<x>128</x>
<y>152</y>
<w>144</w>
<h>288</h>
</coordinates>
<panel_attributes>lt=&lt;.
-letters: Letter[][]</panel_attributes>
<additional_attributes>10.0;10.0;10.0;110.0</additional_attributes>
-databaseConnector</panel_attributes>
<additional_attributes>30.0;10.0;30.0;340.0;10.0;340.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>320</x>
<y>312</y>
<w>48</w>
<h>128</h>
</coordinates>
<panel_attributes>lt=&lt;.
-user</panel_attributes>
<additional_attributes>10.0;140.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>368</x>
<y>424</y>
<w>96</w>
<h>24</h>
</coordinates>
<panel_attributes>lt=&lt;&lt;-</panel_attributes>
<additional_attributes>100.0;10.0;10.0;10.0</additional_attributes>
</element>
</diagram>

BIN
wordle.db

Binary file not shown.