game.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import json;
  2. import random;
  3. from player import Player, Color;
  4. from command import Command, Option
  5. suits = ["Harten", "Schoppen", "Klaver", "Ruiten"]
  6. denoms = ["Aas", "Heer", "Vrouw", "Boer", "10", "9", "8", "7", "6", "5", "4", "3", "2"]
  7. class Game(object):
  8. """description of class"""
  9. def __init__(self):
  10. self.__init([
  11. Player(Color.RED, "Rood"),
  12. Player(Color.BLUE, "Blauw"),
  13. Player(Color.YELLOW, "Geel"),
  14. Player(Color.GREEN, "Groen")])
  15. def __init__(self, players):
  16. self.stock = []
  17. random.seed()
  18. self.numberOfCards = 0
  19. self.players = dict((player.color, player) for player in players)
  20. for player in self.players.values():
  21. player.options = [Option(Command.DEAL, None, "Delen")]
  22. player.message = "Wie begint er met delen?"
  23. def shuffle(self):
  24. deck = [x + " " + y for x in suits for y in denoms] + ["Joker" for i in range(3)]
  25. self.stock = deck * 2
  26. for n in range(len(self.stock)):
  27. x = random.randint(0, len(self.stock) - n);
  28. value = self.stock[x]
  29. self.stock[x] = self.stock[n]
  30. self.stock[n] = value
  31. def deal(self, playerColor):
  32. player = self.players[playerColor]
  33. self.currentPlayer = player
  34. if self.numberOfCards <= 2:
  35. self.shuffle()
  36. self.numberOfCards = 6
  37. else:
  38. self.numberOfCards -= 1
  39. for player in self.players.values():
  40. player.hand = self.stock[:self.numberOfCards]
  41. self.stock = self.stock[self.numberOfCards:]
  42. player.options = [Option(Command.CHANGECARD, [card], card) for card in player.hand]
  43. player.message = "Kies een kaart om te wisselen"
  44. player.selectedCard = None
  45. player.cardIsChanged = False
  46. return self.players
  47. def changeCard(self, playerColor, card):
  48. player = self.players[playerColor]
  49. player.hand.remove(card)
  50. mate = self.mate(player)
  51. if mate.selectedCard is None:
  52. player.selectedCard = card
  53. player.message = "Wacht op je maat"
  54. player.options = [Option(Command.UNDOCARD, None, "Terug")]
  55. return self.players
  56. player.hand.append(mate.selectedCard)
  57. mate.selectedCard = None
  58. mate.hand.append(card)
  59. player.cardIsChanged = True
  60. mate.cardIsChanged = True
  61. mate.options.clear()
  62. player.options.clear()
  63. player.message = ""
  64. if all(player.cardIsChanged for player in self.players.values()):
  65. self.nextTurn()
  66. else:
  67. player.message = "Wacht op het andere team"
  68. mate.message = "wacht op het andere team"
  69. return self.players
  70. def playCard(self, playerColor, card):
  71. player = self.players[playerColor]
  72. player.hand.remove(card)
  73. player.selectedCard = card
  74. player.options = [Option(Command.UNDOCARD, None, "Terug"), Option(Command.READY, None, "Klaar")]
  75. player.message = f"Je speelt {card}"
  76. for other in self.players.values():
  77. if other.color != player.color:
  78. other.message = f"{player.name} speelt {card}"
  79. return self.players
  80. def ready(self, playerColor):
  81. player = self.players[playerColor]
  82. player.options.clear()
  83. player.selectedCard = None
  84. self.nextTurn()
  85. return self.players
  86. def undoCard(self, playerColor):
  87. player = self.players[playerColor]
  88. player.hand.append(player.selectedCard)
  89. player.selectedCard = None
  90. if player.cardIsChanged:
  91. self.turn()
  92. else:
  93. player.options = [Option(Command.CHANGECARD, [card], card) for card in player.hand]
  94. player.message = "Kies een kaart om te wisselen"
  95. return self.players
  96. def playOption(self, player, option):
  97. if option.command == Command.DEAL:
  98. return self.deal(player.color)
  99. elif option.command == Command.CHANGECARD:
  100. return self.changeCard(player.color, option.args[0])
  101. elif option.command == Command.PLAYCARD:
  102. return self.playCard(player.color, option.args[0])
  103. elif option.command == Command.READY:
  104. return self.ready(player.color)
  105. elif option.command == Command.UNDOCARD:
  106. return self.undoCard(player.color)
  107. else:
  108. raise Exception(f"Unknown command {option.command}")
  109. def nextPlayer(self, player):
  110. if player.color == Color.RED:
  111. return self.players[Color.BLUE]
  112. elif player.color == Color.BLUE:
  113. return self.players[Color.YELLOW]
  114. elif player.color == Color.YELLOW:
  115. return self.players[Color.GREEN]
  116. elif player.color == Color.GREEN:
  117. return self.players[Color.RED]
  118. else:
  119. raise Exception(f"Unknown color {player.Color}")
  120. def nextTurn(self):
  121. self.currentPlayer = self.nextPlayer(self.currentPlayer)
  122. self.turn()
  123. def turn(self):
  124. if len(self.currentPlayer.hand) > 0:
  125. self.currentPlayer.options = [Option(Command.PLAYCARD, [card], card) for card in self.currentPlayer.hand]
  126. self.currentPlayer.message = "Kies een kaart om te spelen"
  127. otherMessage = ""
  128. else:
  129. self.currentPlayer.options = [Option(Command.DEAL, None, "Delen")]
  130. self.currentPlayer.message = f"Jij bent aan de beurt om te delen."
  131. otherMessage = " om te delen"
  132. for player in self.players.values():
  133. if player.color != self.currentPlayer.color:
  134. player.message = f"{self.currentPlayer.name} is aan de beurt" + otherMessage
  135. def mate(self, player):
  136. if player.color == Color.RED:
  137. return self.players[Color.YELLOW]
  138. elif player.color == Color.BLUE:
  139. return self.players[Color.GREEN]
  140. elif player.color == Color.YELLOW:
  141. return self.players[Color.RED]
  142. elif player.color == Color.GREEN:
  143. return self.players[Color.BLUE]
  144. else:
  145. raise Exception(f"Unknown color {player.Color}")
  146. if __name__ == "__main__":
  147. game = Game()
  148. #game.deal(Color.BLUE)
  149. #game.changeCard(Color.YELLOW, game.players[Color.YELLOW].hand[4])
  150. #game.changeCard(Color.RED, game.players[Color.RED].hand[2])
  151. #game.changeCard(Color.GREEN, game.players[Color.GREEN].hand[0])
  152. #game.changeCard(Color.BLUE, game.players[Color.BLUE].hand[5])
  153. #game.playCard(Color.YELLOW, game.players[Color.YELLOW].hand[1])
  154. #game.undoCard(Color.YELLOW)
  155. colors = [Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED]
  156. for round in range(2):
  157. for deal in [6, 5, 4, 3, 2]:
  158. color = colors[0]
  159. print(color)
  160. game.deal(color)
  161. game.changeCard(Color.YELLOW, game.players[Color.YELLOW].hand[deal - 1])
  162. game.changeCard(Color.RED, game.players[Color.RED].hand[1])
  163. game.changeCard(Color.GREEN, game.players[Color.GREEN].hand[0])
  164. game.changeCard(Color.BLUE, game.players[Color.BLUE].hand[-1])
  165. colors = colors[1:] + [colors[0]]
  166. for turn in range(deal):
  167. for color in colors:
  168. game.playCard(color, game.players[color].hand[0])
  169. game.ready(color)
  170. for player in game.players.values():
  171. print(player.__dict__, end="\n\n")
  172. print(game.stock, end="\n\n")