剪刀纸-家庭作业

问题描述 投票:0回答:2

[在石头剪刀布游戏中,每个玩家都选择玩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'])
ruby arrays hash
2个回答
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,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
© www.soinside.com 2019 - 2024. All rights reserved.