python 模拟石头剪刀布

1 投票
2 回答
1084 浏览
提问于 2025-04-18 07:10

我想写一个叫做simul()的函数,这个函数接收一个整数,然后模拟玩家1和玩家2之间进行n轮石头剪刀布的游戏。赢得最多轮次的玩家就是这n轮游戏的胜者,当然也可能出现平局。

举个例子:

simul(1) 玩家1获胜

simul(1) 平局

simul(100) 玩家2获胜

我写了:

def rps():   
 lst['R', 'P', 'S']
 p1=random.choice(lst)
 p2=random.choice(lst)
 if p1+p2=='RS' or p1+p2=='PR' or p1+p2=='SP':
      return '-1'
 elif p1+p2=='RP' or p1+p2=='PS' or p1+p2=='SR':
      return '1'
 else:
      return '0'

def simul(n):
 total=0
 for i in range(n):
      if rps()==-1:
           total+=-1
      elif rps()==1:
           total+=1
      else:
           total+=0
 if total<0:
      print('Player1')
 elif total==0:
      print('Tie')
 else:
      print('Player2')

但是当我运行simul()这个代码时,得到的结果总是'平局'。我该怎么解决这个问题呢?

2 个回答

2

你有两个问题。第一个问题是你返回的是字符串:

if p1+p2=='RS' or p1+p2=='PR' or p1+p2=='SP':
    return '-1'
elif p1+p2=='RP' or p1+p2=='PS' or p1+p2=='SR':
    return '1'
else:
    return '0'

但是你却用整数来比较结果:

if rps()==-1:
    total+=-1
elif rps()==1:
    total+=1
else:
    total+=0

整数和它的文本表示(也就是字符串)是不能直接相等的。你应该从 rps 返回整数,而不是字符串。

第二个问题是在 simul 中,如果没有走 rps()==-1 这个分支,你会为第二次检查模拟另一轮游戏:

if rps()==-1:
    total+=-1
elif rps()==1:
    total+=1

每次循环只模拟一轮,并在两个检查中使用这一轮的结果:

for i in range(n):
    result = rps()
    if result == -1:
        total += -1
    elif result == 1:
        total += 1
    else:
        total += 0
2

在函数 rps() 中,你返回的是字符串,但是在函数 simul() 中,你却把 rps() 的结果和整数进行比较。

因为你使用了 -1, 0 和 1 这些数字,所以你应该返回整数,而不是字符串。

def rps():   
    lst['R', 'P', 'S']
    p1=random.choice(lst)
    p2=random.choice(lst)
    if p1+p2 == 'RS' or p1+p2 == 'PR' or p1+p2 == 'SP':
        return -1
    elif p1+p2 == 'RP' or p1+p2 == 'PS' or p1+p2 == 'SR':
        return 1
    else:
        return 0

注意:在Python中,使用 '单引号'"双引号""""三重引号""" 来表示字符串。

撰写回答