我想通过索引遍历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
答案 0 :(得分:1)
你的问题是,在第一个玩家迭代中,until
表达式会一直迭代,直到得分达到20.它永远不会被任何其他玩家所接受。
我建议删除until
表达式,使用loop
使用无限循环围绕玩家循环,然后在玩家达到20时使用break
。break
可能会从只有内循环,所以最好是编写一个完成所有这些操作的方法,然后从方法中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
<强>解释强>
players
是一个包含播放器列表的数组。
players.cycle
是一个枚举器,调用next
将从数组中获取下一个元素,并在返回数组的最后一个元素之后,下一次调用next
将返回第一个元素 - 这有效地设置了一个玩家&#39;转为循环。
scores
是一个哈希,通过使用播放器的ID作为键来跟踪所有骰子滚动。它的设置方式是,当第一次访问不存在的键时,它被初始化为一个空数组([]
)作为其值。
接下来是begin ... until
循环,它将逐个为每个玩家掷骰子,循环将打破任何玩家得分超过20的时刻。要跟踪获胜者,最后一个用户滚动的骰子以变量winner
以聪明的方式捕获。
通过从包含数字1到6的数组中取样来模拟掷骰子。