Browse Source

GameLoop hinzugefügt und Bugfixes

+ Regel Erste SpielKarte SpecialKarte hinzugefügt
main
Nicolas Fritz 2 years ago
parent
commit
14681c60cd
  1. 1
      .gitignore
  2. 73
      uno/node/js/Game.js
  3. 3
      uno/node/js/Player.js
  4. 4
      uno/node/js/cards/Card.js
  5. 7
      uno/node/js/cards/special/ChooseColor.js
  6. 5
      uno/node/js/cards/special/PlusAmount.js
  7. 12
      uno/node/tests/test_Card.test.js
  8. 125
      uno/node/tests/test_Game.test.js
  9. 8
      uno/node/tests/test_Player.test.js
  10. 2
      vier_gewinnt/tests/test_vierGewint.test.js

1
.gitignore

@ -1 +1,2 @@
/node_modules/ /node_modules/
/commits

73
uno/node/js/Game.js

@ -15,16 +15,14 @@ class Game {
constructor(playerAmount, rules) { constructor(playerAmount, rules) {
this._cardOnDeck = null; //Karte die auf dem Tisch liegt this._cardOnDeck = null; //Karte die auf dem Tisch liegt
this._currentPlayer = 0; //Aktueller Spieler Index im Player Array
this._currentPlayer = -1; //Aktueller Spieler Index im Player Array
this._direction = 1; //Spielrichtung this._direction = 1; //Spielrichtung
this._players = []; //Array mit allen Spielern drin this._players = []; //Array mit allen Spielern drin
this._cardPool = [] //Pool aus Karten
this._cardPool = []; //Pool aus Karten
this._playerAmount = playerAmount; //Anzahl der Spieler this._playerAmount = playerAmount; //Anzahl der Spieler
this._rules = rules; //Array mit Regeln für das Spiel this._rules = rules; //Array mit Regeln für das Spiel
//Spiel einrichten
this.initGame();
} }
//Richtet das Spiel ein //Richtet das Spiel ein
@ -36,23 +34,51 @@ class Game {
//Spieler werden erstellt //Spieler werden erstellt
this.createPlayers(this._playerAmount); this.createPlayers(this._playerAmount);
//Die Erste Karte wird auf den Tisch gelegt
this._cardOnDeck = this._cardPool[0];
this._cardPool.splice(0,1);
} }
//Startet das Spiel //Startet das Spiel
start(){ start(){
if(this._currentPlayer !== -1) return;
//Wenn das Spiel noch nicht initialisiert wurde, initialisiere es //Wenn das Spiel noch nicht initialisiert wurde, initialisiere es
if (this._cardPool === [] || this._players === [])
if (this._cardPool.length === 0 || this._players.length === 0)
this.initGame(); this.initGame();
let firstCardIndex = 0;
let boolFirstSpecial = false;
if (this._rules !== null){
if('startCards' in this.rules)
for (let i = 0; i < this.players.length; i++)
this.players[i].drawCard(this.rules.startCards);
if('firstPlaySpecial' in this.rules)
boolFirstSpecial = this.rules.firstPlaySpecial;
}
if (!boolFirstSpecial){
for (let i = 0; i < this.cardPool.length; i++){
if (!(this.cardPool[i].name === 'R' || this.cardPool[i].name === 'S'
|| this.cardPool[i].name === 'CC' || this.cardPool[i].name === '+2'
|| this.cardPool[i].name === '+4')){
firstCardIndex = i;
break;
}
}
}
//Die Erste Karte wird auf den Tisch gelegt
this._cardOnDeck = this._cardPool[firstCardIndex];
this._cardPool.splice(firstCardIndex,1);
//Karten Funktion der Karte auf dem Deck ausführen
this.cardOnDeck.putSelf();
} }
// //
@ -114,20 +140,26 @@ 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 //Testet, ob Spiel Gewonnen
for (let i = 0; i < this._players.length; i++){
if(this._players[i].hand.length <= 0){
for (let i = 0; i < this.players.length; i++){
if(this.players[i].hand.length <= 0){
//Breche den Loop ab //Breche den Loop ab
return; return;
} }
} }
//Wenn Zug nicht der Erste vom ganzen Spiel
if(this.currentPlayer !== -1){
//Aktuellen Spieler kann, darf nicht mehr Spielen //Aktuellen Spieler kann, darf nicht mehr Spielen
this.players[this._currentPlayer].canPlay = false;
this.players[this.currentPlayer].canPlay = false;
}
//nächster Spieler wird gesetzt //nächster Spieler wird gesetzt
this._currentPlayer = this.nextPlayer();
this.currentPlayer = this.nextPlayer();
//Aktualisiere das Deck des aktuellen Spielers, welche Karten er legen kann //Aktualisiere das Deck des aktuellen Spielers, welche Karten er legen kann
this.refreshCanPutCard(); this.refreshCanPutCard();
@ -137,7 +169,7 @@ class Game {
//Testet alle Karten des aktuellen Spielers in seiner Hand, ob er sie legen kann //Testet alle Karten des aktuellen Spielers in seiner Hand, ob er sie legen kann
refreshCanPutCard(){ refreshCanPutCard(){
//Deck des aktuellen Spielers //Deck des aktuellen Spielers
let currentPlayerCards = this._players[this._currentPlayer].hand;
let currentPlayerCards = this.players[this.currentPlayer].hand;
//Gehe alle Karten vom Deck durch //Gehe alle Karten vom Deck durch
for(let i = 0; i < currentPlayerCards.length; i++){ for(let i = 0; i < currentPlayerCards.length; i++){
@ -167,6 +199,8 @@ class Game {
//Errechne, wer der nächste Spieler ist //Errechne, wer der nächste Spieler ist
nextPlayer(){ nextPlayer(){
if(this.currentPlayer === -1)
return 0;
//Anhand der Spielrichtung errechnen //Anhand der Spielrichtung errechnen
if(this._direction === 1) if(this._direction === 1)
@ -196,11 +230,16 @@ class Game {
this._cardOnDeck = card; this._cardOnDeck = card;
} }
//Gibt den aktuellen Spieler zurück
//Gibt den Index des aktuellen Spielers im players Array zurück
get currentPlayer(){ get currentPlayer(){
return this._currentPlayer; return this._currentPlayer;
} }
//Gibt das Objekt des aktuellen Spielers zurück
get currentPlayerInstanz(){
return this._players[this.currentPlayer];
}
set currentPlayer(player){ set currentPlayer(player){
this._currentPlayer = player this._currentPlayer = player
} }
@ -214,6 +253,10 @@ class Game {
this._direction = direction; this._direction = direction;
} }
get rules(){
return this._rules;
}
} }
//Exportiert Modul Game //Exportiert Modul Game

3
uno/node/js/Player.js

@ -28,6 +28,9 @@ class Player {
} }
if(amount === 1)
this._game.nextTurn();
} }
//Lässt den Spieler eine Karte in seiner Hand legen //Lässt den Spieler eine Karte in seiner Hand legen

4
uno/node/js/cards/Card.js

@ -3,7 +3,7 @@
class Card { class Card {
//Konstruktor für das Erstellen einer Karte //Konstruktor für das Erstellen einer Karte
constructor(name, color, gameInstanz) {
constructor(name, color, gameInstanz, ) {
this._game = 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
@ -17,7 +17,7 @@ class Card {
putSelf(){ putSelf(){
//Nächster Spieler am Zug //Nächster Spieler am Zug
this._game.nextTurn();
this.game.nextTurn();
} }

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

@ -17,9 +17,14 @@ class ChooseColor extends Card {
//Führt eigene Logik aus (Wählt farbe aus) //Führt eigene Logik aus (Wählt farbe aus)
putSelf() { putSelf() {
if(this.game.currentPlayer === -1) {
//Setzt die Farbe der Karte auf eine Random Farbe //Setzt die Farbe der Karte auf eine Random Farbe
this.color = CARD_COLORS[Math.floor(Math.random() * 4) + 1];
}
else{
//lässt den Spieler eine Farbe wählen
this._color = this.game.players[this.game.currentPlayer].selectColor(); this._color = this.game.players[this.game.currentPlayer].selectColor();
}
//Logik von Card.js ausführen //Logik von Card.js ausführen
super.putSelf(); super.putSelf();
} }

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

@ -1,6 +1,7 @@
//Imports //Imports
const uno = require('../../uno'); const uno = require('../../uno');
const Card = require('../Card'); const Card = require('../Card');
const {CARD_COLORS} = require("../../uno");
//Klasse PlusAmount für Karten, die den nächsten Spieler ziehen lassen //Klasse PlusAmount für Karten, die den nächsten Spieler ziehen lassen
class PlusAmount extends Card { class PlusAmount extends Card {
@ -24,6 +25,10 @@ class PlusAmount extends Card {
this.game.players[this.game.nextPlayer()].drawCard(this._plus); this.game.players[this.game.nextPlayer()].drawCard(this._plus);
if(this._plus === 4){ if(this._plus === 4){
if(this.game.currentPlayer === -1)
this.color = CARD_COLORS[Math.floor(Math.random() * 4) + 1];
else
this._color = this.game.players[this.game.currentPlayer].selectColor(); this._color = this.game.players[this.game.currentPlayer].selectColor();
} }

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

@ -102,14 +102,18 @@ describe('Karten erstellen', () => {
describe('Kartenfunktionen', () => { describe('Kartenfunktionen', () => {
let game = new Game(2, null);
let rules = {
startCards: 2,
}
let game = new Game(2, rules);
let card; let card;
game.start();
//Spieler brauchen karten, sonst beendet sich das Spiel //Spieler brauchen karten, sonst beendet sich das Spiel
game.players[0].canPlay = true; game.players[0].canPlay = true;
game.players[1].canPlay = true; game.players[1].canPlay = true;
game.players[0].drawCard(2);
game.players[1].drawCard(2);
it('Card - nächster Spieler an der Reihe', () => { it('Card - nächster Spieler an der Reihe', () => {
@ -140,6 +144,8 @@ describe('Kartenfunktionen', () => {
card = new Reverse(CARD_COLORS[2], game); card = new Reverse(CARD_COLORS[2], game);
game.direction = 1;
card.putSelf(); card.putSelf();
//Die Spielrichtung muss geändert werden //Die Spielrichtung muss geändert werden

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

@ -1,6 +1,11 @@
//Imports //Imports
const uno = require('../js/uno'); const uno = require('../js/uno');
const Game = require('../js/Game'); const Game = require('../js/Game');
const PlusAmount = require("../js/cards/special/PlusAmount");
const Skip = require("../js/cards/special/Skip");
const Reverse = require("../js/cards/special/Reverse");
const ChooseColor = require("../js/cards/special/ChooseColor");
const Card = require("../js/cards/Card");
//Instanz von CARD_COLORS aus uno.js //Instanz von CARD_COLORS aus uno.js
const CARD_COLORS = uno.CARD_COLORS; const CARD_COLORS = uno.CARD_COLORS;
@ -174,8 +179,128 @@ describe('Pool aus Karten generieren', () => {
}); });
});
describe('StartKarte legen', () => {
let game;
let card;
beforeEach(() => {
game = new Game(2, null)
game.initGame();
game.players[0].drawCard(2);
game.players[1].drawCard(2);
}) })
it('+4', ()=> {
card = new PlusAmount(game);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(0);
});
it('+2', ()=> {
card = new PlusAmount(game, CARD_COLORS[2]);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(0);
});
it('S', ()=> {
card = new Skip(CARD_COLORS[2], game);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(1);
});
it('R', ()=> {
card = new Reverse(CARD_COLORS[2], game);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(0);
});
it('CC', ()=> {
card = new ChooseColor(game);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(0);
});
it('Normale Karte', ()=> {
card = new Card('8', CARD_COLORS[2], game);
game.cardOnDeck = card;
game.cardOnDeck.putSelf();
expect(game.currentPlayer).toBe(0);
});
});
describe('Testet die Regeln', () => {
let game, rules;
it('Erster Spielzug SpecialKarte', function () {
rules = {
firstPlaySpecial: true,
}
let bool = false;
for (let i = 0; i < 100; i++){
game = new Game(2, rules);
game.start();
if (game.cardOnDeck.name === 'R' || game.cardOnDeck.name === 'S'
|| game.cardOnDeck.name === 'CC' || game.cardOnDeck.name === '+2'
|| game.cardOnDeck.name === '+4'){
bool = true;
}
}
expect(bool).toBe(true);
});
});
//Setzt die Kartenanzahl der Farben für array //Setzt die Kartenanzahl der Farben für array
function getColorAmounts(array){ function getColorAmounts(array){

8
uno/node/tests/test_Player.test.js

@ -59,10 +59,16 @@ describe('Spieler Funktionalitäten', () => {
//Erstellt ein Spiel //Erstellt ein Spiel
let game = new Game(2, null); let game = new Game(2, null);
let cardAmount; let cardAmount;
let playerCardAmount;
game.start();
game.players[0].hand = [];
//Nimmt die Anzahl der Karten im Deck und speichert sie in cardAmount vor jedem Test //Nimmt die Anzahl der Karten im Deck und speichert sie in cardAmount vor jedem Test
beforeEach(() => { beforeEach(() => {
cardAmount = game.cardPool.length; cardAmount = game.cardPool.length;
playerCardAmount = game.players[0].hand.length;
}) })
@ -76,7 +82,7 @@ describe('Spieler Funktionalitäten', () => {
expect(game.cardPool.length).toBe(cardAmount - 1); expect(game.cardPool.length).toBe(cardAmount - 1);
//Testet, ob der Spieler jetzt eine Karte auf der Hand hat //Testet, ob der Spieler jetzt eine Karte auf der Hand hat
expect(game.players[0].hand.length).toBe(1);
expect(playerCardAmount + 1).toBe(game.players[0].hand.length);
}); });

2
vier_gewinnt/tests/test_vierGewint.test.js

@ -0,0 +1,2 @@
it('Test', function () {
});
Loading…
Cancel
Save