From 86beaad464152897cdd9aaf80057e95ef8c630d9 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 6 May 2025 12:49:22 +0200 Subject: [PATCH] =?UTF-8?q?Replay=20Funktion=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Database/ScoreManager/ScoreManager.js | 17 ++++++- backend/src/SocketIO/GameManager/Game/Game.js | 46 +++++++++++++++---- .../SocketIO/LobbyManager/Classes/Lobby.js | 3 +- .../LobbyManager/Classes/TemporaryLobby.js | 4 +- frontend/game/scripts/Game/UI/UIManager.js | 19 ++++++++ frontend/game/style/mainStyle.css | 9 +++- 6 files changed, 81 insertions(+), 17 deletions(-) diff --git a/backend/src/Database/ScoreManager/ScoreManager.js b/backend/src/Database/ScoreManager/ScoreManager.js index 1f1d8de..13dfdbf 100644 --- a/backend/src/Database/ScoreManager/ScoreManager.js +++ b/backend/src/Database/ScoreManager/ScoreManager.js @@ -25,13 +25,18 @@ class ScoreManager{ const selectSql = `SELECT * FROM scores WHERE id = ${insertId}`; const selectResult = await this.connection.promise().query(selectSql); + + const rank = await this.getRankById(insertId); - return new Score(selectResult[0][0]); + return new Score(selectResult[0][0], rank); } async getScoreById(id){ const response = await this.connection.promise().query(`SELECT * FROM scores WHERE id = ${id}`); - return new Score(response.rows[0][0]); + + const rank = await this.getRankById(id); + + return new Score(response[0][0], rank); } async getSplitedScoreCount(){ @@ -56,6 +61,14 @@ class ScoreManager{ return sortedScoreSplit; } + + async getRankById(id){ + const rankSql = `SELECT COUNT(*) + 1 AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE id = ${id})`; + const rankResult = await this.connection.promise().query(rankSql); + const rank = rankResult[0][0].rank; + + return rank; + } } module.exports = ScoreManager; \ No newline at end of file diff --git a/backend/src/SocketIO/GameManager/Game/Game.js b/backend/src/SocketIO/GameManager/Game/Game.js index 259166b..4fe5eac 100644 --- a/backend/src/SocketIO/GameManager/Game/Game.js +++ b/backend/src/SocketIO/GameManager/Game/Game.js @@ -1,5 +1,6 @@ const socketIO = require("socket.io"); const SocketUser = require("../../Classes/SocketUser"); +const TemporaryLobby = require("../../LobbyManager/Classes/TemporaryLobby"); const GameManager = require("../GameManager"); const GameLoop = require("./GameLoop"); const Snake = require("./Classes/Snake/Snake"); @@ -61,21 +62,46 @@ class Game{ } async endGame(msg){ - // TODO: Spielende in die Datenbank eintragen - this.gameStarted = false; - - const scoreDb = await this.gameManager.db.scoremanager.createScore({ - user1: this.playerIds[0], - user2: this.playerIds[1], - score: this.score - }); + let scoreDb = undefined; + if(this.gameStarted){ + scoreDb = await this.gameManager.db.scoremanager.createScore({ + user1: this.playerIds[0], + user2: this.playerIds[1], + score: this.score + }); + } - const rang = await this.gameManager.db.scoremanager.getScoreRang(scoreDb.id); + this.gameStarted = false; + + /* + Hinzufügen der Funktion zum erneuten Spielen + Nur wenn noch beide Spieler da sind + */ + + if(this.players.length === 2){ + const lobbyManager = this.gameManager.lobbyManager; + + const newUserList = []; + + this.players.forEach(x => { + const user = new SocketUser(x.id, x.username); + newUserList.push(user); + }) + + const tempLobby = new TemporaryLobby( + 0, + newUserList, + lobbyManager, + 10000 + ); + + lobbyManager.oldLobbys.push(tempLobby); + } this.io.to(`game-${this.code}`).emit("gameEnd", { msg: msg, score: this.score, - rang: rang + rang: scoreDb?.rank || "-" }); } diff --git a/backend/src/SocketIO/LobbyManager/Classes/Lobby.js b/backend/src/SocketIO/LobbyManager/Classes/Lobby.js index 8815ec8..6bf5e2b 100644 --- a/backend/src/SocketIO/LobbyManager/Classes/Lobby.js +++ b/backend/src/SocketIO/LobbyManager/Classes/Lobby.js @@ -89,7 +89,8 @@ class Lobby { const tempLobby = new TemporaryLobby( this.code, newUserList, - this.lobbyManager + this.lobbyManager, + 4000 ); this.lobbyManager.oldLobbys.push(tempLobby); diff --git a/backend/src/SocketIO/LobbyManager/Classes/TemporaryLobby.js b/backend/src/SocketIO/LobbyManager/Classes/TemporaryLobby.js index a9f5488..3647c6e 100644 --- a/backend/src/SocketIO/LobbyManager/Classes/TemporaryLobby.js +++ b/backend/src/SocketIO/LobbyManager/Classes/TemporaryLobby.js @@ -4,14 +4,14 @@ const SocketUser = require("../../Classes/SocketUser"); class TemporaryLobby{ /** @param { string } code @param {Array} users @param {LobbyManager} lobbyManager */ - constructor(code, users, lobbyManager){ + constructor(code, users, lobbyManager, destuctionTime){ this.code = code; this.users = users; this.lobbyManager = lobbyManager; this.gameCode = null; - setTimeout(this.selfDestroy.bind(this), 4000); + setTimeout(this.selfDestroy.bind(this), destuctionTime); } selfDestroy(){ diff --git a/frontend/game/scripts/Game/UI/UIManager.js b/frontend/game/scripts/Game/UI/UIManager.js index a913316..7ffe82f 100644 --- a/frontend/game/scripts/Game/UI/UIManager.js +++ b/frontend/game/scripts/Game/UI/UIManager.js @@ -118,6 +118,25 @@ class UIManager{ endDiv.appendChild(scoreDiv); + const replayButton = document.createElement("button"); + replayButton.id = "replayBtn"; + replayButton.innerHTML = ` +
+ + + +
+
+ Neue Runde +
+ `; + replayButton.addEventListener("click", () => { window.location.href = "/game" }) + endDiv.appendChild(replayButton); + const dashButton = document.createElement("button"); dashButton.id = "leaveBtn"; dashButton.innerHTML = ` diff --git a/frontend/game/style/mainStyle.css b/frontend/game/style/mainStyle.css index 4b6e3cf..b2233f5 100644 --- a/frontend/game/style/mainStyle.css +++ b/frontend/game/style/mainStyle.css @@ -68,8 +68,8 @@ img{ border-radius: 25px; border: 5px solid white; - height: 60vh; - width: 40vw; + height: 80vh; + width: 60vw; display: flex; flex-direction: column; @@ -101,4 +101,9 @@ img{ #reason{ color: rgb(197, 46, 46); font-weight: 700; + text-align: center; +} + +#replayBtn{ + background-color: orange; } \ No newline at end of file