2017-06-18 6 views
-2

誰かがこのRubyコードが何をしているのか理解できますか?このRubyコードは何をしていますか?

def initialize(board = nil) 
    @board = board || Array.new(9, " ") 
end 

def won? 
    WIN_COMBINATIONS.detect do |combo| 
    position(combo[0]) == position(combo[1]) && position(combo[1]) == position(combo[2]) && position_taken?(combo[0]) 
    end 
end 

def position(location) 
    @board[location.to_i] 
end 

WIN_COMBINATIONS = [ 
    #horizontal 
    [0,1,2], 
    [3,4,5], 
    [6,7,8], 
    #vertical 
    [0,3,6], 
    [1,4,7], 
    [2,5,8], 
    #diagonal 
    [0,4,8], 
    [6,4,2] 
] 

私は具体的には以下を理解していない:

  1. won?方法が動作している方法は?
  2. won?はどのようにしてpositionを使用していますか?
+1

「won?」メソッドはどこですか? –

+2

明らかに、コードはより大きなクラスの一部ですが、あなた自身が実行可能ではない抜粋のみを表示しています。助けを得るためには、[mcve]を提供する必要があります。 – Stefan

+0

def won? WIN_COMBINATIONS.detect do | combo | 位置(コンボ[0])==位置(コンボ[1])&&位置(コンボ[1])==位置(コンボ[2])&& position_taken?(コンボ[0]) エンド エンド –

答えて

2

このコードでは、tic-tac-toeのためにWIN_COMBINATIONSを定義しています。あなたのマークの3つを同じ行に置くことによって、水平に勝つ3つの方法があります。あなたのマークの3つを同じ列に置くことによって、垂直に勝つには3つの方法があります。あなたのマークの3つを同じ対角線に置くことによって、斜めに勝つには2通りの方法があります。

ゲームがwonであるか否かを判定するために、あなたはつまり、3同様のマークがcombo秒のいずれかのために存在し、すべての勝ちの組み合わせを取得し、ゲームがwonあるかどうかを確認する必要があります。

positionは、特定のpositionboardの値を返します。 wonは、comboの目的のインデックスを渡すことによってpositionを呼び出します。

1

won?メソッドはどのように動作しますか?それが勝利の位置を設立するまで

それは、一つ一つ、すべての可能なWIN_COMBINATIONSを流れる電流@boardを探しています。

これは、detectが対象です。 docsから:

ブロックに列挙内の各エントリを渡します。 ブロックの最初のものを返します。

最初の位置を獲得する(detectブロック内側すなわち条件はfalseで)一致していないのであればそれは次のいずれかに移動します。一致するとすぐに検索が停止します(条件はtrue)。

won?はどのようにpositionを使用していますか?

positionlocation@board配列のインデックスである所与location、で@boardの値を返します。入賞組合せにおけるすべてのlocation(すなわちcomboのすべての値)が同じ値を持ち、その値が空白であるか否かをチェックする場合

won?を比較する(私はposition_taken?がそのチェックを行うことを想定します)。

x | o | o 
---+---+--- 
x | x | x 
---+---+--- 
o | | 

として@boardコンテンツに変換:

は、例えば、次の位置でボードを考慮

["x", "o", "o", "x", "x", "x", "o", " " ," "] 
# 0 1 2 3 4 5 6 7 8 

第2の配線は、アレイ内の各位置のインデックスを示し;私は参考のためだけにそれを含めます。

ので、won?が呼び出されたときに、それはそうのように、WIN_COMBINATIONSを反復処理:

に変換
# First iteration 
combo = [0,1,2] 

position(0) == position(1) && position(1) == position(2) && position_taken?(0) 

@board[0] == @board[1] && @board[1] == @board[2] && position_taken?(0) 

そしてへ:

"x" == "o" && "o" == "o" && true 

この意志最初の共同会社以来falseに評価(trueを返すために)(&&オペレータすべての条件がtrueである必要がある場合)。それはfalseあるので、

ので、反復は続く:に変換

# Second iteration 
combo = [3,4,5] 

position(3) == position(4) && position(4) == position(5) && position_taken?(0) 

@board[3] == @board[4] && @board[4] == @board[5] && position_taken?(3) 

そしてその後に:

"x" == "x" && "x" == "x" && true 

これは、以来trueと評価されますすべて comビンビンはtrueであるため、反復は停止し、win?true と評価されます。 as pointed outengineersmnkyにより、won?が truthy値[3,4,5] (Array)ないtrue (TrueClass)を返します、

注意してください。

+1

技術的には' won? 'で真偽値が' [3,4,5] '(' Array')ではなく 'true'(' TrueClass')を返します。このメソッドは '?'で終了するので、ブール型の応答 'Enumerable#any?'Enumerable#detect'よりも良い選択肢となり、適切に応答するでしょう。 – engineersmnky

+0

@engineersmnkyあなたは正しい見解ですが、' detect'は一致した要素または 'nil'を返します。私は答えにメモを追加します。ありがとうございました! – Gerry

関連する問題