game.py 7.6 KB

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