Tictactoe通过哈希检查得分

时间:2016-10-12 09:46:22

标签: ruby data-structures hashmap

我一直致力于用Ruby编写的命令行Tictactoe游戏。 (对于那些不记得规则的人,请see here

我见过的几乎所有示例实现都使用多维数组来表示Board结构。它就像[[1,2,3], [4,5,6], [7,8,9]]。 (Here is an example

然而,在看到任何其他解决方案之前,我开始使用哈希实现。我用字母(A,B,C)表示列,用数字(1,2,3)表示行,我设置" X"或者" O"作为价值。游戏中的示例实现:

{:a1=>"X", :b2=>"X", :c3=>"X", :b1=>"O", :c1=>"X", :c2=>"O", :b3=>"X", :a2=>"O", :a3=>"X"}

(在每一步中,我都会将新位置添加到此哈希。它是一种单元格网格。很容易在ASCII表格中可视化。)

在我开始寻找确定获胜位置的方法之前,一切都感觉很棒。但是现在我一直在寻找一种好方法来使用我的哈希值来确定它是否是胜利者。

您能告诉我如何使用哈希解决问题吗?和/或者你可以解释为什么在这种特殊情况下使用哈希而不是多维数组是个坏主意吗?

这是一种糟糕的方式来检查它是否是胜利者的位置(对于单一场景......):

  def check_status
    if(@@cells[:a1] == "X" && @@cells[:a2] == "X" && @@cells[:a3] == "X")
      false # game will end
    else
      true # game will continue
    end
  end

1 个答案:

答案 0 :(得分:0)

鉴于此哈希:

board = {
  :a1=>"X", :a2=>"O", :a3=>"X",
  :b1=>"O", :b2=>"X", :b3=>"X",
  :c1=>"X", :c2=>"O", :c3=>"X"
}

您可以定义要检查的键:(可能的获胜位置)

KEYS = [
  [:a1, :a2, :a3], [:b1, :b2, :b3], [:c1, :c2, :c3], # rows
  [:a1, :b1, :c1], [:a2, :b2, :c2], [:a3, :b3, :c3], # columns
  [:a1, :b2, :c3], [:c1, :b2, :a3]                   # diagonals
]

现在,您可以通过values_at获取每个密钥的值,并检查它们是"X", "X", "X"还是"O", "O", "O"

wins = {}

KEYS.each do |k|
  case board.values_at(*k)
  when %w[X X X] then wins[k] = 'X'
  when %w[O O O] then wins[k] = 'O'
  end
end

wins #=> {[:a3, :b3, :c3]=>"X", [:a1, :b2, :c3]=>"X", [:c1, :b2, :a3]=>"X"}