You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.1 KiB

2 years ago
2 years ago
2 years ago
  1. //Klasse Player für Spieler einer Uno Runde
  2. import {CARD_COLORS} from "./uno.js";
  3. export default class Player {
  4. //Erstellt ein Spieler mit einem Namen und dem Spiel, in dem er teilnimmt
  5. constructor(name, gameInstanz) {
  6. this._game = gameInstanz; //Spiel, worin der Spieler ist
  7. this._name = name; //Name des Spielers
  8. this._turn = false; //Ob Spieler gerade am Zug
  9. this._hand = []; //Deck des Spielers
  10. this._canPlay = false //Ob spieler gerade Karte legen kann
  11. this._mustSayUno = false;
  12. }
  13. //Lässt den Spieler eine Anzahl "amount" an Karten ziehen
  14. drawCard(amount, nextTurn, anim) {
  15. if(this.game.stack !== 0){
  16. if (!this.game.currentPlayerInstanz.mustSayUno){
  17. let cards = this.game.stack;
  18. this.game.stack = 0;
  19. if (this.game.cardOnDeck.name === '+4')
  20. this.drawCard(cards, true, true);
  21. else
  22. this.drawCard(cards, false, true);
  23. return;
  24. }
  25. }
  26. //Ziehe so viele Karten, wie amount übergeben wurde
  27. for (let i = 0; i < amount; i++) {
  28. if (anim) {
  29. setTimeout(() => {
  30. //Füge die erste Karte aus cardPool der Hand des Spielers hinzu
  31. this.hand.push(this.game.cardPool[0]);
  32. //Lösche die erste Karte aus cardPool
  33. this.game.cardPool.splice(0, 1);
  34. this.game.style.showPlayerDeck(this, false, true, false);
  35. }, 200 + 500 * (i));
  36. } else {
  37. //Füge die erste Karte aus cardPool der Hand des Spielers hinzu
  38. this.hand.push(this.game.cardPool[0]);
  39. //Lösche die erste Karte aus cardPool
  40. this.game.cardPool.splice(0, 1);
  41. }
  42. }
  43. setTimeout(() => {
  44. this.game.refreshCanPutCard();
  45. this.game.style.showPlayerDeck(this.game.currentPlayerInstanz, true, false, false);
  46. if (nextTurn) {
  47. this.game.nextTurn();
  48. }
  49. }, 300 + 500 * amount);
  50. }
  51. //Lässt den Spieler eine Karte in seiner Hand legen
  52. //Parameter: Index vom Deck des Spielers, wo die Karte liegt
  53. putCard(index) {
  54. //Karte muss hinterlegt haben, dass sie gelegt werden kann
  55. if (!this.turn) return;
  56. if (!this.hand[index].canPut) return;
  57. if (this.turn === false) return;
  58. //Wenn eine Karte auf dem Tisch liegt
  59. if (this.game.cardOnDeck != null) {
  60. //Wenn eine "NONE" Color Karte gelegt wurde, resette die Farbe auf "NONE"
  61. if (this.game.cardOnDeck.name === "CC" || this._game.cardOnDeck.name === "+4") this.game.cardOnDeck.color = CARD_COLORS[0];
  62. //Füge die Karte dem Pool wieder hinzu
  63. this.game.cardPool.push(this._game.cardOnDeck);
  64. }
  65. //Karte in der Hand wird auf den Tisch gelegt
  66. this.game.cardOnDeck = this._hand[index];
  67. //Karte wird aus dem Deck des Spielers entfernt
  68. this.hand.splice(index, 1);
  69. //führe Funktion der Karte aus
  70. this.game.cardOnDeck.putSelf();
  71. }
  72. sayUno() {
  73. this._mustSayUno = false;
  74. }
  75. selectColor() {
  76. //Todo: Spieler Möglichkeit geben Farbe zu wählen, nicht random
  77. return CARD_COLORS[Math.floor(Math.random() * 4) + 1];
  78. }
  79. //Gibt den Namen eines Spielers zurück
  80. get name() {
  81. return this._name;
  82. }
  83. //Gibt zurück, ob der Spieler am Zug ist
  84. get turn() {
  85. return this._turn;
  86. }
  87. //Setzt, dass der Spieler gerade am Zug ist oder nicht
  88. set turn(bool) {
  89. this._turn = bool;
  90. }
  91. //Gibt zurück, ob der Spieler eine Karte legen kann
  92. get canPlay() {
  93. return this._canPlay;
  94. }
  95. set canPlay(bool) {
  96. this._canPlay = bool;
  97. }
  98. //Gibt das SpielerDeck zurück
  99. get hand() {
  100. return this._hand;
  101. }
  102. get game() {
  103. return this._game;
  104. }
  105. get mustSayUno() {
  106. return this._mustSayUno;
  107. }
  108. set mustSayUno(bool) {
  109. this._mustSayUno = bool;
  110. }
  111. }