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 ファイルを少し見てきましたが、認めざるを得ません。1 つには、モジュールがある理由がわかりませんが、初期化メソッドが含まれており、その中にクラス インスタンス変数 (@@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

これにより、あなたが持っているものを上記の質問で求めたものに正確に変換するハッシュが得られるはずです。

それが役立つことを願っています。

デイブ

于 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 に答える