game.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import random
  2. from typing import List, Dict
  3. from color import Color
  4. from cards import Card, shuffle
  5. from option import OptionCode, Option
  6. from player import Player, StateCode, ErrorCode
  7. class Game(object):
  8. """description of class"""
  9. players: Dict[Color, Player]
  10. current_player: Player
  11. current_dealer: Player
  12. stock: List[str]
  13. number_of_cards: int
  14. def __init__(self, players=None):
  15. if players is None:
  16. players = [
  17. Player(Color.RED, "Rood"),
  18. Player(Color.BLUE, "Blauw"),
  19. Player(Color.YELLOW, "Geel"),
  20. Player(Color.GREEN, "Groen")]
  21. self.stock = []
  22. random.seed()
  23. self.number_of_cards = 0
  24. self.players = dict((player.color, player) for player in players)
  25. for player in self.players.values():
  26. player.options = [Option(OptionCode.DEAL, "Delen")]
  27. player.message = "Wie begint er met delen?"
  28. player.set_state(StateCode.FIRST_DEAL)
  29. def deal(self, player_color):
  30. player = self.players[player_color]
  31. self.current_player = player
  32. self.current_dealer = player
  33. if self.number_of_cards <= 2:
  34. self.stock = shuffle(2)
  35. self.number_of_cards = 6
  36. else:
  37. self.number_of_cards -= 1
  38. for player in self.players.values():
  39. player.hand = self.stock[:self.number_of_cards]
  40. self.stock = self.stock[self.number_of_cards:]
  41. player.options = [Option(OptionCode.SWAP_CARD, card.denom, card=card) for card in player.hand]
  42. player.message = "Kies een kaart om te wisselen"
  43. player.set_state(StateCode.SWAP_CARD)
  44. player.selected_card = None
  45. player.card_is_changed = False
  46. player.passed = False
  47. return self.players
  48. def change_card(self, player_color, card):
  49. player = self.players[player_color]
  50. player.hand.remove(card)
  51. partner = self.partner(player)
  52. if partner.selected_card is None:
  53. player.selected_card = card
  54. player.message = "Wacht op je maat"
  55. player.set_state(StateCode.SWAP_CARD_PARTNER)
  56. player.options = [Option(OptionCode.UNDO_CARD, "Terug")]
  57. return self.players
  58. player.hand.append(partner.selected_card)
  59. partner.selected_card = None
  60. partner.hand.append(card)
  61. player.card_is_changed = True
  62. partner.card_is_changed = True
  63. partner.options.clear()
  64. player.options.clear()
  65. player.message = ""
  66. if all(player.card_is_changed for player in self.players.values()):
  67. self.next_turn()
  68. else:
  69. player.message = "Wacht op het andere team"
  70. player.set_state(StateCode.SWAP_CARD_OTHERS)
  71. partner.message = "wacht op het andere team"
  72. partner.set_state(StateCode.SWAP_CARD_OTHERS)
  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(OptionCode.UNDO_CARD, "Terug"), Option(OptionCode.READY, "Klaar")]
  79. player.message = f"Je speelt {card}"
  80. player.set_state(StateCode.PLAYING_CARD, card=card)
  81. for other in self.players.values():
  82. if other.color != player.color:
  83. other.message = f"{player.name} speelt {card}"
  84. other.set_state(StateCode.PLAYING_CARD_OTHER, card=card, other_player_name=player.name)
  85. return self.players
  86. def drop_cards(self, player_color):
  87. player = self.players[player_color]
  88. player.hand = []
  89. player.options = []
  90. player.passed = True
  91. self.next_turn()
  92. def ready(self, player_color):
  93. player = self.players[player_color]
  94. player.options.clear()
  95. player.selected_card = None
  96. self.next_turn()
  97. return self.players
  98. def undo_card(self, player_color):
  99. player = self.players[player_color]
  100. player.hand.append(player.selected_card)
  101. player.selected_card = None
  102. if player.card_is_changed:
  103. self.turn()
  104. else:
  105. player.options = [Option(OptionCode.SWAP_CARD, card.denom, card=card) for card in player.hand]
  106. player.message = "Kies een kaart om te wisselen"
  107. player.set_state(StateCode.SWAP_CARD)
  108. return self.players
  109. def play_option(self, player, option):
  110. if option.code == OptionCode.DEAL:
  111. return self.deal(player.color)
  112. elif option.code == OptionCode.SWAP_CARD:
  113. return self.change_card(player.color, option.card)
  114. elif option.code == OptionCode.PLAY_CARD:
  115. return self.play_card(player.color, option.card)
  116. elif option.code == OptionCode.READY:
  117. return self.ready(player.color)
  118. elif option.code == OptionCode.UNDO_CARD:
  119. return self.undo_card(player.color)
  120. elif option.code == OptionCode.PASS:
  121. return self.drop_cards(player.color)
  122. else:
  123. raise Exception(f"Unknown option {option.code}")
  124. def next_player(self, player):
  125. if player.color == Color.RED:
  126. return self.players[Color.BLUE]
  127. elif player.color == Color.BLUE:
  128. return self.players[Color.YELLOW]
  129. elif player.color == Color.YELLOW:
  130. return self.players[Color.GREEN]
  131. elif player.color == Color.GREEN:
  132. return self.players[Color.RED]
  133. else:
  134. raise Exception(f"Unknown color {player.Color}")
  135. def next_turn(self):
  136. if all(len(player.hand) == 0 for player in self.players.values()):
  137. self.next_deal()
  138. else:
  139. self.current_player = self.next_player(self.current_player)
  140. while len(self.current_player.hand) == 0:
  141. self.current_player = self.next_player(self.current_player)
  142. self.turn()
  143. def next_deal(self):
  144. self.current_player = self.next_player(self.current_dealer)
  145. self.current_player.options = [Option(OptionCode.DEAL, "Delen")]
  146. self.current_player.message = f"Jij bent aan de beurt om te delen."
  147. self.current_player.set_state(StateCode.DEAL)
  148. for player in self.players.values():
  149. if player.color != self.current_player.color:
  150. player.message = f"{self.current_player.name} is aan de beurt om te delen"
  151. player.set_state(StateCode.DEAL_OTHER, other_player_name=self.current_player.name)
  152. def turn(self):
  153. self.current_player.options = [Option(OptionCode.PLAY_CARD, card.denom, card=card) for card in self.current_player.hand]
  154. self.current_player.options.append(Option(OptionCode.PASS, "Pas"))
  155. self.current_player.message = "Kies een kaart om te spelen"
  156. self.current_player.set_state(StateCode.PLAY_CARD)
  157. for player in self.players.values():
  158. if player.color != self.current_player.color:
  159. player.message = f"{self.current_player.name} is aan de beurt"
  160. player.set_state(StateCode.PLAY_CARD_OTHER, other_player_name=self.current_player.name)
  161. def partner(self, player):
  162. if player.color == Color.RED:
  163. return self.players[Color.YELLOW]
  164. elif player.color == Color.BLUE:
  165. return self.players[Color.GREEN]
  166. elif player.color == Color.YELLOW:
  167. return self.players[Color.RED]
  168. elif player.color == Color.GREEN:
  169. return self.players[Color.BLUE]
  170. else:
  171. raise Exception(f"Unknown color {player.Color}")
  172. if __name__ == "__main__":
  173. game = Game()
  174. colors = [Color.BLUE, Color.YELLOW, Color.GREEN, Color.RED]
  175. for round in range(2):
  176. for deal in [6, 5, 4, 3, 2]:
  177. color = colors[0]
  178. print(color)
  179. game.deal(color)
  180. game.change_card(Color.YELLOW, game.players[Color.YELLOW].hand[deal - 1])
  181. game.change_card(Color.RED, game.players[Color.RED].hand[1])
  182. game.change_card(Color.GREEN, game.players[Color.GREEN].hand[0])
  183. game.change_card(Color.BLUE, game.players[Color.BLUE].hand[-1])
  184. colors = colors[1:] + [colors[0]]
  185. for turn in range(deal):
  186. for color in colors:
  187. game.play_card(color, game.players[color].hand[0])
  188. game.ready(color)
  189. for player in game.players.values():
  190. print(player.__dict__, end="\n\n")
  191. print([card.__dict__ for card in game.stock], end="\n\n")