From 10ac955c5ae4369bdb233a8c6d8193679b592ee1 Mon Sep 17 00:00:00 2001 From: Nicolas Fritz Date: Sat, 21 Jan 2023 22:24:53 +0100 Subject: [PATCH] =?UTF-8?q?nextTurn()=20hinzugef=C3=BCgt=20+=20Kartenmetho?= =?UTF-8?q?den?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uno/node/js/Game.js | 76 ++++++++++++++++++++++-- uno/node/js/Player.js | 11 ++++ uno/node/js/cards/Card.js | 17 +++++- uno/node/js/cards/special/ChooseColor.js | 13 +++- uno/node/js/cards/special/PlusAmount.js | 14 ++++- uno/node/js/cards/special/Reverse.js | 9 ++- uno/node/js/cards/special/Skip.js | 9 ++- uno/node/tests/test_Card.test.js | 14 ++--- uno/node/tests/test_Game.test.js | 2 +- uno/node/tests/test_Player.test.js | 1 + 10 files changed, 143 insertions(+), 23 deletions(-) diff --git a/uno/node/js/Game.js b/uno/node/js/Game.js index 6e5677d..e78b26b 100644 --- a/uno/node/js/Game.js +++ b/uno/node/js/Game.js @@ -6,6 +6,7 @@ const PlusAmount = require("./cards/special/PlusAmount"); const Reverse = require("./cards/special/Reverse"); const uno = require("./uno"); const Player = require("./Player"); +const {CARD_COLORS} = require("./uno"); //Um generatePool zu exportieren, muss es in eine Klasse konvertiert werden class Game { @@ -41,6 +42,20 @@ class Game { } + start(){ + if (this._cardPool === [] || this._players === []){ + this.initGame(); + } + + + + + } + + gameLoop(){ + + } + //Gibt ein Array zurück mit allen Karten, die in einem Uno Spiel sind generatePool(){ @@ -53,14 +68,14 @@ class Game { //Special Karten werden hinzugefügt for (let j = 1; j < (uno.CARD_COLORS.length); j++) { - pool.push(new Reverse("R", uno.CARD_COLORS[j])); // 8x Reverse - pool.push(new PlusAmount("+2", uno.CARD_COLORS[j])); // 8x +2 - pool.push(new Skip("S", uno.CARD_COLORS[j])); // 8x Skip + pool.push(new Reverse(uno.CARD_COLORS[j], this)); // 8x Reverse + pool.push(new PlusAmount(this, uno.CARD_COLORS[j])); // 8x +2 + pool.push(new Skip(uno.CARD_COLORS[j], this)); // 8x Skip if (k === 0) { - pool.push(new ChooseColor("CC")); // 4x ChooseColor - pool.push(new PlusAmount("+4", uno.CARD_COLORS[0])); // 4x +4 + pool.push(new ChooseColor(this)); // 4x ChooseColor + pool.push(new PlusAmount(this)); // 4x +4 } @@ -68,7 +83,7 @@ class Game { for (let i = 0; i <= 9; i++) { if (k === 1 && i === 0) continue; - pool.push(new Card(i, uno.CARD_COLORS[j])); // 76x (2x 4x 1-9 + 4x 0) + pool.push(new Card(i, uno.CARD_COLORS[j], this)); // 76x (2x 4x 1-9 + 4x 0) } @@ -95,6 +110,47 @@ class Game { //Beendet den Zug des aktuellen Spielers und beginnt den Zug des nächsten Spielers nextTurn(){ + //Testet ob Spiel Gewonnen + for (let i = 0; i < this._players.length; i++){ + if(this._players[i].hand.length <= 0){ + + return; + } + } + + this._currentPlayer.canPlay = false; + + //nächster Spieler + this._currentPlayer = this.nextPlayer(); + + this.refreshCanPutCard(); + + + } + + refreshCanPutCard(){ + let currentPlayerCards = this._players[this._currentPlayer].hand; + + for(let i = 0; i < currentPlayerCards.length; i++){ + if(this._cardOnDeck.name.toString() === currentPlayerCards[i].name.toString() || + this._cardPool._color === currentPlayerCards[i].color || + currentPlayerCards[i].color === CARD_COLORS[0] || + this.cardOnDeck.color === CARD_COLORS[0]) { + this._players[this._currentPlayer].hand[i].canPut = true; + + if(!this._players[this._currentPlayer].canPlay) + this._players[this._currentPlayer].canPlay = true; + } else { + this._players[this._currentPlayer].hand[i].canPut = false; + } + } + } + + nextPlayer(){ + if(this._direction === 1) + return (this._currentPlayer === this._players.length - 1) ? 0 : this._currentPlayer + 1; //bei normaler Richtung + else + return (this._currentPlayer === 0) ? this._players.length - 1 : this._currentPlayer - 1; //bei Invertierter Richtung } //Gib den Pool mit allen UnoKarten zurück @@ -117,6 +173,14 @@ class Game { this._cardOnDeck = card; } + get currentPlayer(){ + return this._currentPlayer; + } + + get direction(){ + return this._direction; + } + } //Exportiert Modul Game diff --git a/uno/node/js/Player.js b/uno/node/js/Player.js index 1f5658a..5dd4dc7 100644 --- a/uno/node/js/Player.js +++ b/uno/node/js/Player.js @@ -1,4 +1,6 @@ //Klasse Player für Spieler einer Uno Runde +const uno = require("./uno"); + class Player { //Erstellt ein Spieler mit einem Namen und dem Spiel, in dem er teilnimmt @@ -32,9 +34,14 @@ class Player { putCard(index){ //Karte muss hinterlegt haben, dass sie gelegt werden kann if(!this._hand[index].canPut) return; + if(this._turn === false) return; //Wenn eine Karte auf dem Tisch liegt, soll diese erst wieder dem cardPool hinzugefügt werden if(this._game.cardOnDeck != null){ + + if(this._game.cardOnDeck.name === "CC" || this._game.cardOnDeck.name === "+4") + this._game.cardOnDeck.color = uno.CARD_COLORS[0]; + this._game.cardPool.push(this._game.cardOnDeck); } @@ -56,6 +63,10 @@ class Player { return this._turn; } + set turn(bool){ + this._turn = bool; + } + //Gibt zurück, ob der Spieler eine Karte legen kann get canPlay(){ return this._canPlay; diff --git a/uno/node/js/cards/Card.js b/uno/node/js/cards/Card.js index fd3c5f5..8a61ebe 100644 --- a/uno/node/js/cards/Card.js +++ b/uno/node/js/cards/Card.js @@ -3,8 +3,9 @@ class Card { //Konstruktor für das Erstellen einer Karte - constructor(name, color) { + constructor(name, color, gameInstanz) { + this._game = gameInstanz; this._onScreen = false; //Die Karte wird bei Erstellung noch nicht auf dem Bildschirm angezeigt this._canPut = false; //Die Karte kann bei Erstellung nicht gelegt werden this._name = name; //Name der Karte (z.B. 0,1...,9,+2,+4,CC,R,S) @@ -12,6 +13,12 @@ class Card { } + putSelf(){ + + this.game.nextTurn(); + + } + //Gibt den Namen der Karte zurück get name() { return this._name; @@ -27,11 +34,19 @@ class Card { return this._color; } + set color(color) { + this._color = color; + } + //Gibt zurück ob die Karte sich auf dem Bildschirm befindet get onScreen() { return this._onScreen; } + get game(){ + return this._game; + } + //Setzt, ob die Karte gelegt werden kann, oder nicht set canPut(bool){ this._canPut = bool; diff --git a/uno/node/js/cards/special/ChooseColor.js b/uno/node/js/cards/special/ChooseColor.js index f351c23..7319eec 100644 --- a/uno/node/js/cards/special/ChooseColor.js +++ b/uno/node/js/cards/special/ChooseColor.js @@ -1,18 +1,27 @@ //Imports const Card = require('../Card'); const uno = require('../../uno'); +const {CARD_COLORS} = require("../../uno"); //Klasse ChooseColor für FarbWahlKarten class ChooseColor extends Card { //Konstruktor für das Erstellen einer ChooseColor-Karte - constructor(name) { + constructor(gameInstanz) { //An Konstruktor von Cards weitergeben - super(name, uno.CARD_COLORS[0]); + super("CC", uno.CARD_COLORS[0]); } + putSelf() { + + //Todo: Spieler Möglichkeit geben Farbe zu wählen, nicht random + this._color = CARD_COLORS[Math.floor(Math.random() * 4) + 1]; + + super.putSelf(); + } + } //Exportiert Modul ChooseColor diff --git a/uno/node/js/cards/special/PlusAmount.js b/uno/node/js/cards/special/PlusAmount.js index b936ae5..5b32590 100644 --- a/uno/node/js/cards/special/PlusAmount.js +++ b/uno/node/js/cards/special/PlusAmount.js @@ -6,16 +6,26 @@ const Card = require('../Card'); class PlusAmount extends Card { //Konstruktor für das Erstellen einer PlusAmount-Karte (+4/+2) - constructor(name, color = uno.CARD_COLORS[0]) { + constructor(gameInstanz, color = uno.CARD_COLORS[0]) { + + //An Konstruktor von Cards weitergeben - super(name, color); + super((color === uno.CARD_COLORS[0]) ? "+4" : "+2", color, gameInstanz); //Wenn keine Farbe beim Konstruktor übergeben wird, plus = 4, sonst plus = 2 if (color === uno.CARD_COLORS[0]) this._plus = 4; else this._plus = 2; } + putSelf() { + + //Todo: Karten Stapeln Regel + this.game.players[this.game.nextPlayer()].drawCard(this._plus); + + super.putSelf(); + } + //Gibt den PlusWert der Karte zurück get plus() { return this._plus; diff --git a/uno/node/js/cards/special/Reverse.js b/uno/node/js/cards/special/Reverse.js index 1245ade..a2c214c 100644 --- a/uno/node/js/cards/special/Reverse.js +++ b/uno/node/js/cards/special/Reverse.js @@ -5,13 +5,18 @@ const Card = require('../Card'); class Reverse extends Card { //Konstruktor für das Erstellen einer Reverse-Karte - constructor(name, color) { + constructor(color, gameInstanz) { //An Konstruktor von Cards weitergeben - super(name, color); + super("R", color, gameInstanz); } + putSelf() { + this.game.direction = this.game.direction % 2 + 1; + super.putSelf(); + } + } //Exportiert Modul Reverse diff --git a/uno/node/js/cards/special/Skip.js b/uno/node/js/cards/special/Skip.js index 69e3102..37473c1 100644 --- a/uno/node/js/cards/special/Skip.js +++ b/uno/node/js/cards/special/Skip.js @@ -5,13 +5,18 @@ const Card = require('../Card'); class Skip extends Card { //Konstruktor für das Erstellen einer Skip-Karte - constructor(name, color) { + constructor(color, gameInstanz) { //An Konstruktor von Cards weitergeben - super(name, color); + super("S", color, gameInstanz); } + putSelf() { + this.game.currentPlayer = this.game.nextPlayer(); + super.putSelf(); + } + } //Exportiert Modul Skip diff --git a/uno/node/tests/test_Card.test.js b/uno/node/tests/test_Card.test.js index d42c71b..f560bc5 100644 --- a/uno/node/tests/test_Card.test.js +++ b/uno/node/tests/test_Card.test.js @@ -18,7 +18,7 @@ describe('Karten erstellen', () => { //Erstellen einer normalen Karte: // Name: 6, Farbe: Blau - card = new Card('6', CARD_COLORS[1]); + card = new Card('6', CARD_COLORS[1], null); //Testet das Erstellen der Karte testCreatedCard(card, '6', "BLUE"); @@ -29,7 +29,7 @@ describe('Karten erstellen', () => { //Erstellen einer normalen Karte: // Name: 6, Farbe: Blau - card = new Card('8', CARD_COLORS[2]); + card = new Card('8', CARD_COLORS[2], null); //Testet das Erstellen der Karte testCreatedCard(card, '8', "GREEN"); @@ -40,7 +40,7 @@ describe('Karten erstellen', () => { //Erstellen einer +2 Karte: //Name: CC, Farbe: keine - card = new ChooseColor('CC'); + card = new ChooseColor(null); //Testet das Erstellen der Karte testCreatedCard(card, 'CC', "NONE"); @@ -51,7 +51,7 @@ describe('Karten erstellen', () => { //Erstellen einer Skip Karte: //Name: Skip, Farbe: gelb - card = new Skip('S', CARD_COLORS[4]); + card = new Skip(CARD_COLORS[4], null); //Testet das Erstellen der Karte testCreatedCard(card, 'S', "YELLOW"); @@ -62,7 +62,7 @@ describe('Karten erstellen', () => { //Erstellen einer Reverse Karte: //Name: Reverse, Farbe: grün - card = new Reverse('R', CARD_COLORS[2]); + card = new Reverse(CARD_COLORS[2], null); //Testet das Erstellen der Karte testCreatedCard(card, 'R', "GREEN"); @@ -73,7 +73,7 @@ describe('Karten erstellen', () => { //Erstellen einer +4 Karte: //Name: +4, Farbe: keine - card = new PlusAmount('+4'); + card = new PlusAmount(null); //Testet das Erstellen der Karte testCreatedCard(card, '+4', "NONE"); @@ -87,7 +87,7 @@ describe('Karten erstellen', () => { //Erstellen einer +2 Karte: //Name: +2, Farbe: Rot - card = new PlusAmount('+2', CARD_COLORS[3]); + card = new PlusAmount(null, CARD_COLORS[3]); //Testet das Erstellen der Karte testCreatedCard(card, '+2', "RED"); diff --git a/uno/node/tests/test_Game.test.js b/uno/node/tests/test_Game.test.js index 95c2e11..e0a8b50 100644 --- a/uno/node/tests/test_Game.test.js +++ b/uno/node/tests/test_Game.test.js @@ -165,7 +165,7 @@ describe('Pool aus Karten generieren', () => { let array2 = game.generatePool(); //Testen ob beide gleich - if(JSON.stringify(array1) === JSON.stringify(array2)) + if(array1 === array2) bool = false; //Bool muss true sein, wenn die Arrays ungleich sind diff --git a/uno/node/tests/test_Player.test.js b/uno/node/tests/test_Player.test.js index 76477a5..046c989 100644 --- a/uno/node/tests/test_Player.test.js +++ b/uno/node/tests/test_Player.test.js @@ -85,6 +85,7 @@ describe('Spieler Funktionalitäten', () => { //holt das Objekt der Karte, welche der Spieler in der hand hat let card = game.players[0].hand[0]; + game.players[0].turn = true; //Um die Karte zu legen, muss der Wert "canPut" der Karte auf true sein card.canPut = true;