Bug Description
In cog/games.py lines 293-300, the check_block_player() function has the same board corruption pattern as check_fork_opportunities().
cog/games.py#L293-L300
def check_block_player(self):
empty = [i for i, c in enumerate(self.board) if c == " "]
for idx in empty:
self.board[idx] = player_mark # <-- Corrupts board
if self.check_winner(player_mark):
self.board[idx] = " " # Only resets idx
return idx
self.board[idx] = " "
for i in range(self.size * self.size):
if self.board[i] == player_mark: # <-- Line 296: corrupts board
continue
self.board[i] = player_mark
if self.check_winner(player_mark):
self.board[i] = " " # Resets i but...
return idx
self.board[i] = " " # Only resets i on each iteration
return None
Impact: If check_winner(player_mark) returns True at line 297, the function returns before reaching line 299's cleanup. The board is left corrupted with extra player marks.
How to Fix
Apply the same fix - track all modified cells:
def check_block_player(self):
empty = [i for i, c in enumerate(self.board) if c == " "]
for idx in empty:
self.board[idx] = player_mark
modified = [idx]
if self.check_winner(player_mark):
for m in modified:
self.board[m] = " "
return idx
self.board[idx] = " "
for i in range(self.size * self.size):
if self.board[i] == player_mark:
continue
self.board[i] = player_mark
modified.append(i)
if self.check_winner(player_mark):
for m in modified:
self.board[m] = " "
return idx
self.board[i] = " "
return None
Severity
Critical - Causes incorrect bot defensive moves
Bug Description
In
cog/games.pylines 293-300, thecheck_block_player()function has the same board corruption pattern ascheck_fork_opportunities().cog/games.py#L293-L300Impact: If
check_winner(player_mark)returns True at line 297, the function returns before reaching line 299's cleanup. The board is left corrupted with extra player marks.How to Fix
Apply the same fix - track all modified cells:
Severity
Critical - Causes incorrect bot defensive moves