【问题标题】:Rock Paper Scissors剪刀石头布
【发布时间】:2013-02-15 09:31:17
【问题描述】:

我对我的 comp sci 课程进行了测试,其中一个问题是制作一个剪刀石头布游戏,如果玩家 1 赢了它会返回 -1,如果玩家 2 赢了它会返回 1,如果是平局它会返回 0。我编写了我的程序并运行它,它可以工作,但根据我的教授的说法,他说它没有。

def rps(x,y):
    player1 = -1
    player2 = 1
    tie = 0
    'R'>'S'
    'P'>'R'
    'S'>'P'
    if x>y:
        return player1
    if x<y:
        return player2
    else:
        return tie

我看不出有什么问题?如果您执行 rps('R','P') 那么它将返回 -1,因为 x = player1 并且因为 Rock 击败了 Paper。谁能帮我看看我的代码有没有错?

【问题讨论】:

  • 行 'R'>'S', 'P'>'R', 'S'>'P' 没有任何作用。
  • 您是否已经学会了字典是什么?
  • 你说“它有效”,但显然它没有用。程序在没有语法错误的情况下运行是不够的。使用测试用例并检查结果。
  • 如果你运行rps('R','S'),你会得到1,因为摇滚胜过纸。同样,rps('R','P') 给出-1,因为纸比石头好。但是如果你运行rps('S','P'),你应该得到1,因为剪刀比纸好,但你没有——你得到-1,这是错误的。
  • @ChrisTaylor 您应该回答这个问题,因为您实际上回答了所提出的问题,这与发布的答案不同,这些答案提供的代码(值得称赞)OP 实际上并没有要求。

标签: python


【解决方案1】:

您可以执行以下操作:

def rps(p1,p2):
    retval= {
        'R':{'R': 0, 'S':-1, 'P': 1},
        'S':{'R': 1, 'S': 0, 'P':-1},
        'P':{'R':-1, 'S': 1, 'P': 0}
    }
    return retval[p1][p2]

【讨论】:

    【解决方案2】:

    你问:

    谁能帮我看看我的代码有没有错?

    是的,这是错误的。原因如下。

    如果你运行rps('R','S'),你应该得到1,因为摇滚胜过纸。同样rps('R','P') 应该给-1,因为纸比石头好。这两种方法都适用于您的代码。

    但是,如果你运行rps('S','P'),你应该得到1,因为剪刀比纸好,但你没有——你的代码返回-1,这是错误的。

    正如eumiro 在 cmets 中指出的那样,三行

    'R'>'S'
    'P'>'R'
    'S'>'P'
    

    我假设您认为它正在定义要使用的顺序,实际上不要做任何事情。

    【讨论】:

      【解决方案3】:

      您的代码中存在一些问题:

      1。 以下几行不做任何事情。你不能设置字符R大于字符S

      'R' > 'S'
      'P' > 'R'
      'S' > 'P'
      

      2。 第 1 节的原因,您的 if x&gt;y: 没有按照您的想法执行。它只是检查x 的内容是否在字母表中y 的内容之前。 (假设xy的内容是字符)


      你的代码很难修复,我建议你从一个非常不同的角度来解决这个问题。

      这是一个与您的完全不同的解决方案,但这个解决方案有效。它只是使用许多 if 检查来获得您的结果。

      def rps(p1, p2):
          if p1 == p2:
              return 0
          elif (p1 == "R" and p2 == "S")\
          or (p1 == "S" and p2 == "P")\
          or (p1 == "P" and p2 == "R"):
              return -1
          else:
              return 1
      

      我将x, y 替换为p1, p2,因为它们更能代表玩家的选择,但如果您必须使用xy,只需将它们改回即可。

      【讨论】:

        【解决方案4】:
        def rps(x,y):
            return [0, -1, 1]['RPS'.index(x) - 'RPS'.index(y)]
        

        或者如果您想要一个交互式程序:

        from random import randint
        ['Tie', 'I win', 'You win'][randint(0, 2) - 'RPS'.index(raw_input("Enter R, P, or S: "))]
        

        【讨论】:

          【解决方案5】:
          def rps(x,y):
              d = {'R': 1, 'S': 2, 'P': 3}
              return ((d[x] - d[y]) + 1) % 3 - 1
          
          
          for p1 in 'RPS':
              for p2 in 'RPS':
                  print p1, p2, rps(p1, p2)
          

          打印

          R R 0
          R P 1
          R S -1
          P R -1
          P P 0
          P S 1
          S R 1
          S P -1
          S S 0
          

          【讨论】:

            猜你喜欢
            • 2021-01-10
            • 2018-04-06
            • 1970-01-01
            • 1970-01-01
            • 2017-02-10
            • 2016-01-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多