Fix piece movement generation

This commit is contained in:
0880
2026-01-21 13:58:14 +03:30
parent e786d42e98
commit 752061f92f

22
app.py
View File

@@ -365,14 +365,12 @@ def get_piece_moves(piece_kind, board: Board, is_white, src: str) -> list[Coord]
if (y == 1 or y == 6) and board.index_xy(x, y + 2 * dir) == Piece.EMPTY: if (y == 1 or y == 6) and board.index_xy(x, y + 2 * dir) == Piece.EMPTY:
valids.append(Coord(x=x, y=y + 2 * dir)) valids.append(Coord(x=x, y=y + 2 * dir))
if ( if (
board.index_xy(x + 1, y + dir) board.index_xy(x + 1, y + dir) not in [Piece.EMPTY, Piece.NONE]
not in [Piece.EMPTY, Piece.NONE, Piece.BLACK_KING, Piece.WHITE_KING]
and board.index_xy(x + 1, y + dir).value.isupper() != is_white and board.index_xy(x + 1, y + dir).value.isupper() != is_white
): ):
valids.append(Coord(x=x + 1, y=y + dir)) valids.append(Coord(x=x + 1, y=y + dir))
if ( if (
board.index_xy(x - 1, y + dir) board.index_xy(x - 1, y + dir) not in [Piece.EMPTY, Piece.NONE]
not in [Piece.EMPTY, Piece.NONE, Piece.BLACK_KING, Piece.WHITE_KING]
and board.index_xy(x - 1, y + dir).value.isupper() != is_white and board.index_xy(x - 1, y + dir).value.isupper() != is_white
): ):
valids.append(Coord(x=x - 1, y=y + dir)) valids.append(Coord(x=x - 1, y=y + dir))
@@ -469,7 +467,6 @@ def generate_valid_moves(
): ):
king = Coord(j, i) king = Coord(j, i)
break break
for m in possible_moves: for m in possible_moves:
fake_board = board.copy() fake_board = board.copy()
fake_board.grid[m.y][m.x] = fake_board.index(src) fake_board.grid[m.y][m.x] = fake_board.index(src)
@@ -478,24 +475,13 @@ def generate_valid_moves(
king_safe = True king_safe = True
for i in range(8): for i in range(8):
for j in range(8): for j in range(8):
p = board.grid[j][i] p = board.index_xy(j, i)
if p != Piece.EMPTY and p.value.isupper() != is_white: if p != Piece.EMPTY and p.value.isupper() != is_white:
# Enemy
enemy_moves = get_piece_moves(
p.value.lower(), board, not is_white, xy_to_pos_safe(j, i)
)
if king not in enemy_moves:
continue
ni = i
nj = j
if j == sx and i == sy:
ni = m.y
nj = m.x
new_enemy_moves = get_piece_moves( new_enemy_moves = get_piece_moves(
p.value.lower(), p.value.lower(),
fake_board, fake_board,
not is_white, not is_white,
xy_to_pos_safe(nj, ni), xy_to_pos_safe(j, i),
) )
if king in new_enemy_moves: if king in new_enemy_moves:
king_safe = False king_safe = False