即时制作国际象棋游戏,我很难理解这段代码,有人可以向我解释。
def enumerate_moves(x, y):
potential_moves = []
# If the piece at position (x,y) is a Knight
if board[x][y] is "Knight":
potential_moves.append([[x+2], [y+1]])
potential_moves.append([[x+2], [y-1]])
potential_moves.append([[x+1], [y+2]])
potential_moves.append([[x+1], [y-2]])
potential_moves.append([[x-2], [y-1]])
potential_moves.append([[x-2], [y+1]])
potential_moves.append([[x-1], [y+2]])
potential_moves.append([[x-1], [y-2]])
我理解代码的概念,但只是不明白这些([x-1],[y-2])是如何在8乘8的二维数组上进行可能的骑士移动。有人可以解释如何进行这些计算。谢谢!
答案 0 :(得分:0)
以下是骑士在国际象棋棋盘上的可能动作。我们选择了一个中心位置来最大化可能的移动次数。如果骑士在角落里,它的动作会受到限制。
如果您可以将棋盘想象为图表上的 x 和 y 坐标,骑士可以移动[( x )的任意组合+(1或2)),( y +(2或1)]位置。您可能认为这会产生两种不同的动作:[ x +1, y +2],[ x + 2, y +1]。但 x 有4个潜在的符号组合 y : - x ,+ y ; - x , - y ; + x , - y ; - y ,+ x ,+ x ,+ y 。因此,有4 * 2 = 8种可能的组合,如上图所示。
关于代码,我将把它留作练习。
答案 1 :(得分:0)
骑士可以以L的形状移动。这是两个,超过一个。或者下来两个然后超过一个。实际上,你必须考虑一个骑士可以从给定地点制作的所有L's。所以左,右,上,下两个。然后从那里骑士可以越过(左或右)一个。所以你的选择是:
我们不是分别上下左右,也不是左右后左右,而是分别向上和向下翻译为正{和负y
,而左右分别为正x和负x。也就是说,在二维笛卡尔平面中(我们从代数类中知道它的网格)。话虽如此,选项列表转换为如下所示。
[x-2][y+1]
[x-2][y-1]
[x+2][y-1]
[x+2][y+1]
[y-2][y-1]
[y-2][y+1]
[y+2][y-1]
[y+2][y+1]
所以,举一个小例子。如果骑士位于[0, 0]
位置,我们会遇到这样的情况:
| 0 1 2 3 4 5 6 7
__|_________________
0 | K - - - - - - -
1 | - - - - - - - -
2 | - - - - - - - -
3 | - - - - - - - -
4 | - - - - - - - -
5 | - - - - - - - -
6 | - - - - - - - -
7 | - - - - - - - -
而且,我们想要向右走2,向下走1([x+2][y+1]
),结果如下:
| 0 1 2 3 4 5 6 7
__|_________________
0 | - - - - - - - -
1 | - - K - - - - -
2 | - - - - - - - -
3 | - - - - - - - -
4 | - - - - - - - -
5 | - - - - - - - -
6 | - - - - - - - -
7 | - - - - - - - -