我正在处理我的第二个Ruby程序,但遇到了困难,这是我和完成程序之间的最后一道坎儿。我的任务是编写一个石头、剪刀、布游戏方法,返回获胜的玩家。为此,它需要以[["Dave","S"],["Dan","R"]]的格式作为游戏参数,其中"S"和"R"分别代表"剪刀"和"石头"。然后,它将确定获胜者并返回包含获胜策略的数组。如果游戏长度不正确或策略超出范围,则还会引发错误。
class WrongNumberOfPlayersError < StandardError ; end
class NoSuchStrategyError < StandardError ; end
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
#Hash of whose Keys are the strategies and values are the players
playr = {(game[0].slice(1).downcase) => game[0],
(game[1].slice(1).downcase) => game[1]} #This fits on the above line in IRB
#Collect Strategies in array for comparison
stgys = playr.keys
#raise NoSuchStrategyError unless players give strategies in range, no duplicates
raise NoSuchStrategyError unless (stgys.select { |s| s.match /[prs]/ }.size == 2)
#determine Winner
case stgys.to_s
when /p/ && /r/
playr["p"]
when /p/ && /s/
playr["s"]
when /s/ && /r/
playr["r"]
end
end
这个功能符合我的期望,对策略进行正则表达式匹配并返回胜者。除了最后一种情况,当遇到时总是返回nil。如果在其他情况下调用player [“r”],它将成功,并在“/ p / && / r /”中返回正确的玩家。如果我改变顺序,它仍然不起作用,所以我知道它与位置无关。如果我在case语句之外进行单独的匹配调用,正则表达式/ r /会在应该的时候计算。因此,我相信我已经把问题缩小到/s/和/r/之间的某些关系,但我还是束手无策。此外,任何关于DRYness的帮助都将不胜感激,谢谢您的帮助!