1

我正在尝试实现一个函数,该函数采用整数 n 并在玩家 1 和玩家 2 之间模拟 n 轮石头、纸、剪刀。赢得最多回合的玩家将赢得 n 轮游戏,可能有平局。该函数应打印游戏结果,如图所示。

    >>> simul(1)
    Player 1
    >>> simul(1)
    Tie
    >>>simul(100)
    Player 2

我认为我需要以模块化的方式来解决这个问题。换句话说,我需要结合至少 2 个功能,我的问题是我似乎无法弄清楚如何做到这一点。调用函数时如何激活嵌入函数的结果simul()

所以我创建了一个函数,通过执行函数来模拟游戏 Rock, Paper, Scissors rps(p1, p2)。代码如下:

    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'
4

2 回答 2

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函数(它随机选择并返回 、 或 之一RP——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)

……或者……</p>

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))
于 2013-05-21T20:12:38.877 回答
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]

这是一个跟随故事并扩展到摇滚,纸,剪刀,蜥蜴,史波克的故事:

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]
于 2013-05-21T21:11:33.507 回答