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。有了索引
是可能的。