Ruby 如何让我的方法返回它';将结果值转换为第三种方法
我不确定主题标题是否足够具体,但现在开始。我有两种方法——一种是迭代一些数组和块中的条件,以输出正确的数据 这是密码Ruby 如何让我的方法返回它';将结果值转换为第三种方法,ruby,Ruby,我不确定主题标题是否足够具体,但现在开始。我有两种方法——一种是迭代一些数组和块中的条件,以输出正确的数据 这是密码 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
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”中打印出正确的值,或者如我在这里所示,通过将变量“scores”设置为“iterate_lines”中的调用,这样我就可以从“iterate_lines”中打印出它们
自然,“迭代行”的返回值就是数组(WIN\u组合)。硬编码返回分数
显然只会给我最后一个值
我的问题是,我有第三种方法需要从“理货分数”中得到什么,但我无法将其作为常规参数传递,也就是我的方法(分数)。原因是第三个方法有它自己的参数列表,它因为其他原因而被传递。另外,在调用该方法之前,它将是nil
def get_scores
# other code
#: something like this:
score = iterate_lines
# or
score = tally_scores
# or
# ?
end
所以我觉得也许我把自己逼到了一个角落,应该扔掉所有的东西,重新开始。我会说我尝试了“tally_分数”,并将分数放入实例变量数组中。但当我通过它时,我发现除了最后一个值之外,所有的值都保留了下来 这里有几个问题。首先,正如您所看到的,当您使用带有索引的
每个\u时,除非使用副作用,否则该块中发生的任何事情都不会对外部产生影响。如果在该块中设置了一个变量,则每次迭代都会重置该变量
您可以将其更改为map.with_index
,以便结果是迭代生成的结果数组
另外,似乎scores
应该是scores
,在这里和类似的行中,因为tally\u scores
返回一个分数:
scores = tally_scores(lines.count("X"),"X",index)
如果使用的是map.with_index
,则块的返回值应为score
,这样结果将是一个分数数组。但是,不能使用块中的返回分数
,它将从父方法而不是块的单个迭代返回。您可以使用next score
代替,也可以简单地使用score
作为最后一行
进行这些更改后,您可以说scores=iterate\u line
它看起来像这样:
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 }
当你有这样的东西时,使用显式的返回从来都没有坏处。当然,我尝试过显式返回,但没有任何效果。我的意思是,它为我做的只是得到一个值。这是tic-tac-toe吗?如果是这样的话,我想不出你在做什么,部分原因是缺少一些代码(WIN\u组合
和@board
)。一些观察结果:1)未使用块变量索引
;2) 你可以使用散列法而不是塔利分数法
你可以使用散列法
{[1,“X”]=>1[1,“O”]=>1[2,“X”]=>10[2,“O”]=>10[3,“X”]=>100[3,“X”]=>100};3) 也许最好从计算“X”
和“O”
的行、列和对角线开始,4)如果是ttt,计算分数似乎是一种奇怪的方法。是的,这是ttt,适用于任何零和游戏。所以,我不想发表这篇关于ttt的文章,这也是我没有发布其他代码的主要原因。WIN_组合
是线“[[0,1,2],[3,4,5],…[2,4,6]],
@board`是保存标记的数组。我不确定这是一个奇怪的方法,虽然,我发现了一些2人游戏使用启发式和极大极小实现的组合。这只是我的尝试。@Cary Swoveland我还想说的是分数和索引将进入哈希,但是哈希不会在minimax函数之前创建。非常好!我有一种感觉,地图会很有用,但我不知道map。有了索引是可能的。