在Ruby中通过索引迭代数组

时间:2016-05-27 09:45:04

标签: arrays ruby indexing iterator

我想通过索引遍历Ruby数组。我有一个游戏,我希望玩家可以单独掷骰子,直到一个骰子到达20,每一回合都会增加他们的分数。到目前为止,它将为玩家1完成所有转弯,直到他们达到20,然后玩家2直到他们到达20

 players_array.each do |player|
        player = Person.new(player)
        until player.players_score.inject(0, :+) >= 20 do
          score = player.dice_roll
          player.add_to_score(score)
          print player.players_score
          print "\n"
          print player, + player.players_score.inject(0, :+).to_s
          print "\n"
      end
    end

我理解可能是each_with_index 任何想法?

感谢

新代码:

players_array.each do |player|
  while TRUE
    player = Person.new(player)
    score = player.dice_roll
    player.add_to_score(score)
    if player.players_score.inject(0, :+) > 20
      # puts player.players_score
      puts '20 hit'
      break
    else
      next
    end
  end
end

2 个答案:

答案 0 :(得分:1)

你的问题是,在第一个玩家迭代中,until表达式会一直迭代,直到得分达到20.它永远不会被任何其他玩家所接受。

我建议删除until表达式,使用loop使用无限循环围绕玩家循环,然后在玩家达到20时使用breakbreak可能会从只有内循环,所以最好是编写一个完成所有这些操作的方法,然后从方法中return而不是break

更确切地说,我建议编写一种方法,将玩家阵列(可能是20门槛)作为输入,并返回您需要的任何信息(可能赢得玩家对象和最终得分)作为其返回表达

您可以将Ruby中的多个表达式作为数组返回,例如['Juan De La Cruz', 22],然后解构,就像这样:

winning_player, winning_score = play_round(players, 20)

答案 1 :(得分:0)

这是尝试使用一些Ruby习语来做同样的事情。

players = ["P1", "P2"].cycle

scores = Hash.new {|hash, k| hash[k] = []}

begin
  scores[winner = players.next] << (1..6).to_a.sample 
end until scores.any? {|_,v| v.reduce(:+) >= 20}

p winner # Prints winning player's id

<强>解释

  1. players是一个包含播放器列表的数组。

  2. players.cycle是一个枚举器,调用next将从数组中获取下一个元素,并在返回数组的最后一个元素之后,下一次调用next将返回第一个元素 - 这有效地设置了一个玩家&#39;转为循环。

  3. scores是一个哈希,通过使用播放器的ID作为键来跟踪所有骰子滚动。它的设置方式是,当第一次访问不存在的键时,它被初始化为一个空数组([])作为其值。

  4. 接下来是begin ... until循环,它将逐个为每个玩家掷骰子,循环将打破任何玩家得分超过20的时刻。要跟踪获胜者,最后一个用户滚动的骰子以变量winner以聪明的方式捕获。

  5. 通过从包含数字1到6的数组中取样来模拟掷骰子。