diff --git a/Backend/schafkopf-client/src/main/java/org/schafkopf/BackendServer.java b/Backend/schafkopf-client/src/main/java/org/schafkopf/BackendServer.java index 200608c..4d169db 100644 --- a/Backend/schafkopf-client/src/main/java/org/schafkopf/BackendServer.java +++ b/Backend/schafkopf-client/src/main/java/org/schafkopf/BackendServer.java @@ -48,13 +48,15 @@ public class BackendServer implements MessageSender { // Configure CORS settings configureCors(context); - URL webContentUrl = getClass().getClassLoader().getResource("web-content"); - if (webContentUrl == null) { - throw new RuntimeException("Unable to find 'web-content' directory"); + if (openFrontend) { + URL webContentUrl = getClass().getClassLoader().getResource("web-content"); + if (webContentUrl == null) { + throw new RuntimeException("Unable to find 'web-content' directory"); + } + String webContentPath = webContentUrl.toExternalForm(); + context.setResourceBase(webContentPath); + context.addServlet(new ServletHolder("frontend", DefaultServlet.class), "/"); } - String webContentPath = webContentUrl.toExternalForm(); - context.setResourceBase(webContentPath); - context.addServlet(new ServletHolder("frontend", DefaultServlet.class), "/"); // Configure specific websocket behavior JettyWebSocketServletContainerInitializer.configure( diff --git a/Backend/schafkopf-client/src/main/java/org/schafkopf/DedicatedServerConnection.java b/Backend/schafkopf-client/src/main/java/org/schafkopf/DedicatedServerConnection.java index 0f6fd5e..e83aedf 100644 --- a/Backend/schafkopf-client/src/main/java/org/schafkopf/DedicatedServerConnection.java +++ b/Backend/schafkopf-client/src/main/java/org/schafkopf/DedicatedServerConnection.java @@ -2,7 +2,6 @@ package org.schafkopf; import com.google.gson.JsonObject; import java.net.URI; -import java.net.URISyntaxException; import java.util.concurrent.CountDownLatch; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; @@ -31,20 +30,11 @@ public class DedicatedServerConnection implements MessageSender { * Class that represents one Frontend Connection. */ public DedicatedServerConnection(String address, MessageListener messageListener) { - URI uri = null; - try { - uri = new URI(address); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - this.messageListener = messageListener; this.closeLatch = new CountDownLatch(1); this.connectionLatch = new CountDownLatch(1); - String host = uri.getHost(); - int port = uri.getPort(); - connect("ws://" + host + ":" + port); + connect("ws://" + address); try { connectionLatch.await(); // Wait until the connection is established } catch (InterruptedException e) { diff --git a/Backend/schafkopf-shared/src/main/java/org/schafkopf/Schafkopf.java b/Backend/schafkopf-shared/src/main/java/org/schafkopf/Schafkopf.java index 25fbb88..361c30c 100644 --- a/Backend/schafkopf-shared/src/main/java/org/schafkopf/Schafkopf.java +++ b/Backend/schafkopf-shared/src/main/java/org/schafkopf/Schafkopf.java @@ -1,12 +1,9 @@ package org.schafkopf; -import com.google.gson.Gson; -import com.google.gson.JsonObject; import org.schafkopf.GameState.GamePhase; import org.schafkopf.SchafkopfException.NotEnoughPlayersException; import org.schafkopf.SchafkopfMessage.SchafkopfBaseMessage; import org.schafkopf.SchafkopfMessage.SchafkopfMessageType; -import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenUtil; @@ -79,23 +76,15 @@ public class Schafkopf { } for (Player currentPlayer : player) { - if (currentPlayer instanceof OnlinePlayer) { - Karte[] karten = new Karte[8]; + if (currentPlayer instanceof OnlinePlayer onlinePlayer) { + KartenListe karten = new KartenListe(); for (int i = 7; i >= 0; i--) { - karten[i] = austeilen.removeKarten(austeilen.getByIndex(i)); + karten.addKarten(austeilen.removeKarten(austeilen.getByIndex(i))); } - Gson gson = new Gson(); - JsonObject messageObject = new JsonObject(); - messageObject.add("cards", gson.toJsonTree(karten)); - - messageSender.sendMessage( - new SchafkopfBaseMessage(SchafkopfMessageType.ONLINE_PLAYER_HAND, messageObject)); + onlinePlayer.setAndSendPlayerCards(karten); } } - // spielThread = new Thread(() -> new Spielablauf(this, spiel)); - // - // spielThread.start(); new Spielablauf(this, spiel); } } diff --git a/Backend/schafkopf-shared/src/main/java/org/schafkopf/karte/KartenListe.java b/Backend/schafkopf-shared/src/main/java/org/schafkopf/karte/KartenListe.java index b90adaa..09639f5 100644 --- a/Backend/schafkopf-shared/src/main/java/org/schafkopf/karte/KartenListe.java +++ b/Backend/schafkopf-shared/src/main/java/org/schafkopf/karte/KartenListe.java @@ -1,7 +1,7 @@ package org.schafkopf.karte; import com.google.gson.Gson; -import com.google.gson.JsonObject; +import com.google.gson.JsonElement; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -25,6 +25,19 @@ public class KartenListe { return this.kartenListe; } + /** + * A Class that represents a list of Cards. + */ + public void sort() { + KartenListe completeDeck = KartenUtil.initializeSchafKopfCardDeck(); + completeDeck.removeKarten(this); + + KartenListe completeDeck2 = KartenUtil.initializeSchafKopfCardDeck(); + completeDeck2.removeKarten(completeDeck); + + this.kartenListe = completeDeck2.getKartenListe(); + } + public void shuffle() { Collections.shuffle(this.kartenListe); } @@ -185,12 +198,10 @@ public class KartenListe { /** * A Class that represents a list of Cards. */ - public JsonObject getJson() { + public JsonElement getJson() { Gson gson = new Gson(); - JsonObject jsonObject = new JsonObject(); - jsonObject.add("cards", gson.toJsonTree(this.kartenListe)); - return jsonObject; + return gson.toJsonTree(this.kartenListe); } public boolean isEmpty() { diff --git a/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/BotPlayer.java b/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/BotPlayer.java index fa35c28..b55bc54 100644 --- a/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/BotPlayer.java +++ b/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/BotPlayer.java @@ -5,7 +5,9 @@ import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenUtil; import org.schafkopf.spielcontroller.SpielController; -/** Player that represents the Bot. */ +/** + * Player that represents the Bot. + */ public class BotPlayer extends Player { private KartenListe eigeneKarten; @@ -32,9 +34,12 @@ public class BotPlayer extends Player { return card; } - /** Set the Cards of the Player. */ + /** + * Set the Cards of the Player. + */ public void setCards(KartenListe cards) { System.out.println("Eigene Karte setzen"); + cards.sort(); this.eigeneKarten = cards; this.unbekannteKarten = KartenUtil.initializeSchafKopfCardDeck(); this.unbekannteKarten.removeKarten(eigeneKarten); diff --git a/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/OnlinePlayer.java b/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/OnlinePlayer.java index eaf963f..d02742a 100644 --- a/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/OnlinePlayer.java +++ b/Backend/schafkopf-shared/src/main/java/org/schafkopf/player/OnlinePlayer.java @@ -1,5 +1,6 @@ package org.schafkopf.player; +import com.google.gson.JsonObject; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import org.schafkopf.MessageSender; @@ -17,13 +18,26 @@ public class OnlinePlayer extends Player { private final MessageSender messageSender; private final BlockingQueue receivedCardQueue = new LinkedBlockingQueue<>(); + private KartenListe karten = new KartenListe(); + public OnlinePlayer(MessageSender messageSender) { this.messageSender = messageSender; } + /** + * A Class that represents a list of Cards. + */ + public void setAndSendPlayerCards(KartenListe karten) { + karten.sort(); + this.karten = karten; + + sendPlayerCards(); + } + @Override public Karte play(SpielController spiel, KartenListe tischKarten, KartenListe gespielteKarten) throws InterruptedException { + sendPlayerCards(); Karte spielKarte = null; // Send the message to request the card from the frontend @@ -32,10 +46,20 @@ public class OnlinePlayer extends Player { spielKarte = receivedCardQueue.take(); + this.karten.removeKarten(spielKarte); + sendPlayerCards(); System.out.println("Karte gespielt: " + spielKarte); return spielKarte; } + private void sendPlayerCards() { + JsonObject messageObject = new JsonObject(); + messageObject.add("cards", this.karten.getJson()); + + messageSender.sendMessage( + new SchafkopfBaseMessage(SchafkopfMessageType.ONLINE_PLAYER_HAND, messageObject)); + } + /** * Class that represents one Frontend Connection. */ diff --git a/Frontend/src/pages/DedicatedGame.vue b/Frontend/src/pages/DedicatedGame.vue index 17c2142..27e4523 100644 --- a/Frontend/src/pages/DedicatedGame.vue +++ b/Frontend/src/pages/DedicatedGame.vue @@ -29,12 +29,6 @@ function joinGame(): void { } function sendCard(cardInput: Card): void { - const index = botCards.value!.findIndex(card => card === cardInput); - - // If card exists in the array, remove it - if (index !== -1) { - botCards.value!.splice(index, 1); - } backendConnection.sendMessage(MessageType.PLAYER_CARD, {card: cardInput}); } diff --git a/Frontend/src/pages/MainMenu.vue b/Frontend/src/pages/MainMenu.vue index 435fdf2..9d23c59 100644 --- a/Frontend/src/pages/MainMenu.vue +++ b/Frontend/src/pages/MainMenu.vue @@ -6,7 +6,7 @@ import {BackendMessage, MessageType} from "../BackendMessage.ts"; const backendConnection = scg("BackendConnection"); -const serverAddress = ref("http://10.6.9.57:8085/") +const serverAddress = ref("10.6.9.57:8085") const isConnected = ref(false); const isPingInProgress = ref(false); const secondsRemaining = ref(10); @@ -30,7 +30,7 @@ async function checkConnection(): Promise { } try { // Try to fetch a resource from the internet - await fetch(serverAddress.value + "health", {mode: "no-cors"}) + await fetch("http://" + serverAddress.value + "/health", {mode: "no-cors"}) // If successful, set isConnected to true isConnected.value = true; } catch (error) {