首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >岩石剪刀-家庭作业

岩石剪刀-家庭作业
EN

Stack Overflow用户
提问于 2014-05-21 00:34:49
回答 2查看 1.7K关注 0票数 0

在石头-布-剪刀的游戏中,每个玩家选择玩石头(R)、布(P)或剪刀(S)。规则是:石头打破剪刀,剪刀剪纸,但纸覆盖岩石。在一轮石头-布-剪刀游戏中,每个玩家的名字和策略都被编码为两个元素的数组。使用类方法winner创建一个RockPaperScissors类,该类接受两个类似于上面的两个元素数组,并返回表示获胜者的数组:

代码语言:javascript
运行
复制
RockPaperScissors.winner(['Armando','P'], ['Dave','S'])  # => ['Dave','S']

如果任一玩家的策略不是" R“、" P”或"S“(区分大小写),则该方法应引发”RockPaperScissors::NoSuchStrategyError“异常并提供消息:”策略必须是R、P、S之一“

如果两个玩家使用相同的策略,那么第一个玩家就是赢家。

下面是我的代码。我的代码没有正确比较行中的两个字符串

代码语言:javascript
运行
复制
(@p1[1,1]==rules["#{p}"]?@p1:@p2).

请帮帮我。

代码语言:javascript
运行
复制
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'])
EN

回答 2

Stack Overflow用户

发布于 2014-05-21 01:14:53

一些一般的提示:你不需要[1,1][1]或者.last会更好。也不需要将rules初始化为一个新的哈希值,您只能保留行rules = {"PR"=>"R"...。与print相比,puts更常用。你有点想多了。也许可以清理你的代码,试着用上面发布的技巧来简化它,看看这是否能让你解脱。

一旦你完成了,看看一个惯用的Ruby解决方案是什么样子的,但不要把它作为你的解决方案提交:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-05-21 02:34:53

在数组上使用[1,1]时,将收到一个从索引1开始的大小为1的数组

代码语言:javascript
运行
复制
[1,2,3][1,1]
# => [2]
[1,2,3][1]
# => 2

因此,当您将其与规则进行比较时,您永远不会得到true,因为没有规则是一个数组……

代码语言:javascript
运行
复制
["S"] == "S"
# => false

所以要修复你的代码,而不是

代码语言:javascript
运行
复制
p = (@p1[1,1]+@p2[1,1]).sort
# ...
(@p1[1,1]==rules["#{p}"]?@p1:@p2)

您应该尝试:

代码语言:javascript
运行
复制
p = (@p1[1]+@p2[1]).sort
# ...
(@p1[1]==rules[p]?@p1:@p2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23765382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档