1

最初发布于 math.stackexchange.com

我正在尝试验证移动棋子是否有效,其中移动是在一维中计算的。

而不是将棋盘上的方格标识为{A1, B1, C1, ...},而是将它们分别标识为{1, 2, 3, ...}

计算有效动作是通过加法/减法完成的,但它不是很可靠,因为它可能会暗示一些非常错误的动作。

我首先查看了pawn的行为:

  • 它一次移动一个方格(如果处于起始位置,则移动两个方格)。
  • 它是对角线,一个正方形。

所以一个pawn的移动可能性就是它的当前位置加上8(或16),即:

C2 = 11,

11 + 8 = 19 = C3

现在,打击应该同样容易;只需加/减 7 或 9,但这并不完全正确...

如果一个棋子在 H2 上,它被识别为 16,然后攻击:

16 + 9 = 35 = A4,

显然是一个无效的举动。

为避免这种情况,我检查了(对于白色棋子)棋子的当前位置(表示为P)是否为:

((P + 7) % 8 != 0) && (P % 8 != 0)

现在我真的很难弄清楚如何验证其余部分的移动......

有没有一种有效的方法来验证剩余棋子的移动?

4

1 回答 1

0

您是否尝试:

  • 在已填充的棋盘上为给定棋子生成移动。
  • 在无人居住的棋盘上为给定棋子生成移动。
  • 在填充的棋盘上验证特定的棋子移动
  • 在无人居住的棋盘上验证特定棋子的移动

您的问题并没有使这个上下文清楚,没有那个上下文就很难给出一个好的答案。国际象棋中的移动生成/验证在很大程度上取决于棋盘表示,并且(正如您所发现的)一维数组表示不是很容易操作。

除非强制使用一维数组方法,否则我会考虑 10 x 10 矩阵表示或位板表示。前者更易于可视化。那么答案取决于我提到的 4 个上下文中哪一个是正确的。

编辑:根据您的评论,一维表示是强制性的。在这种情况下,我会首先为棋盘上的每个方格预先计算每种棋子类型/颜色(国王、王后、车、象、马、兵)的可能移动。

因此,对于您在 h2 (16) 上给出的白棋示例,可能的移动是 23 (g3)、24 (h3) 和 32 (h4)。然后,您可以存储索引的所有组合,以便您可以在执行时使用位于该正方形上的正方形编号和棋子类型/颜色来访问它们。

当然,在执行时,其中一些动作可能是非法的。如果 23 没有被敌方棋子占据,则无法进行该动作。如果 24 被任何棋子占据,则不能进行该动作。如果 24 或 32 被任何棋子占据,则棋子不能移动到 32。以此类推。

于 2013-11-15T12:06:05.767 回答