最初发布于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)
现在我确实遇到了很大麻烦,弄清楚如何验证其余部分的动作......
是否有一种有效的方法来验证其余部分的移动?
答案 0 :(得分:0)
你想:
你的问题并没有明确这个背景,如果没有这个背景,很难给出一个好的答案。国际象棋中的移动生成/验证在很大程度上取决于棋盘表示,并且(正如您所发现的),一维数组表示不易操作。
除非强制要求一维数组方法,否则我会考虑10 x 10矩阵表示或位板表示。前者更易于可视化。那么答案取决于我提到的4个背景中的哪一个是正确的。
编辑:根据您的评论,强制执行一维表示。在这种情况下,我首先预先计算棋盘上每个方块的每个棋子类型/颜色(国王,王后,车,主教,骑士,棋子)的可能移动。
因此,对于您在h2(16)上给出白色棋子的示例,可能的移动是23(g3),24(h3)和32(h4)。然后,您可以存储索引的所有组合,以便您可以使用位于该正方形上的方形数字和片段类型/颜色在执行时访问它们。
当然,在执行时,其中一些动作可能是非法的。如果23没有被敌人占领,则无法进行该移动。如果任何一块占用了24,则无法进行该移动。如果任何一块占用24或32,则该棋子不能移动到32.依此类推。