【问题标题】:Can somebody explain this example code?有人可以解释这个示例代码吗?
【发布时间】:2023-03-09 01:50:01
【问题描述】:

我正在做一个国际象棋游戏,但无法理解这段代码,请有人给我解释一下。

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

【问题讨论】:

  • 骑士可以向一个方向移动 2 个空格,向另一个方向移动 1 个空格。这些是所有这些可能动作的枚举。
  • 看起来这更像是一个关于国际象棋的问题而不是 python
  • 仅供参考,[x+1], [y+2] 出现两次。
  • 这段代码语法错误。
  • 画出一个 5 x 5 的网格。用x, y 标记中心正方形,并为xy 选择+- 的方向。查看马可以从中心方块移动的位置,并将其与此处代码中的偏移量进行比较。

标签: python arrays python-3.x


【解决方案1】:

骑士可以以 L 的形状移动。也就是说,超过 2,超过 1。或者下降两个然后超过一个。实际上,您必须考虑到骑士可以从给定位置制造的所有 L。所以左,右,上或下两个。然后从那里骑士可以过去(左或右)一个。所以你的选择是:

  • 向左 2,然后向下 1
  • 左 2,然后上 1
  • 向右 2,然后向上 1
  • 向右 2,然后向下 1
  • 上 2,然后左 1
  • 上 2,然后右 1
  • 向下 2,然后向左 1
  • 向下 2,然后向右 1

我们不是说 up 和 down 或 left after right ,而是将 up-down 分别转换为正和负 y ,将 left-right 分别转换为正 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 | - - - - - - - -

【讨论】:

  • 没问题。祝你好运。
【解决方案2】:

一个国际象棋问题值得一个国际象棋答案。

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

如果您可以将棋盘想象为图形上的 xy 坐标,则马可以移动 [(x + (1 or 2)), (y + (2 or 1)] 位置。你可能认为这会产生 2 个不同的移动:[x+1, y+2], [x+2, y+1]. 但是xy: -x, +y; -x, -y; + x, -y; -y, +x, +x, + y。因此,有 4*2 = 8 种可能的组合,如上图所示。

至于代码,我将把它留作练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多