在一个摇滚剪刀游戏中,每个玩家选择玩Rock(R),Paper(P)或Scissors(S)。规则是:摇滚剪刀,剪刀剪纸,但纸覆盖摇滚。在一轮摇滚剪刀中,每个玩家的名字和策略都被编码为两个元素的数组。使用类方法获胜者创建一个RockPaperScissors
类,该方法获取上述两个2元素数组,并返回表示获胜者的数组:
RockPaperScissors.winner(['Armando','P'], ['Dave','S']) # => ['Dave','S']
如果任一玩家的策略不是“R”,“P”或“S”(大小写敏感),该方法应引发“RockPaperScissors::NoSuchStrategyError
”异常并提供消息:“策略必须是R,P,S之一“
如果两位玩家都采用相同的策略,那么第一位玩家就是赢家。
我的代码如下。我的代码没有在行
中正确比较两个字符串(@p1[1,1]==rules["#{p}"]?@p1:@p2).
请帮帮我。
class RockPaperScissors
def winner(p1,p2)
@p1 = p1
@p2 = p2
p = (@p1[1,1]+@p2[1,1]).sort
rules = Hash.new(0)
rules = {"PR"=>"R","PS"=>"S", "RS"=>"R", "PP"=>"1","RR"=>"1","SS"=>"1"}
if rules["#{p}"].nil?
raise RockPaperScissors::NoSuchStrategyError,"Strategy must be one of R,P,S"
elseif rules["#{p}"]=="1"
return @p1
else
print @p1[1,1]
print rules["#{p}"]
@p1[1,1]==rules["#{p}"]?@p1:@p2
end
end
end
t = RockPaperScissors.new
print t.winner(['Armando','R'], ['Dave','S'])
答案 0 :(得分:1)
一些常规提示:您不需要[1,1]
,[1]
或.last
会更好。也无需将rules
初始化为新哈希,您只能保留行rules = {"PR"=>"R"...
。 puts
比print
更常用。你有点过分思考了这一点。也许清理你的代码,尝试使用上面发布的提示简化它,看看这是否会让你失败。
完成后,看一下惯用的Ruby解决方案的外观,但不要将其作为您的解决方案提交:
module RockPaperScissors
VALID_STRATEGIES = %i(R P S)
RULES = { R: :S, P: :R, S: :P }
def self.winner(p1, p2)
choice1, choice2 = p1.last.intern, p2.last.intern
unless [choice1, choice2].all? { |s| VALID_STRATEGIES.include? s }
raise RockPaperScissors::NoSuchStrategyError, "Strategy must be one of R,P,S"
end
return p1 if choice1 == choice2
RULES[choice1] == choice2 ? p1 : p2
end
end
答案 1 :(得分:1)
在数组上使用[1,1]
时,从索引1
开始,您会收到一个大小为1
的数组:
[1,2,3][1,1]
# => [2]
[1,2,3][1]
# => 2
因此,当您将其与规则进行比较时,您永远不会获得true
,因为没有规则是数组......
["S"] == "S"
# => false
所以要修复代码,而不是
p = (@p1[1,1]+@p2[1,1]).sort
# ...
(@p1[1,1]==rules["#{p}"]?@p1:@p2)
你应该尝试:
p = (@p1[1]+@p2[1]).sort
# ...
(@p1[1]==rules[p]?@p1:@p2