won?
方法的運行方式是什麼?
它是通過所有可能的WIN_COMBINATIONS
搜索當前@board
,一個接一個,直到它開創一個成功的位置。
這就是detect
的用途;從docs:
通行證在枚舉塊每個條目。返回第一個爲 塊不爲假。
因此,如果第一中獎位置不匹配(內側detect
塊即條件是false
)它移動到下一個;它一找到匹配就停止查找(即條件是true
)。
won?
如何使用position
方法?
position
在給定location
,其中location
是@board
數組的索引返回@board
值。
won?
比較如果在獲勝組合每location
(即,在每combo
值)具有相同的值,並檢查值是否是不是空白(ⅰ假定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
第二行表示在陣列中的每個位置的索引;我把它僅僅作爲參考。
所以,當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
ndition爲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 binations是true
,所以迭代將停止,並且win?
也將評估爲true
。
注意,as pointed out由engineersmnky,won?
會返回一個 truthy價值[3,4,5] (Array)
不true (TrueClass)
。
哪裏是'won?'方法? –
顯然,代碼是更大類的一部分,但是您只顯示不能單獨運行的摘錄。爲了獲得幫助,你必須提供[mcve]。 – Stefan
def won? WIN_COMBINATIONS.detect do | combo | (組合[0])==位置(組合[1])&&位置(組合[1])==位置(組合[2])&& position_taken?(組合[0]) 結束 結束 –