0

更新:我有答案...我会在几分钟后将其发布...谢谢您的时间。

我正在尝试输出包含一系列其他哈希的哈希。我可以在命令行上单独打印每个哈希值,但我需要将它们放在一个变量中,并通过和索引作为名称值对进行引用。我已经为此工作了好几天,非常感谢任何帮助。

PS我在Ruby中仍然很笨,所以如果你有一个可能的答案,你能否准确地证明我需要在有问题的方法中执行你的答案/线索......也许通过github gist。

这是整个模块......方法'generate_boards'中存在问题......

https://github.com/thefonso/rubytactoe/blob/minimax_1/lib/TTT_pseudo_code.rb

你可以看到我在这个测试中通过了有问题的方法......

https://github.com/thefonso/rubytactoe/blob/minimax_1/spec/TTT_pseudo_code_spec.rb

这是我目前得到的输出......

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

我想要的,应该是这样的......

 boards = {
   :vb01 => {:a1=>"X", :a2=>"X", :a3=>"O", :b1=>"O", :b2=>"O", :b3=>"O", :c1=>"O", :c2=>"X", :c3=>"X"},
   :vb02 => {:a1=>"X", :a2=>"X", :a3=>"O", :b1=>"O", :b2=>"O", :b3=>"O", :c1=>"O", :c2=>"X", :c3=>" "},
   :vb03 => {:a1=>"X", :a2=>"X", :a3=>"O", :b1=>"O", :b2=>"O", :b3=>"X", :c1=>"O", :c2=>"X", :c3=>"O"},
   :vb04 => {:a1=>"X", :a2=>"X", :a3=>"O", :b1=>"O", :b2=>"O", :b3=>" ", :c1=>"O", :c2=>"X", :c3=>"O"}
 }

这几天我一直在和这件事作斗争……谢谢你的关注。

4

2 回答 2

0

所以,我一直在看你的 TTT_pseudo_code.rb 文件,我不得不承认,我现在有点迷路了。一方面,我很困惑为什么你有一个模块,但是你包含了一个初始化方法,你在其中设置类实例变量(@@vars)。为什么不做一门课并完成它呢?

但是,抛开这些不谈,让我们把你现在拥有的东西拿来考虑如何把它变成你想要的东西。据推测,您所拥有的是一个哈希数组。您可以使用 Ruby Enumerable 方法注入将该数组转换为哈希,如下所示:

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

i = 1
hash_of_hashes = array_of_hashes.inject({}) do |hofh, hash|
  hofh["vb0#{i}".to_sym] = hash
  hofh
end

这应该给你一个散列,将你所拥有的东西转换成你在上面的问题中所要求的东西。

希望有帮助。

戴夫

于 2012-12-11T19:48:22.370 回答
0

好的,所以答案是这个重构的 generate_boards 方法...注意 @virtual_board_hash[@i] = new_board.grid

def generate_boards(board, player)
  virtual_board = board.dup
  new_board_hash = {}
  empty_spaces = virtual_board.grid.select{ |k, v| v == " " }.keys

  empty_spaces.each do |space|

    cloned_board = Board.new
    cloned_board.grid = board.grid.clone

    if player == 'O'
      new_board = move_as_somebody(cloned_board, 'X', space)
      new_player = 'X'
       @virtual_board_hash[@i] = new_board.grid
    else
      new_board = move_as_somebody(cloned_board, 'O', space)
      new_player = 'O'
       @virtual_board_hash[@i] = new_board.grid
    end
    generate_boards(new_board, new_player)

  end
  return @virtual_board_hash
end

这个 move_as_somebody 方法..注意@i

def move_as_somebody(board, player, empty_space)      
  board.grid[empty_space] = player
  @i+=1
  return board
end

但也在这个初始化方法中......我知道,我知道......我在模块中使用了一个初始化方法......为什么不把它称为一个类呢?好吧,我这样做只是为了运行测试,并且在测试内部我将此模块提供给一个类。

def initialize
  @virtual_board_hash = {}
  @count = 0
  @i = 0
end

在实际的游戏代码中,所有这些都只是作为一个模块调用,所以我将在未来的调用方法“minimax”中初始化这些变量,该方法将作用于生成的输出哈希。

于 2012-12-11T21:08:33.483 回答