在石头-剪子-布游戏中,每个玩家选择玩石头(R),布(p)或剪刀(S)。规则是:石头打破剪刀,剪刀剪布,但布盖石头。在一轮石头剪刀布游戏中,每个玩家的名字和策略都被编码成一个包含两个元素的数组。创建一个具有类方法winner的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'])
一般提示:您不需要[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,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