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]) 结束 结束 –