石头剪刀布——家庭作业



在石头-剪子-布游戏中,每个玩家选择玩石头(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"...行。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,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

最新更新