Merge branch 'logic' into player-movement

# Conflicts:
#	Webservice/Player.js
This commit is contained in:
Thorsten Rausch 2021-06-17 19:02:58 +02:00
commit aa97939037
4 changed files with 59 additions and 61 deletions

View File

@ -1,26 +1,33 @@
const Player = require('./Player');
const Hunter = require("./Hunter");
class Game {
constructor() {
this.players = [];
this.whosNext = 0;
this.currentPlayerIndex = 0;
this.started = false;
this.round = 0;
this.hunter = new Hunter();
}
finish_turn() {
let move_to_next_round = false;
// move on to next player; skip dead players
do {
this.whosNext++;
if (this.whosNext === this.players.length) {
this.whosNext = 0;
this.round++;
this.currentPlayerIndex++;
if (this.currentPlayerIndex >= this.players.length) {
this.currentPlayerIndex = 0;
move_to_next_round = true;
}
} while (!this.players[this.whosNext].isAlive);
} while (!this.players[this.currentPlayerIndex].isAlive); // skip dead players
this.finish_round();
}
finish_round() {
this.round++;
// kill players with hunter
if (this.round >= 5) {
this.hunter.move(1);
this.hunter.move_by(1);
this.hunter.hunt(this.players);
}
// check if all players are dead
@ -28,6 +35,29 @@ class Game {
// todo: end game (all players are dead)
}
}
add_player(name) {
this.players.push(new Player(name));
}
remove_player(name) {
let index = this.get_player_index(name);
if (index !== -1) this.players.splice(index, 1);
if (this.currentPlayerIndex === index) this.finish_turn(); // if current player leaves: move on to next
}
current_player_is(name) {
return this.players[this.currentPlayerIndex].name === name;
}
get_player_index(name) {
return this.players.findIndex(player => player.name === name);
}
move_player(name, amount) {
let index = this.get_player_index(name);
this.players[index].move_by(amount);
}
}
module.exports = Game;

View File

@ -3,7 +3,7 @@ class Hunter {
this.position = 0;
}
move(amount) {
move_by(amount) {
this.position += amount;
}

View File

@ -1,35 +1,17 @@
class Player {
curr_field = 0 ;
coord_x = 0;
coord_y = 0;
constructor(socketUsername, sprites) {
this.socketUsername = socketUsername;
this.sprites = sprites;
constructor(name) {
this.name = name;
this.position = 0;
this.isAlive = true;
this.coord_x = sprites[0].getX();
this.coord_y = sprites[0].getY();
this.curr_field = 0;
}
getX(){
return this.coord_x;
}
getY(){
return this.coord_y;
}
move(amount) {
this.curr_field += amount;
this.coord_x = this.sprites[this.curr_field].getX();
this.coord_y = this.sprites[this.curr_field].getY();
if (this.position === 15) {
move_by(amount) {
this.position += amount;
//todo: move by 1 only on the last 3 fields
if (this.position >= 16) {
// todo: win
}
}
}
module.exports = Player;
module.exports = Player;

View File

@ -1,4 +1,3 @@
const Player = require('./Player');
const Game = require('./Game');
const express = require('express');
@ -50,7 +49,7 @@ io.on('connection', socket => {
}
if (gameState[socket.room].players.length < 4 && !gameState[socket.room].started) {
gameState[socket.room].players.push(new Player(socket.username));
gameState[socket.room].add_player(socket.username);
addedUser = true;
socket.emit('login');
@ -77,38 +76,21 @@ io.on('connection', socket => {
socket.on('disconnect', function () {
if (gameState[socket.room] !== undefined && addedUser) {
socket.broadcast.to(socket.room).emit('user left', socket.username);
let index = -1;
for (let i = 0; i < gameState[socket.room].players.length; i++) {
if (gameState[socket.room].players[i].socketUsername === socket.username) {
index = i;
break;
}
}
if (index > -1) {
gameState[socket.room].players.splice(index, 1);
}
gameState[socket.room].remove_player(socket.username);
socket.leave(socket.room);
if (gameState[socket.room].players.length === 0) {
delete gameState[socket.room];
}
if (gameState[socket.room].players.length === 0) delete gameState[socket.room];
}
generate_log_message(socket.room, socket.username, "LEFT", "");
});
// Game
socket.on('roll dice', function () {
if (gameState[socket.room] !== undefined && addedUser) {
if(gameState[socket.room].players[gameState[socket.room].whosNext] === undefined) {
console.log(gameState[socket.room].players)
console.log(gameState[socket.room].whosNext)
}
if (gameState[socket.room].players[gameState[socket.room].whosNext].socketUsername === socket.username) {
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;
@ -124,7 +106,7 @@ io.on('connection', socket => {
socket.on('get card', function (difficulty) {
if (gameState[socket.room] !== undefined && addedUser) {
if (gameState[socket.room].players[gameState[socket.room].whosNext].socketUsername === socket.username) {
if (gameState[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);
@ -136,11 +118,15 @@ io.on('connection', socket => {
socket.on('card finished', function (difficulty, answerIsCorrect) {
if (gameState[socket.room] !== undefined && addedUser) {
if (answerIsCorrect) gameState[socket.room].players[gameState[socket.room].whosNext].move(difficulty);
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');
let index = gameState[socket.room].get_player_index(socket.username);
io.in(socket.room).emit('player moved', {
"player": gameState[socket.room].whosNext,
"position": gameState[socket.room].players[gameState[socket.room].whosNext].position
"player": index,
"position": gameState[socket.room].players[index].position
});
gameState[socket.room].finish_turn();
}