有人可以解释这个示例代码吗?

时间:2018-02-05 22:53:52

标签: python arrays python-3.x

即时制作国际象棋游戏,我很难理解这段代码,有人可以向我解释。

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的二维数组上进行可能的骑士移动。有人可以解释如何进行这些计算。谢谢!

2 个答案:

答案 0 :(得分:0)

国际象棋问题值得国际象棋答辩。

以下是骑士在国际象棋棋盘上的可能动作。我们选择了一个中心位置来最大化可能的移动次数。如果骑士在角落里,它的动作会受到限制。

enter image description here

如果您可以将棋盘想象为图表上的 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。所以左,右,上,下两个。然后从那里骑士可以越过(左或右)一个。所以你的选择是:

  • 左2,然后下1
  • 左2,然后上升1
  • 右2,然后上升1
  • 右2,然后是1
  • up 2,然后离开1
  • up 2,然后是right 1
  • 下来2,然后离开1
  • 向下2,然后向右1

我们不是分别上下左右,也不是左右后左右,而是分别向上和向下翻译为正{和负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 | - - - - - - - -
相关问题