岩石纸剪 - 家庭作业

时间:2014-05-20 16:34:49

标签: ruby arrays hash

在一个摇滚剪刀游戏中,每个玩家选择玩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'])

2 个答案:

答案 0 :(得分:1)

一些常规提示:您不需要[1,1][1].last会更好。也无需将rules初始化为新哈希,您只能保留行rules = {"PR"=>"R"...putsprint更常用。你有点过分思考了这一点。也许清理你的代码,尝试使用上面发布的提示简化它,看看这是否会让你失败。

完成后,看一下惯用的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