【问题标题】:Iterate through array by index in Ruby在Ruby中按索引遍历数组
【发布时间】:2016-09-25 14:21:00
【问题描述】:

我想按索引遍历一个 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

【问题讨论】:

  • 更改为 players_array.each_with_index do |player, idx|,其中 idx 将是索引
  • @Santhosh 你的意思是players_array.each_with_index...
  • 是的,这是一个错字。我的错。谢谢
  • 为什么每次迭代都创建一个player 的新实例?
  • 我认为你会从 psuedocoing 中受益。你把事情复杂化了。

标签: arrays ruby indexing iterator


【解决方案1】:

这里尝试使用一些 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 将返回第一个元素 -这有效地将玩家的回合设置为循环。

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

  4. 接下来是 begin ... until 循环,它将为每个玩家一个一个掷骰子,并且循环将在任何玩家得分超过 20 时中断。为了跟踪获胜者,最后一个掷骰子的用户以巧妙的方式将rolled 捕获在变量winner 中。

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

【讨论】:

    【解决方案2】:

    您的问题是,在第一次玩家迭代中,until 表达式会迭代直到得分达到 20。它永远不会到达任何其他玩家。

    我建议删除until 表达式,使用loop 用无限循环围绕玩家循环,然后当玩家达到20 时breakbreak 可能只从内部循环中断,所以最好是写一个方法来完成这一切,然后从方法中return,而不是breaking。

    更准确地说,我建议编写一个将玩家数组(可能还有 20 阈值)作为输入的方法,并返回您需要的任何信息(可能是获胜玩家对象和最终得分)作为其返回表达式。

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

    winning_player, winning_score = play_round(players, 20)
    

    【讨论】:

    • 好吧,还是不太明白。查看已编辑的代码,看看您是否可以再次提供帮助。谢谢
    • 使用loop do...end 比使用while...end 更好。 loop do...end 应该在players.each... 之外 另外,请修正缩进。另外,break 可能不起作用,你可能需要把它放在一个方法中并返回。
    猜你喜欢
    • 2016-08-20
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2010-09-13
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多