Browse Source

nextTurn() hinzugefügt + Kartenmethoden

main
Nicolas Fritz 2 years ago
parent
commit
10ac955c5a
  1. 76
      uno/node/js/Game.js
  2. 11
      uno/node/js/Player.js
  3. 17
      uno/node/js/cards/Card.js
  4. 13
      uno/node/js/cards/special/ChooseColor.js
  5. 14
      uno/node/js/cards/special/PlusAmount.js
  6. 9
      uno/node/js/cards/special/Reverse.js
  7. 9
      uno/node/js/cards/special/Skip.js
  8. 14
      uno/node/tests/test_Card.test.js
  9. 2
      uno/node/tests/test_Game.test.js
  10. 1
      uno/node/tests/test_Player.test.js

76
uno/node/js/Game.js

@ -6,6 +6,7 @@ const PlusAmount = require("./cards/special/PlusAmount");
const Reverse = require("./cards/special/Reverse"); const Reverse = require("./cards/special/Reverse");
const uno = require("./uno"); const uno = require("./uno");
const Player = require("./Player"); const Player = require("./Player");
const {CARD_COLORS} = require("./uno");
//Um generatePool zu exportieren, muss es in eine Klasse konvertiert werden //Um generatePool zu exportieren, muss es in eine Klasse konvertiert werden
class Game { 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 //Gibt ein Array zurück mit allen Karten, die in einem Uno Spiel sind
generatePool(){ generatePool(){
@ -53,14 +68,14 @@ class Game {
//Special Karten werden hinzugefügt //Special Karten werden hinzugefügt
for (let j = 1; j < (uno.CARD_COLORS.length); j++) { 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) { 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++) { for (let i = 0; i <= 9; i++) {
if (k === 1 && i === 0) continue; 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 //Beendet den Zug des aktuellen Spielers und beginnt den Zug des nächsten Spielers
nextTurn(){ 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 //Gib den Pool mit allen UnoKarten zurück
@ -117,6 +173,14 @@ class Game {
this._cardOnDeck = card; this._cardOnDeck = card;
} }
get currentPlayer(){
return this._currentPlayer;
}
get direction(){
return this._direction;
}
} }
//Exportiert Modul Game //Exportiert Modul Game

11
uno/node/js/Player.js

@ -1,4 +1,6 @@
//Klasse Player für Spieler einer Uno Runde //Klasse Player für Spieler einer Uno Runde
const uno = require("./uno");
class Player { class Player {
//Erstellt ein Spieler mit einem Namen und dem Spiel, in dem er teilnimmt //Erstellt ein Spieler mit einem Namen und dem Spiel, in dem er teilnimmt
@ -32,9 +34,14 @@ class Player {
putCard(index){ putCard(index){
//Karte muss hinterlegt haben, dass sie gelegt werden kann //Karte muss hinterlegt haben, dass sie gelegt werden kann
if(!this._hand[index].canPut) return; 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 //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 != 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); this._game.cardPool.push(this._game.cardOnDeck);
} }
@ -56,6 +63,10 @@ class Player {
return this._turn; return this._turn;
} }
set turn(bool){
this._turn = bool;
}
//Gibt zurück, ob der Spieler eine Karte legen kann //Gibt zurück, ob der Spieler eine Karte legen kann
get canPlay(){ get canPlay(){
return this._canPlay; return this._canPlay;

17
uno/node/js/cards/Card.js

@ -3,8 +3,9 @@
class Card { class Card {
//Konstruktor für das Erstellen einer Karte //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._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._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) 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 //Gibt den Namen der Karte zurück
get name() { get name() {
return this._name; return this._name;
@ -27,11 +34,19 @@ class Card {
return this._color; return this._color;
} }
set color(color) {
this._color = color;
}
//Gibt zurück ob die Karte sich auf dem Bildschirm befindet //Gibt zurück ob die Karte sich auf dem Bildschirm befindet
get onScreen() { get onScreen() {
return this._onScreen; return this._onScreen;
} }
get game(){
return this._game;
}
//Setzt, ob die Karte gelegt werden kann, oder nicht //Setzt, ob die Karte gelegt werden kann, oder nicht
set canPut(bool){ set canPut(bool){
this._canPut = bool; this._canPut = bool;

13
uno/node/js/cards/special/ChooseColor.js

@ -1,18 +1,27 @@
//Imports //Imports
const Card = require('../Card'); const Card = require('../Card');
const uno = require('../../uno'); const uno = require('../../uno');
const {CARD_COLORS} = require("../../uno");
//Klasse ChooseColor für FarbWahlKarten //Klasse ChooseColor für FarbWahlKarten
class ChooseColor extends Card { class ChooseColor extends Card {
//Konstruktor für das Erstellen einer ChooseColor-Karte //Konstruktor für das Erstellen einer ChooseColor-Karte
constructor(name) {
constructor(gameInstanz) {
//An Konstruktor von Cards weitergeben //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 //Exportiert Modul ChooseColor

14
uno/node/js/cards/special/PlusAmount.js

@ -6,16 +6,26 @@ const Card = require('../Card');
class PlusAmount extends Card { class PlusAmount extends Card {
//Konstruktor für das Erstellen einer PlusAmount-Karte (+4/+2) //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 //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 //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; 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 //Gibt den PlusWert der Karte zurück
get plus() { get plus() {
return this._plus; return this._plus;

9
uno/node/js/cards/special/Reverse.js

@ -5,13 +5,18 @@ const Card = require('../Card');
class Reverse extends Card { class Reverse extends Card {
//Konstruktor für das Erstellen einer Reverse-Karte //Konstruktor für das Erstellen einer Reverse-Karte
constructor(name, color) {
constructor(color, gameInstanz) {
//An Konstruktor von Cards weitergeben //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 //Exportiert Modul Reverse

9
uno/node/js/cards/special/Skip.js

@ -5,13 +5,18 @@ const Card = require('../Card');
class Skip extends Card { class Skip extends Card {
//Konstruktor für das Erstellen einer Skip-Karte //Konstruktor für das Erstellen einer Skip-Karte
constructor(name, color) {
constructor(color, gameInstanz) {
//An Konstruktor von Cards weitergeben //An Konstruktor von Cards weitergeben
super(name, color);
super("S", color, gameInstanz);
} }
putSelf() {
this.game.currentPlayer = this.game.nextPlayer();
super.putSelf();
}
} }
//Exportiert Modul Skip //Exportiert Modul Skip

14
uno/node/tests/test_Card.test.js

@ -18,7 +18,7 @@ describe('Karten erstellen', () => {
//Erstellen einer normalen Karte: //Erstellen einer normalen Karte:
// Name: 6, Farbe: Blau // Name: 6, Farbe: Blau
card = new Card('6', CARD_COLORS[1]);
card = new Card('6', CARD_COLORS[1], null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, '6', "BLUE"); testCreatedCard(card, '6', "BLUE");
@ -29,7 +29,7 @@ describe('Karten erstellen', () => {
//Erstellen einer normalen Karte: //Erstellen einer normalen Karte:
// Name: 6, Farbe: Blau // Name: 6, Farbe: Blau
card = new Card('8', CARD_COLORS[2]);
card = new Card('8', CARD_COLORS[2], null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, '8', "GREEN"); testCreatedCard(card, '8', "GREEN");
@ -40,7 +40,7 @@ describe('Karten erstellen', () => {
//Erstellen einer +2 Karte: //Erstellen einer +2 Karte:
//Name: CC, Farbe: keine //Name: CC, Farbe: keine
card = new ChooseColor('CC');
card = new ChooseColor(null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, 'CC', "NONE"); testCreatedCard(card, 'CC', "NONE");
@ -51,7 +51,7 @@ describe('Karten erstellen', () => {
//Erstellen einer Skip Karte: //Erstellen einer Skip Karte:
//Name: Skip, Farbe: gelb //Name: Skip, Farbe: gelb
card = new Skip('S', CARD_COLORS[4]);
card = new Skip(CARD_COLORS[4], null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, 'S', "YELLOW"); testCreatedCard(card, 'S', "YELLOW");
@ -62,7 +62,7 @@ describe('Karten erstellen', () => {
//Erstellen einer Reverse Karte: //Erstellen einer Reverse Karte:
//Name: Reverse, Farbe: grün //Name: Reverse, Farbe: grün
card = new Reverse('R', CARD_COLORS[2]);
card = new Reverse(CARD_COLORS[2], null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, 'R', "GREEN"); testCreatedCard(card, 'R', "GREEN");
@ -73,7 +73,7 @@ describe('Karten erstellen', () => {
//Erstellen einer +4 Karte: //Erstellen einer +4 Karte:
//Name: +4, Farbe: keine //Name: +4, Farbe: keine
card = new PlusAmount('+4');
card = new PlusAmount(null);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, '+4', "NONE"); testCreatedCard(card, '+4', "NONE");
@ -87,7 +87,7 @@ describe('Karten erstellen', () => {
//Erstellen einer +2 Karte: //Erstellen einer +2 Karte:
//Name: +2, Farbe: Rot //Name: +2, Farbe: Rot
card = new PlusAmount('+2', CARD_COLORS[3]);
card = new PlusAmount(null, CARD_COLORS[3]);
//Testet das Erstellen der Karte //Testet das Erstellen der Karte
testCreatedCard(card, '+2', "RED"); testCreatedCard(card, '+2', "RED");

2
uno/node/tests/test_Game.test.js

@ -165,7 +165,7 @@ describe('Pool aus Karten generieren', () => {
let array2 = game.generatePool(); let array2 = game.generatePool();
//Testen ob beide gleich //Testen ob beide gleich
if(JSON.stringify(array1) === JSON.stringify(array2))
if(array1 === array2)
bool = false; bool = false;
//Bool muss true sein, wenn die Arrays ungleich sind //Bool muss true sein, wenn die Arrays ungleich sind

1
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 //holt das Objekt der Karte, welche der Spieler in der hand hat
let card = game.players[0].hand[0]; 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 //Um die Karte zu legen, muss der Wert "canPut" der Karte auf true sein
card.canPut = true; card.canPut = true;

Loading…
Cancel
Save