比较散列数组之间的变化

时间:2016-01-08 18:27:03

标签: arrays ruby hash

我有一个数组,其中每个元素都是一个散列,代表整个国际象棋棋盘的简化版本。我正在尝试实施fifty-move draw rule,其中规定如果在五十次移动中没有捕获任何棋子且没有棋子移动,则可以声明平局。

这样做,我正在尝试保持DRY并使用我已经为another draw scenario实现的代码,这些代码目前正常运行。

每次转弯后都会保存棋盘的新“快照”,如下所示(在第一回合棋子从“a2”移动到“a4”之后):

board_snapshot = [{
"a1"=>"Rook", "a2"=>nil, "a3"=>nil, "a4"=>"Pawn", "a5"=>nil, "a6"=>nil, 
"a7"=>"Pawn", "a8"=>"Rook", "b1"=>"Knight", "b2"=>"Pawn", "b3"=>nil, 
"b4"=>nil, "b5"=>nil, "b6"=>nil, "b7"=>"Pawn", "b8"=>"Knight", 
"c1"=>"Bishop", "c2"=>"Pawn", "c3"=>nil, "c4"=>nil, "c5"=>nil, "c6"=>nil, 
"c7"=>"Pawn", "c8"=>"Bishop", "d1"=>"Queen", "d2"=>"Pawn", "d3"=>nil, 
"d4"=>nil, "d5"=>nil, "d6"=>nil, "d7"=>"Pawn", "d8"=>"Queen", "e1"=>"King", 
"e2"=>"Pawn", "e3"=>nil, "e4"=>nil, "e5"=>nil, "e6"=>nil, "e7"=>"Pawn", 
"e8"=>"King", "f1"=>"Bishop", "f2"=>"Pawn", "f3"=>nil, "f4"=>nil, 
"f5"=>nil, "f6"=>nil, "f7"=>"Pawn", "f8"=>"Bishop", "g1"=>"Knight", 
"g2"=>"Pawn", "g3"=>nil, "g4"=>nil, "g5"=>nil, "g6"=>nil, "g7"=>"Pawn",
"g8"=>"Knight", "h1"=>"Rook", "h2"=>"Pawn", "h3"=>nil, "h4"=>nil, 
"h5"=>nil, "h6"=>nil, "h7"=>"Pawn", "h8"=>"Rook"
}]

在伪代码中,我正在考虑通过创建一个方法来实现这五十个移动规则检查,该方法查看前五十个板快照以查看nil值的数量是否相同(没有捕获的部分)和如果是这样的话,不知何故看到每个典当都在同一个广场上。

我找到了比较两块电路板以查看nil值是否相同的方法:

board_snapshot[index].values.count(nil) == board_snapshot[index + 1].values.count(nil)

然而,我仍然无法想出一种方法来迭代超过50个板“快照”来对每个“快照”运行此测试。也不确定如何迭代50“快照”以确保没有Pawn移动。

如果通过创建一个“计数器”来实现这个规则会更容易,这个“计数器”会在捕获一个片段时重置,当Pawn被移动时让我知道,我试图提高效率并利用已经存在的代码。

1 个答案:

答案 0 :(得分:1)

我认为@sawa在评论中有正确的想法。你只需要检查Pawns是否处于与之前相同的位置(因为棋子不能向后移动,它们不能在一个快照中移动而在下一个快照中返回)

board_snapshot.last.delete_if{|_,v| v != "Pawn"} == board_snapshot[-50].delete_if{|_,v| v != "Pawn"}

同样(并使用您建议的代码)

board_snapshotlast.values.count(nil) == board_snapshot[-50].values.count(nil)

由于无法将棋子添加到棋盘上,因此您无需担心棋子在一次移动中消失并在下一次移动中重新出现。