如何重构generate_boards方法以实现所需的输出?

时间:2012-12-11 19:00:58

标签: ruby

更新:我有答案......我会在短时间内发布所有内容...感谢您的时间。

我正在尝试输出包含一系列其他哈希值的哈希值。我可以在命令行上单独打印每个哈希,但我需要它们在变量中并引用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"}
 }

我已经打了几天这件事...感谢你的关注。

2 个答案:

答案 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'中初始化这些变量,该方法将对结果输出散列起作用。