From 494109de79ea1b02ff6daf4b37ccca1f75f274a0 Mon Sep 17 00:00:00 2001 From: Thorsten Rausch Date: Fri, 18 Jun 2021 13:03:25 +0200 Subject: [PATCH 1/4] add Game.currentState to indicate whether games are won/lost --- Webservice/Game.js | 54 ++++++++++++++++++++------- Webservice/Player.js | 3 -- Webservice/server.js | 88 ++++++++++++++++++++++++++------------------ 3 files changed, 92 insertions(+), 53 deletions(-) diff --git a/Webservice/Game.js b/Webservice/Game.js index ccef9d2..f3434bb 100644 --- a/Webservice/Game.js +++ b/Webservice/Game.js @@ -1,45 +1,58 @@ const Player = require('./Player'); const Hunter = require("./Hunter"); + class Game { + + static MAX_PLAYERS = 4; + + static STATUS = { + SETTING_UP: 0, + ONGOING: 1, + IS_DRAW: 2, + IS_WON: 3 + } + constructor() { + this.currentStatus = Game.STATUS.SETTING_UP; this.players = []; this.currentPlayerIndex = 0; - this.started = false; + this.winnerIndex = 0; this.round = 0; this.hunter = new Hunter(); } finish_turn() { - let move_to_next_round = false; - // move on to next player; skip dead players - do { - if (this.players.length === 0) break; + this.update_game_status(); + if (this.currentStatus !== Game.STATUS.ONGOING) return; + if (!this.players.some(player => player.isAlive === true)) return; + + let roundIsOver = false; + do { this.currentPlayerIndex++; if (this.currentPlayerIndex >= this.players.length) { this.currentPlayerIndex = 0; - move_to_next_round = true; + roundIsOver = true; } } while (!this.players[this.currentPlayerIndex].isAlive); // skip dead players - this.finish_round(); + + if (roundIsOver) this.#finish_round(); } - finish_round() { + #finish_round() { this.round++; - // kill players with hunter if (this.round >= 5) { this.hunter.move_by(1); this.hunter.hunt(this.players); } - // check if all players are dead - if (!this.players.some(player => player.isAlive === true)) { - // todo: end game (all players are dead) - } + this.update_game_status(); } add_player(name) { - this.players.push(new Player(name)); + let canAddPlayer = this.players.length < Game.MAX_PLAYERS; + if (canAddPlayer) this.players.push(new Player(name)); + return canAddPlayer; } remove_player(name) { @@ -52,6 +65,7 @@ class Game { } current_player_is(name) { + if (this.players[this.currentPlayerIndex] === undefined) return false; return this.players[this.currentPlayerIndex].name === name; } @@ -61,7 +75,19 @@ class Game { move_player(name, amount) { let index = this.get_player_index(name); + if (index === -1) return; this.players[index].move_by(amount); + this.update_game_status(); + } + + update_game_status() { + if (!this.players.some(player => player.isAlive === true)) this.currentStatus = Game.STATUS.IS_DRAW; + + let index = this.players.findIndex(player => player.position > 15); + if (index !== -1) { + this.currentStatus = Game.STATUS.IS_WON; + this.winnerIndex = index; + } } } diff --git a/Webservice/Player.js b/Webservice/Player.js index 7e80fca..0291d75 100644 --- a/Webservice/Player.js +++ b/Webservice/Player.js @@ -8,9 +8,6 @@ class Player { move_by(amount) { this.position += amount; //todo: move by 1 only on the last 3 fields - if (this.position >= 16) { - // todo: win - } } } diff --git a/Webservice/server.js b/Webservice/server.js index 12e3159..e8ae6c3 100644 --- a/Webservice/server.js +++ b/Webservice/server.js @@ -9,7 +9,7 @@ const {Server} = require("socket.io"); const io = new Server(server); let cards = JSON.parse(fs.readFileSync(__dirname + '/../data/fragen_10_06_21_final_new_format.json')); -let gameState = {}; +let game = {}; let port = 5000; server.listen(port, function () { @@ -44,12 +44,12 @@ io.on('connection', socket => { socket.username = data.username; socket.room = data.room_name; - if (gameState[socket.room] === undefined) { - gameState[socket.room] = new Game(); + if (game[socket.room] === undefined) { + game[socket.room] = new Game(); } - if (gameState[socket.room].players.length < 4 && !gameState[socket.room].started) { - gameState[socket.room].add_player(socket.username); + if (game[socket.room].add_player(socket.username)) { + addedUser = true; socket.emit('login'); @@ -64,7 +64,7 @@ io.on('connection', socket => { }); socket.on('new message', function (data) { - if (gameState[socket.room] !== undefined && addedUser) { + if (game[socket.room] !== undefined && addedUser) { socket.broadcast.to(socket.room).emit('new message', { username: socket.username, message: data @@ -75,15 +75,15 @@ io.on('connection', socket => { }); socket.on('disconnect', function () { - if (gameState[socket.room] !== undefined && addedUser) { + if (game[socket.room] !== undefined && addedUser) { socket.broadcast.to(socket.room).emit('user left', socket.username); - gameState[socket.room].remove_player(socket.username); + game[socket.room].remove_player(socket.username); // TODO Close card if card is opened and active player left socket.leave(socket.room); - if (gameState[socket.room].players.length === 0) delete gameState[socket.room]; + if (game[socket.room].players.length === 0) delete game[socket.room]; } generate_log_message(socket.room, socket.username, "LEFT", ""); @@ -91,51 +91,67 @@ io.on('connection', socket => { // Game socket.on('roll dice', function () { - if (gameState[socket.room] !== undefined && addedUser) { - if (gameState[socket.room].current_player_is(socket.username)) { - gameState[socket.room].started = true; - let sides = 3; - let randomNumber = Math.floor(Math.random() * sides) + 1; + if (game[socket.room] === undefined || !addedUser) return; - io.in(socket.room).emit('dice', randomNumber); + if (game[socket.room].current_player_is(socket.username)) { + game[socket.room].currentStatus = Game.STATUS.ONGOING; + let sides = 3; + let randomNumber = Math.floor(Math.random() * sides) + 1; - generate_log_message(socket.room, socket.username, "DICE", randomNumber); - } else { - io.to(socket.id).emit('error', 'It\'s not your turn'); - } + io.in(socket.room).emit('dice', randomNumber); + + generate_log_message(socket.room, socket.username, "DICE", randomNumber); + } else { + io.to(socket.id).emit('error', 'It\'s not your turn'); } + }); socket.on('get card', function (difficulty) { - if (gameState[socket.room] !== undefined && addedUser) { - if (gameState[socket.room].current_player_is(socket.username)) { - io.in(socket.room).emit('card', {'username': socket.username, 'card': getRandomCard(difficulty)}); + if (game[socket.room] === undefined || !addedUser) return; + if (game[socket.room].currentStatus !== Game.STATUS.ONGOING) return; - generate_log_message(socket.room, socket.username, "CARD", difficulty); - } else { - io.to(socket.id).emit('error', 'It\'s not your turn'); - } + if (game[socket.room].current_player_is(socket.username)) { + io.in(socket.room).emit('card', {'username': socket.username, 'card': getRandomCard(difficulty)}); + + generate_log_message(socket.room, socket.username, "CARD", difficulty); + } else { + io.to(socket.id).emit('error', 'It\'s not your turn'); } + }); socket.on('card finished', function (difficulty, answerIsCorrect) { - if (gameState[socket.room] !== undefined && addedUser) { - if (answerIsCorrect) { - gameState[socket.room].move_player(socket.username, difficulty); - generate_log_message(socket.room, socket.username, "MOVE", difficulty); - } - io.in(socket.room).emit('card destroyed'); - gameState[socket.room].finish_turn(); + if (game[socket.room] === undefined || !addedUser) return; + if (game[socket.room].currentStatus !== Game.STATUS.ONGOING) return; - let index = gameState[socket.room].get_player_index(socket.username); - let next_player = gameState[socket.room].players[gameState[socket.room].currentPlayerIndex].name; + io.in(socket.room).emit('card destroyed'); + if (answerIsCorrect) { + game[socket.room].move_player(socket.username, difficulty); + generate_log_message(socket.room, socket.username, "MOVE", difficulty); + + let index = game[socket.room].get_player_index(socket.username); + let next_player = game[socket.room].players[game[socket.room].currentPlayerIndex].name; io.in(socket.room).emit('player moved', { "next_player": next_player, "player": index, - "position": gameState[socket.room].players[index].position + "position": game[socket.room].players[index].position }); } + + game[socket.room].finish_turn(); + + switch (game[socket.room].currentStatus) { + case Game.STATUS.IS_WON: + //TODO show clients the winner + break; + case Game.STATUS.IS_DRAW: + //TODO show clients that nobody wins + break; + default: + break; + } }); }); -- 2.45.2 From 0e4fd1993346905a95bcfb712334a6058cba6cbe Mon Sep 17 00:00:00 2001 From: Thorsten Rausch Date: Fri, 18 Jun 2021 13:06:41 +0200 Subject: [PATCH 2/4] make WIN_POSITION a static member --- Webservice/Game.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Webservice/Game.js b/Webservice/Game.js index f3434bb..c54f0e0 100644 --- a/Webservice/Game.js +++ b/Webservice/Game.js @@ -1,11 +1,10 @@ const Player = require('./Player'); const Hunter = require("./Hunter"); - class Game { static MAX_PLAYERS = 4; - + static WIN_POSITION = 16; static STATUS = { SETTING_UP: 0, ONGOING: 1, @@ -83,7 +82,7 @@ class Game { update_game_status() { if (!this.players.some(player => player.isAlive === true)) this.currentStatus = Game.STATUS.IS_DRAW; - let index = this.players.findIndex(player => player.position > 15); + let index = this.players.findIndex(player => player.position >= Game.WIN_POSITION); if (index !== -1) { this.currentStatus = Game.STATUS.IS_WON; this.winnerIndex = index; -- 2.45.2 From 9a37f674b31d3f4a8b336b3ae6d41678b4e536f4 Mon Sep 17 00:00:00 2001 From: H4CK3R-01 Date: Fri, 18 Jun 2021 13:18:25 +0200 Subject: [PATCH 3/4] fixed duplicate messages --- public/js/chat.js | 37 ------------------------------------- public/js/index.js | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/public/js/chat.js b/public/js/chat.js index e758a5a..2ab44df 100644 --- a/public/js/chat.js +++ b/public/js/chat.js @@ -1,43 +1,6 @@ let socket; let connected = false; -function start_chat() { - socket.on('login', function () { - connected = true; - - document.getElementById('login').style.display = 'none'; - document.getElementById('game').style.display = 'flex'; - document.getElementById('chat').style.display = 'flex'; - start_chat(); - start_game(); - resize(); - - addLogMessage("Welcome " + username + "!"); - }); - - socket.on('error', function (data) { - if (data === 'Game started already or room has two many members') { - document.getElementById('login').style.display = 'flex'; - document.getElementById('game').style.display = 'none'; - document.getElementById('chat').style.display = 'none'; - document.getElementById('error').innerText = data; - } - console.log(data); - }); - - socket.on('new message', function (data) { - addChatMessage(data); - }); - - socket.on('user joined', function (data) { - addLogMessage(data + ' joined'); - }); - - socket.on('user left', function (data) { - addLogMessage(data + ' left'); - }); -} - function sendMessage() { let message = document.getElementById('message_input').value; diff --git a/public/js/index.js b/public/js/index.js index 93968bd..8493e39 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -14,8 +14,41 @@ document.getElementById('ok').addEventListener('click', function () { closeOnBeforeunload: false }); - start_chat(); - // Login socket.emit('add user', {'username': username, 'room_name': room_name}); + + + socket.on('login', function () { + connected = true; + + document.getElementById('login').style.display = 'none'; + document.getElementById('game').style.display = 'flex'; + document.getElementById('chat').style.display = 'flex'; + start_game(); + resize(); + + addLogMessage("Welcome " + username + "!"); + }); + + socket.on('error', function (data) { + if (data === 'Game started already or room has two many members') { + document.getElementById('login').style.display = 'flex'; + document.getElementById('game').style.display = 'none'; + document.getElementById('chat').style.display = 'none'; + document.getElementById('error').innerText = data; + } + console.log(data); + }); + + socket.on('new message', function (data) { + addChatMessage(data); + }); + + socket.on('user joined', function (data) { + addLogMessage(data + ' joined'); + }); + + socket.on('user left', function (data) { + addLogMessage(data + ' left'); + }); }); \ No newline at end of file -- 2.45.2 From 81782cdd25775df69be7eb4bc6f52b3a615b5242 Mon Sep 17 00:00:00 2001 From: Thorsten Rausch Date: Fri, 18 Jun 2021 13:27:53 +0200 Subject: [PATCH 4/4] add/remove comments --- Webservice/Player.js | 1 - Webservice/server.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Webservice/Player.js b/Webservice/Player.js index 0291d75..f04a288 100644 --- a/Webservice/Player.js +++ b/Webservice/Player.js @@ -7,7 +7,6 @@ class Player { move_by(amount) { this.position += amount; - //todo: move by 1 only on the last 3 fields } } diff --git a/Webservice/server.js b/Webservice/server.js index e8ae6c3..98e2176 100644 --- a/Webservice/server.js +++ b/Webservice/server.js @@ -145,6 +145,7 @@ io.on('connection', socket => { switch (game[socket.room].currentStatus) { case Game.STATUS.IS_WON: //TODO show clients the winner + //game[socket.room].winnerIndex break; case Game.STATUS.IS_DRAW: //TODO show clients that nobody wins -- 2.45.2