我正在尝试实现一个带整数n的函数,并在玩家1和玩家2之间模拟n轮Rock,Paper,Scissors。赢得最多回合的玩家赢得n轮游戏,可能有关系。该功能应该如图所示打印游戏结果。
>>> simul(1)
Player 1
>>> simul(1)
Tie
>>>simul(100)
Player 2
我想我需要以模块化的方式解决这个问题。换句话说,我需要结合至少2个函数,我的问题是我似乎无法弄清楚如何做到这一点。如何在调用simul()
函数时激活嵌入式函数的结果?
所以我创建了一个函数,通过执行函数rps(p1, p2)
来模拟游戏Rock,Paper,Scissors。代码如下:
def rps(p1,p2):
#tie
if (p1==p2):
return 0
# player 1 wins
elif p1+p2 in ['PR','RS','SP']:
return -1
else:
return 1
# player 2 wins
这是我有点卡住的地方。我需要在执行simul()
功能时激活此功能 - 我该怎么做?到目前为止我所拥有的是:
def rps(p1,p2):
#tie
if (p1==p2):
return 0
# player 1 wins
elif p1+p2 in ['PR','RS','SP']:
return -1
else:
return 1
# player 2 wins
def choose_rps():
import random
random.choice('RPS')
def simul(n):
p1_wins, p2_wins = 0, 0
for i in range(n):
p1 = choose_rps()
p2 = choose_rps()
result = rps(p1, p2)
if result == -1:
p1_wins += 1
elif result == 1:
p2_wins += 1
if p1_wins > p2_wins:
return 'Player 1'
elif p1_wins == p2_wins:
return 'Tie'
else:
return 'Player 2'
答案 0 :(得分:5)
要“激活”某个功能,只需调用它即可。例如:
def simul(n):
score = 0
for i in range(n):
p1 = choose_rps()
p2 = choose_rps()
result = rps(p1, p2)
score += result
if score < 0:
print('Player 1')
elif score == 0:
print('Tie')
else:
print('Player 2')
当然,您需要编写choose_rps
函数(randomly chooses并返回R
,P
或S
之一) - 但是,你可以看到,你只需要像rps
函数一样调用它。
将所有内容整合到一个脚本中:
def rps(p1, p2):
# ... your code here
def choose_rps():
# implement this here
def simul(n):
# code from above
然后你可能想要一些东西来驱动它,比如:
if __name__ == '__main__':
import sys
n = int(sys.argv[1]) if len(sys.argv) > 1 else 5
simul(n)
......或......
while True:
n = int(input('How many trials?')) # raw_input for Python 2.x
simul(n)
如果您愿意,可以进一步简化。例如,您可以将整个循环转换为带有生成器表达式的sum
调用:
def simul(n):
score = sum(rps(choose_rps(), choose_rps()) for _ in range(n))
答案 1 :(得分:0)
这是一个没有RPS叙述的等效函数:
import random
def simul(n):
score = sum([random.choice([-1, 0, 1]) for i in xrange(n)])
winner_idx = 0 if score > 0 \
else 1 if score < 0 \
else 2
print ['Player 1', 'Player 2', 'Tie'][winner_idx]
这是一个跟随故事并扩展到Rock,Paper,Scissors,Lizard,Spock的人:
import random
def rand_RPSLK():
while True:
yield random.choice('PSKLR')
def simul(n):
p1 = rand_RPSLK()
p2 = rand_RPSLK()
choice = lambda px: 'PSKLR'.index(next(px))
score = sum([[0,1,-1,1,-1][choice(p1)-choice(p2)] for i in xrange(n)])
winner_idx = 0 if score > 0 \
else 1 if score < 0 \
else 2
print ['Player 1', 'Player 2', 'Tie'][winner_idx]