def test_init_round(self): table = Table() round_number = 4 count_of_honba_sticks = 2 count_of_riichi_sticks = 3 dora_indicator = 126 dealer = 3 scores = [250, 250, 250, 250] table.init_round(round_number, count_of_honba_sticks, count_of_riichi_sticks, dora_indicator, dealer, scores) self.assertEqual(table.round_number, round_number) self.assertEqual(table.count_of_honba_sticks, count_of_honba_sticks) self.assertEqual(table.count_of_riichi_sticks, count_of_riichi_sticks) self.assertEqual(table.dora_indicators[0], dora_indicator) self.assertEqual(table.get_player(dealer).is_dealer, True) self.assertEqual(table.get_player(dealer).scores, 25000) dealer = 2 table.get_main_player().in_tempai = True table.get_main_player().in_riichi = True table.init_round(round_number, count_of_honba_sticks, count_of_riichi_sticks, dora_indicator, dealer, scores) # test that we reinit round properly self.assertEqual(table.get_player(3).is_dealer, False) self.assertEqual(table.get_main_player().in_tempai, False) self.assertEqual(table.get_main_player().in_riichi, False) self.assertEqual(table.get_player(dealer).is_dealer, True)
def test_detect_enemy_tempai_and_riichi(self): table = Table() self.assertEqual(table.get_player(1).in_tempai, False) self.assertEqual(table.get_player(1).is_threatening, False) table.add_called_riichi(1) self.assertEqual(table.get_player(1).in_tempai, True) self.assertEqual(table.get_player(1).is_threatening, True)
def test_set_scores(self): table = Table() table.init_round(0, 0, 0, 0, 0, []) scores = [230, 110, 55, 405] table.set_players_scores(scores) self.assertEqual(table.get_player(0).scores, 23000) self.assertEqual(table.get_player(1).scores, 11000) self.assertEqual(table.get_player(2).scores, 5500) self.assertEqual(table.get_player(3).scores, 40500)
def test_temporary_safe_tiles(self): table = Table() table.add_discarded_tile(1, self._string_to_136_tile(man='4'), False) self.assertEqual(table.get_player(1).temporary_safe_tiles, []) self.assertEqual(table.get_player(2).temporary_safe_tiles, [3]) self.assertEqual(table.get_player(3).temporary_safe_tiles, [3]) table.add_discarded_tile(2, self._string_to_136_tile(man='5'), False) self.assertEqual(table.get_player(1).temporary_safe_tiles, [4]) self.assertEqual(table.get_player(2).temporary_safe_tiles, []) self.assertEqual(table.get_player(3).temporary_safe_tiles, [3, 4]) table.add_discarded_tile(3, self._string_to_136_tile(man='6'), False) self.assertEqual(table.get_player(1).temporary_safe_tiles, [4, 5]) self.assertEqual(table.get_player(2).temporary_safe_tiles, [5]) self.assertEqual(table.get_player(3).temporary_safe_tiles, []) table.add_discarded_tile(1, self._string_to_136_tile(man='7'), False) self.assertEqual(table.get_player(1).temporary_safe_tiles, []) self.assertEqual(table.get_player(2).temporary_safe_tiles, [5, 6]) self.assertEqual(table.get_player(3).temporary_safe_tiles, [6])
class Client(object): statistics = None id = '' position = 0 def __init__(self, use_previous_ai_version=False): self.table = Table(use_previous_ai_version) self.statistics = Statistics() self.player = self.table.get_main_player() self.id = make_random_letters_and_digit_string() def authenticate(self): pass def start_game(self): pass def end_game(self): pass def init_hand(self, tiles): self.player.init_hand(tiles) def draw_tile(self, tile): self.table.count_of_remaining_tiles -= 1 self.player.draw_tile(tile) def discard_tile(self): return self.player.discard_tile() def call_meld(self, meld): # when opponent called meld it is means # that he will not get the tile from the wall # so, we need to compensate "-" from enemy discard method self.table.count_of_remaining_tiles += 1 return self.table.get_player(meld.who).add_meld(meld) def enemy_discard(self, player_seat, tile): self.table.get_player(player_seat).add_discarded_tile(tile) self.table.count_of_remaining_tiles -= 1 for player in self.table.players: if player.in_riichi: player.safe_tiles.append(tile) def enemy_riichi(self, player_seat): self.table.get_player(player_seat).in_riichi = True
def test_set_scores_and_uma(self): table = Table() table.init_round(0, 0, 0, 0, 0, []) scores = [230, 110, 55, 405] uma = [-17, 3, 48, -34] table.set_players_scores(scores, uma) self.assertEqual(table.get_player(0).scores, 23000) self.assertEqual(table.get_player(0).uma, -17) self.assertEqual(table.get_player(1).scores, 11000) self.assertEqual(table.get_player(1).uma, 3) self.assertEqual(table.get_player(2).scores, 5500) self.assertEqual(table.get_player(2).uma, 48) self.assertEqual(table.get_player(3).scores, 40500) self.assertEqual(table.get_player(3).uma, -34)
def test_set_names_and_ranks(self): table = Table() table.init_round(0, 0, 0, 0, 0, []) values = [ {'name': 'NoName', 'rank': u'新人'}, {'name': 'o2o2', 'rank': u'3級'}, {'name': 'shimmmmm', 'rank': u'三段'}, {'name': u'川海老', 'rank': u'9級'} ] table.set_players_names_and_ranks(values) self.assertEqual(table.get_player(0).name, 'NoName') self.assertEqual(table.get_player(0).rank, u'新人') self.assertEqual(table.get_player(3).name, u'川海老') self.assertEqual(table.get_player(3).rank, u'9級')
def test_add_safe_tile_after_discard(self): table = Table() table.add_called_riichi(3) table.add_discarded_tile(1, self._string_to_136_tile(man='3'), False) table.add_discarded_tile(0, self._string_to_136_tile(man='4'), False) self.assertEqual(len(table.get_player(1).discards), 1) self.assertEqual(len(table.get_player(2).discards), 0) self.assertEqual(len(table.get_player(3).discards), 0) self.assertEqual(len(table.get_player(1).safe_tiles), 1) self.assertEqual(len(table.get_player(2).safe_tiles), 0) self.assertEqual(len(table.get_player(3).safe_tiles), 2) # "2" is 3 man self.assertEqual(table.get_player(1).safe_tiles, [2]) self.assertEqual(table.get_player(3).safe_tiles, [2, 3])
def test_set_scores_and_recalculate_player_position(self): table = Table() table.init_round(0, 0, 0, 0, 0, []) scores = [230, 110, 55, 405] table.set_players_scores(scores) self.assertEqual(table.get_player(0).position, 2) self.assertEqual(table.get_player(1).position, 3) self.assertEqual(table.get_player(2).position, 4) self.assertEqual(table.get_player(3).position, 1) scores = [110, 110, 405, 405] table.set_players_scores(scores) self.assertEqual(table.get_player(0).position, 3) self.assertEqual(table.get_player(1).position, 4) self.assertEqual(table.get_player(2).position, 1) self.assertEqual(table.get_player(3).position, 2)
def test_detect_enemy_tempai_and_opened_sets(self): table = Table() self.assertEqual(table.get_player(1).in_tempai, False) self.assertEqual(table.get_player(1).is_threatening, False) table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(sou='567'))) table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(pin='123'))) table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(man='345'))) table.add_called_meld( 1, self._make_meld(Meld.PON, self._string_to_136_array(man='777'))) self.assertEqual(table.get_player(1).in_tempai, True) self.assertEqual(table.get_player(1).is_threatening, False) table.dora_indicators = [self._string_to_136_tile(man='6')] # enemy opened the pon of dor, so better to fold against him self.assertEqual(table.get_player(1).in_tempai, True) self.assertEqual(table.get_player(1).is_threatening, True)
def test_try_to_detect_honitsu_hand(self): table = Table() table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(pin='567'))) table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(pin='123'))) table.add_called_meld( 1, self._make_meld(Meld.CHI, self._string_to_136_array(pin='345'))) table.add_discarded_tile(1, self._string_to_136_tile(sou='1'), False) table.add_discarded_tile(1, self._string_to_136_tile(sou='5'), False) table.add_discarded_tile(1, self._string_to_136_tile(sou='8'), False) table.add_discarded_tile(1, self._string_to_136_tile(sou='9'), False) table.add_discarded_tile(1, self._string_to_136_tile(man='1'), False) table.add_discarded_tile(1, self._string_to_136_tile(man='1'), False) table.add_discarded_tile(1, self._string_to_136_tile(pin='1'), False) self.assertEqual(table.get_player(1).is_threatening, True) self.assertEqual(table.get_player(1).chosen_suit, is_pin)
def test_find_common_safe_tile_to_discard(self): table = Table() tiles = self._string_to_136_array(sou='2456', pin='234478', man='2336') table.player.init_hand(tiles) table.add_discarded_tile(1, self._string_to_136_tile(sou='6'), False) table.add_discarded_tile(1, self._string_to_136_tile(pin='5'), False) table.add_discarded_tile(2, self._string_to_136_tile(pin='5'), False) table.add_discarded_tile(2, self._string_to_136_tile(sou='6'), False) table.add_called_riichi(1) table.add_called_riichi(2) # for this test we don't need temporary_safe_tiles table.get_player(1).temporary_safe_tiles = [] table.get_player(2).temporary_safe_tiles = [] result = table.player.discard_tile() self.assertEqual(self._to_string([result]), '6s')
def test_find_dealer_tile_to_discard(self): dealer = 2 dora = self._string_to_136_tile(honors='3') table = Table() table.init_round(0, 0, 0, dora, dealer, []) tiles = self._string_to_136_array(sou='2234678', pin='34', man='45789') table.player.init_hand(tiles) table.add_discarded_tile(1, self._string_to_136_tile(man='4'), False) table.add_discarded_tile(1, self._string_to_136_tile(man='5'), False) table.add_discarded_tile(2, self._string_to_136_tile(man='8'), False) table.add_discarded_tile(2, self._string_to_136_tile(man='9'), False) table.add_called_riichi(1) table.add_called_riichi(2) # for this test we don't need temporary_safe_tiles table.get_player(1).temporary_safe_tiles = [] table.get_player(2).temporary_safe_tiles = [] result = table.player.discard_tile() # second player is a dealer, let's fold against him self.assertEqual(self._to_string([result]), '9m') tiles = self._string_to_136_array(sou='234567', pin='348', man='234', honors='23') table.player.init_hand(tiles) result = table.player.discard_tile() # there is no safe tiles against dealer, so let's fold against other players self.assertEqual(table.player.ai.in_defence, True) self.assertEqual(self._to_string([result]), '4m')