【问题标题】:Tictactoe score check through a hash通过哈希检查 Tictactoe 分数
【发布时间】:2016-10-12 09:46:21
【问题描述】:

我一直在开发一个用 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

【问题讨论】:

    标签: ruby data-structures hashmap


    【解决方案1】:

    鉴于此哈希:

    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"}
    

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2013-07-20
      • 1970-01-01
      • 2015-04-25
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多