def try_mahjong(self, tile=None) -> bool: test = self.concealed[:] if tile: test.append(tile) if Rule.is_mahjong(test): return True return False
def test_hand(): mj_set = MjSet() mj_set.shuffle() # ai = PlayerAiPro("bot02") ai = PlayerAiAdv("bot02") for _ in range(13): ai.draw(mj_set) ai.sort_concealed() print("concealed: " + Rule.convert_tiles_to_str(ai.concealed)) mj_set.shuffle() for _ in range(100): tile = ai.draw(mj_set) print(f"draw: {tile}") if Rule.is_mahjong(ai.concealed): print("Mahjong!!!") break tile = ai.decide_discard() print(f"discard: {tile}") ai.discard(tile) ai.sort_concealed() print("concealed: " + Rule.convert_tiles_to_str(ai.concealed)) print("discarded: " + Rule.convert_tiles_to_str(ai.discarded)) print(f"strategies: {ai.strategies}") print(f"strategies_time: {ai.strategies_time}") print("draw count: " + str(ai.draw_count))
def try_mahjong(self, tile=None) -> bool: test = self.concealed[:] if tile: test.append(tile) if Rule.is_mahjong(test): choices = [] allowed_cmd = ['hu', 'cancel'] cmd = self.waiting_4_cmd(allowed_cmd=allowed_cmd, choices=choices) if cmd == 'cancel': return False elif cmd == 'hu': return True else: raise ValueError("exposed pong error cmd:", cmd) return False
def test_ai_mahjong(self): mj_set = MjSet() ai = PlayerAi("西施") mj_set.shuffle() for _ in range(13): ai.draw(mj_set) ai.sort_concealed() mj_set.shuffle() mahjong = False for _ in range(100): tile = ai.draw(mj_set) if Rule.is_mahjong(ai.concealed): mahjong = True break tile = ai.decide_discard() ai.discard(tile) ai.sort_concealed() # self.assertTrue(mahjong) self.assertGreater(len(ai.concealed), 0)
def play(self): current = self._dealer # the current player player = current before = None # the previous player current_discard = None # discard tile by previous player for player in self._players: print(f'{player.position}: {player}') print("=" * 40) have_winner = False while not have_winner: if current_discard: wind = current.position player = current for index in range(3): # test for hu by other test = player.concealed[:] test.append(current_discard) if Rule.is_mahjong(test): player.concealed.append(current_discard) print(f"winner is {player}, by {before}") self._winner = player self._state_machine.mahjong() have_winner = True break wind = Suit.get_next_wind(wind) player = self.positions[wind] if have_winner: break # interrupted by exposed kong / pong / chow interrupted = False if current_discard: # Melding another for current, +1, +2 players player = None # try kong ( must have tiles ): if self.mj_set.tiles: wind = current.position player = current for index in range(3): if player.try_exposed_kong(tile=current_discard, owner=before, mj_set=self._mj_set): interrupted = True break wind = Suit.get_next_wind(wind) player = self.positions[wind] # try pong: if not interrupted: wind = current.position player = current for index in range(3): if player.try_exposed_pong(tile=current_discard, owner=before): interrupted = True break wind = Suit.get_next_wind(wind) player = self.positions[wind] # try chow: if not interrupted: wind = current.position player = current if player.try_exposed_chow(current_discard, before): interrupted = True if not interrupted: before.put_on_desk(current_discard) # end if current_discard: if interrupted: current = player else: # test for out of tiles if not self.mj_set.tiles: print("out of tiles!") self._winner = None self._state_machine.withdraw() break # draw current.draw(self._mj_set) # test for hu by self if Rule.is_mahjong(current.concealed): print(f"winner is {current}, by self!") self._winner = current self._state_machine.mahjong() break # self kong current.try_conceal_kong(self.mj_set) if isinstance(current, PlayerAiAdv): wall = self._mj_set.tiles tile = current.decide_discard(players_count=len(self.players), wall=wall) else: tile = current.decide_discard() print(current, 'discard:', tile) current.discard(tile) current.sort_concealed() current_discard = tile # (f'{current} discard {tile}') # (Rule.convert_tiles_to_str(current.concealed)) # next player next = self._get_next_player(current) before = current current = next # end while print("tiles left :", len(self.mj_set.tiles)) for player in self.players: if player == self.winner: print(f"winner {player}: ", Rule.convert_tiles_to_str(player.concealed)) else: print(f"{player}: ", Rule.convert_tiles_to_str(player.concealed)) left = Rule.convert_tiles_to_arr(self.mj_set.tiles) left.sort() print(self.players[0].strategies) print(self.players[0].strategies_time)