验证象棋移动

时间:2013-11-15 10:30:49

标签: logic verification

最初发布于math.stackexchange.com

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

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

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

我首先看了一下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)

现在我确实遇到了很大麻烦,弄清楚如何验证其余部分的动作......

是否有一种有效的方法来验证其余部分的移动?

1 个答案:

答案 0 :(得分:0)

你想:

  • 为填充的棋盘上的给定棋子生成移动。
  • 在未填充的棋盘上为给定棋子生成动作。
  • 在填充的棋盘上验证特定棋子移动
  • 在未填充的棋盘上验证特定棋子移动

你的问题并没有明确这个背景,如果没有这个背景,很难给出一个好的答案。国际象棋中的移动生成/验证在很大程度上取决于棋盘表示,并且(正如您所发现的),一维数组表示不易操作。

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

编辑:根据您的评论,强制执行一维表示。在这种情况下,我首先预先计算棋盘上每个方块的每个棋子类型/颜色(国王,王后,车,主教,骑士,棋子)的可能移动。

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

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