如何在棋盘上模拟 Bishop 运动
How to model Bishop movement on a chessboard
我有一个棋盘,我想在上面模拟象的可能走法。我尝试了这段代码:
for c1, c2 in [(1, -1), (1, 1), (-1, -1), (-1, 1)]:
for x, y in [range(x+c1, board_size), range(y+c2, board_size)]:
moves.append(x, y)
但是找到所有的着法是不行的。然而,我不明白为什么。它不检查所有四个方向吗?
你的逻辑是正确的,但你的执行不是。
- 一半的计算必须从
x
或 y
到 0(另一半从 x
或 y
到 board_size
- 使用默认步长,范围不能从大值到小值工作,因此您需要引入步长 -1 以从
x
或 y
计数到 0
- 您应该使用
zip()
创建一个可迭代的元组集合。
这会起作用:
right_up = zip(range(x + 1, board_size), range(y - 1, -1, -1))
right_down = zip(range(x + 1, board_size), range(y + 1, board_size))
left_up = zip(range(x - 1, -1, -1), range(y - 1, -1, -1))
left_down = zip(range(x - 1, -1, -1), range(y + 1, board_size))
for r in (right_up, right_down, left_up, left_down):
for new_x, new_y in r: # add coordinates to move list
我有一个棋盘,我想在上面模拟象的可能走法。我尝试了这段代码:
for c1, c2 in [(1, -1), (1, 1), (-1, -1), (-1, 1)]:
for x, y in [range(x+c1, board_size), range(y+c2, board_size)]:
moves.append(x, y)
但是找到所有的着法是不行的。然而,我不明白为什么。它不检查所有四个方向吗?
你的逻辑是正确的,但你的执行不是。
- 一半的计算必须从
x
或y
到 0(另一半从x
或y
到board_size
- 使用默认步长,范围不能从大值到小值工作,因此您需要引入步长 -1 以从
x
或y
计数到 0 - 您应该使用
zip()
创建一个可迭代的元组集合。
这会起作用:
right_up = zip(range(x + 1, board_size), range(y - 1, -1, -1))
right_down = zip(range(x + 1, board_size), range(y + 1, board_size))
left_up = zip(range(x - 1, -1, -1), range(y - 1, -1, -1))
left_down = zip(range(x - 1, -1, -1), range(y + 1, board_size))
for r in (right_up, right_down, left_up, left_down):
for new_x, new_y in r: # add coordinates to move list