Skip to content
This repository was archived by the owner on Jul 8, 2023. It is now read-only.

Commit 6a7d3e6

Browse files
committed
Fix a bug with wrong detection of common tiles for multiple players and honitsu hands
1 parent a79671f commit 6a7d3e6

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

project/mahjong/ai/defence/main.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,16 @@ def try_to_find_safe_tile_to_discard(self, discard_results):
106106

107107
# first try to check common safe tiles to discard for all players
108108
if len(threatening_players) > 1:
109-
common_safe_tiles = [x.all_safe_tiles for x in threatening_players]
110-
common_safe_tiles = list(set.intersection(*map(set, common_safe_tiles)))
111-
common_safe_tiles = [DefenceTile(x, DefenceTile.SAFE) for x in common_safe_tiles]
112-
113109
against_honitsu = []
114110
for player in threatening_players:
115111
if player.chosen_suit:
116-
against_honitsu += self._mark_safe_tiles_against_honitsu(player)
112+
against_honitsu += [self._mark_safe_tiles_against_honitsu(player)]
113+
114+
common_safe_tiles = [x.all_safe_tiles for x in threatening_players]
117115
common_safe_tiles += against_honitsu
116+
# let's find a common tiles that will be safe against all threatening players
117+
common_safe_tiles = list(set.intersection(*map(set, common_safe_tiles)))
118+
common_safe_tiles = [DefenceTile(x, DefenceTile.SAFE) for x in common_safe_tiles]
118119

119120
# there is no sense to calculate suji tiles for honitsu players
120121
not_honitsu_players = [x for x in threatening_players if x.chosen_suit is None]
@@ -164,13 +165,13 @@ def try_to_find_safe_tile_to_discard(self, discard_results):
164165
return result
165166

166167
# try to find safe tiles against honitsu
167-
against_honitsu = []
168168
if player.chosen_suit:
169169
against_honitsu = self._mark_safe_tiles_against_honitsu(player)
170+
against_honitsu = [DefenceTile(x, DefenceTile.SAFE) for x in against_honitsu]
170171

171-
result = self._find_tile_to_discard(against_honitsu, discard_results)
172-
if result:
173-
return result
172+
result = self._find_tile_to_discard(against_honitsu, discard_results)
173+
if result:
174+
return result
174175

175176
# we wasn't able to find safe tile to discard
176177
return None
@@ -222,5 +223,5 @@ def _mark_safe_tiles_against_honitsu(self, player):
222223
continue
223224

224225
if not player.chosen_suit(tile) and not is_honor(tile):
225-
against_honitsu.append(DefenceTile(tile, DefenceTile.SAFE))
226+
against_honitsu.append(tile)
226227
return against_honitsu

0 commit comments

Comments
 (0)