我不确定主题标题是否足够具体,但这里有。我有两个方法 - 一个迭代一些数组以及块中的条件以推出正确的数据。
这是代码
def iterate_lines
WIN_COMBINATIONS.each_with_index do |line,index|
lines = @board[line[0]] + @board[line[1]] + @board[line[2]]
if lines.include?("X") && !lines.include?("O")
scores = tally_scores(lines.count("X"),"X",index)
elsif lines.include?("O") && !lines.include?("X")
scores = tally_scores(lines.count("O"),"O",index)
elsif lines.include?("X") && lines.include?("O")
scores = tally_scores(0,"",index)
elsif !lines.include?("X") && !lines.include?("O")
scores = tally_scores(0,"",index)
end
p scores
end
end
另一种方法是根据我选择的启发式方法计算得分。
def tally_scores(score,player,index)
score = 1 if score == 1 && player == "X"
score = -1 if score == 1 && player == "O"
score = 10 if score == 2 && player == "X"
score = -10 if score == 2 && player == "O"
score = 100 if score == 3 && player == "X"
score = -100 if score == 3 && player == "O"
score
end
调用' iterate_lines我可以从“tally_scores”中输出正确的值,或者正如我在此处所示,通过设置变量'得分'通过' iterate_lines'进行调用,这样我就可以将它们从#iterate_lines'中打印出来。
自然地来自' iterate_lines'的返回值。是数组(WIN_COMBINATIONS)。硬编码return scores
显然会给我最后一个值。
我的问题是我有第三种方法,需要从“tally_scores”中得到什么?然而,我无法将其作为常规论点传递,即my_method(scores)
。原因是第3种方法有它自己的参数列表,由于其他原因它被传递。此外,在调用该方法之前,它将是零。
def get_scores
# other code
#: something like this:
score = iterate_lines
# or
score = tally_scores
# or
# ?
end
所以我觉得我可能会把自己放在一个角落,应该把我所拥有的东西丢弃并重新启动。我会说我尝试了“tally_scores'并将分数放入实例变量数组中。我发现当我通过它时,除了最后一个值之外的所有值都保持不变。
答案 0 :(得分:1)
这里有几个问题。首先,正如您在使用each_with_index
时所看到的那样,除了使用副作用外,该块中发生的任何事情都不会产生影响。如果您在该块中设置变量,则每次迭代都会重置该变量。
您可以将其更改为map.with_index
,以便结果是迭代产生的结果数组。
此处似乎scores
应该是score
,并且与此类似,因为tally_scores
会返回一个分数:
scores = tally_scores(lines.count("X"),"X",index)
如果你正在使用map.with_index
,那么该块的返回值应为score
,这样结果将是一个得分数组。但是,您无法使用块中的return score
,它将从父方法返回,而不是块的单次迭代。您可以使用next score
代替score
作为最后一行。
进行这些更改后,您可以说scores = iterate_lines
。
它看起来像这样:
def iterate_lines
WIN_COMBINATIONS.map.with_index do |line, index|
# set score according to your conditional logic
score # or alternatively, "next score"
end
end
最好将打印逻辑提取到其他地方,例如:
scores = iterate_lines
scores.each { |score| p score }