2016-10-12 4 views
0

私はRubyで書かれたコマンドラインのTictactoeゲームに取り組んできました。 (規則を覚えていない人にはsee hereを入力してください)Tictactoeのスコアによるハッシュチェック

私が見た実装例のほとんどは、多次元配列を使って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 

答えて

0

このハッシュを考える:

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"} 
関連する問題