更新:我有答案......我会在短时间内发布所有内容...感谢您的时间。
我正在尝试输出包含一系列其他哈希值的哈希值。我可以在命令行上单独打印每个哈希,但我需要它们在变量中并引用via和index作为名称值对。我已经为此工作了好几天,非常感谢任何协助。
P.S。我在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"}
}
我已经打了几天这件事...感谢你的关注。
答案 0 :(得分:0)
所以,我一直在看你的TTT_pseudo_code.rb文件,我不得不承认,我现在有点迷失了。首先,我很困惑为什么你有一个模块,但是你要包含一个初始化方法,在其中设置类实例变量(@@ vars)。为什么不只是上课并完成它?
但是,除此之外,让我们把你现在拥有的东西考虑在内,并考虑如何将其转化为你想要的东西。据推测,你所拥有的是一系列哈希开始。您可以使用Ruby Enumerable方法inject将该数组转换为哈希,如下所示:
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
这应该会为您提供一个哈希值,将您所拥有的内容转换为您在上述问题中所要求的内容。
希望有所帮助。
戴夫
答案 1 :(得分: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'中初始化这些变量,该方法将对结果输出散列起作用。