[在石头剪刀布游戏中,每个玩家都选择玩Rock(R),Paper(P)或Scissors(S)。规则是:剪刀使岩石破裂,剪刀使Paper割裂,但是Paper覆盖了Rock。在一轮剪刀石头布中,每个球员的名字和策略被编码为两个元素的数组。用一个类方法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