在石头-布-剪刀的游戏中,每个玩家选择玩石头(R)、布(P)或剪刀(S)。规则是:石头打破剪刀,剪刀剪纸,但纸覆盖岩石。在一轮石头-布-剪刀游戏中,每个玩家的名字和策略都被编码为两个元素的数组。使用类方法winner创建一个RockPaperScissors
类,该类接受两个类似于上面的两个元素数组,并返回表示获胜者的数组:
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'])
发布于 2014-05-21 01:14:53
一些一般的提示:你不需要[1,1]
,[1]
或者.last
会更好。也不需要将rules
初始化为一个新的哈希值,您只能保留行rules = {"PR"=>"R"...
。与print
相比,puts
更常用。你有点想多了。也许可以清理你的代码,试着用上面发布的技巧来简化它,看看这是否能让你解脱。
一旦你完成了,看看一个惯用的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
发布于 2014-05-21 02:34:53
在数组上使用[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
https://stackoverflow.com/questions/23765382
复制相似问题