我正在研究我的第二个ruby程序,并且在字面上坚持站在我和完成的程序之间的最后一件事。我的任务是写一个岩石,纸,剪刀法,返回胜出的球员。要做到这一点,需要[[“Dave”,“S”],[“Dan”,“R”]]形式的游戏参数,其中“S”和“R”是“剪刀”和“摇滚”分别。然后确定赢家并返回包含获胜策略的数组。如果游戏长度错误或策略为==或不在范围内,也会引发错误。Ruby正则表达式与正则表达式匹配
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
这可以像我期望的那样工作,检查策略对正则表达式并返回胜者。除最后一种情况外,遇到时总是返回零。如果我把播放器[“R”]下要么成功,其他whens的,它在“/ P/& &/R /”返回正确的球员。如果我改变顺序,它仍然不起作用,所以我知道它不需要处理它的位置。如果我在case语句之外单独进行匹配调用,则正则表达式/ r /会评估它的应用。所以我相信我已经缩小了与/ s /和/ r /相关的问题,否则我就难倒了。还有任何帮助DRYness赞赏,谢谢你的帮助!
似乎是来自saas课程的作业:) – 2012-03-20 20:32:18
你知道吗,迟到开始希望能够赶上,但是在对这个代码打了几个小时的代码之后,我意识到阿曼多可能并不是在开玩笑说它是一个老年人级别课程:) – 2012-03-21 01:32:00