抛硬币得分停留在零

Coin toss score stuck at zero

绝对初学者,尝试制作一个简单的掷硬币游戏来练习我读过的前几章。我试图在游戏中添加一个记分板,但分数一直停留在 0 到 0。还有任何其他提示也将不胜感激。我不认识任何编程的人,所以我可以使用建议。

  """This will be an attempt to create a simple 
coin toss game in which the player chooses heads or
tails and a random generator will pick one from a list
of either heads or tails and return whether or not 
the player chose correctly. I also hope to
create a scoreboard"""

from random import randint

coin = ['heads' , 'tails']
side = coin[0]
guess = 'heads'
token = int(raw_input('how many games?'))
wins = 0
losses = 0


def getinfo(token):
    guess = raw_input('Heads or Tails?')

def flipcoin(guess, side, wins, losses):
    side = coin[randint(0,1)]
    print 'You Chose: %s' %(guess)
    print 'Coin Is: %s' %(side)
    if guess == side:
        print 'you win'
        wins = wins + 1
    else:
        print 'you lose'
        losses = losses + 1

def main(token):
    while token > 0:
        getinfo(token)
        flipcoin(guess, side, wins, losses)
        if wins > losses:
            print "You are winning %s to %d" %(wins , losses)
        elif wins == losses:
            print "You are tied %s to %d" %(wins , losses)
        else:
            print "You are losing %s to %d" %(losses, wins)
        token -= 1
        print '%d games left' %(token)
        print 'wins: %s' %(wins)
        print 'losses: %s' %(losses)

main(token)

您的 "guess, side, wins, losses" 变量是全局变量,因此您不应将它们传递给 "flipcoin" 函数。这样做会创建具有相同名称的新局部变量,并且永远不会更新全局变量。

如果您更改这些行,它似乎有效:

def flipcoin():
    global wins, losses
    side = coin[randint(0,1)]
    print 'You Chose: %s' %(guess)
    print 'Coin Is: %s' %(side)
    if guess == side:
        print 'you win'
        wins = wins + 1
    else:
        print 'you lose'
        losses = losses + 1

def main(token):
    while token > 0:
        getinfo(token)
        flipcoin()

您的问题是变量在 "module scope" 处在函数外部声明,然后您尝试从函数内部修改它们。

函数正在创建自己的局部变量,而不是修改模块范围的变量。

解决该问题的一种方法是为变量添加 global 声明。

Use of "global" keyword in Python

另一种可能更好的方法是将变量放在 class 中,如下所示:

class GameState(object):
    def __init__(self):
        self.wins = 0
        self.losses = 0

state = GameState()

# later, in code:

state.wins += 1  # for a win

全局变量使程序变得混乱且难以理解。您可以通过将它们放在一起 class 来改进程序。您可以通过显式连接来进一步改进程序:将参数添加到您传入 class 实例以供函数修改的函数,而不是在模块级别拥有一个实例。

其他答案建议将变量移至 main()。这也是一种有效的方法,尤其是对于像这样的小而简单的程序。我偏爱将所有变量打包到一个 class 中,这源于我的小程序随着时间的推移成长为大程序的经验。如果将相关的东西放在一起,则可以更轻松地扩展程序。但是对于这个程序,只要将变量放入main()就可以了。

如前所述,您应该在函数中返回。限制全局变量的使用。

"""This will be an attempt to create a simple 
coin toss game in which the player chooses heads or
tails and a random generator will pick one from a list
of either heads or tails and return whether or not 
the player chose correctly. I also hope to
create a scoreboard"""

from random import randint

coin = ['heads' , 'tails']

def getinfo(token):
    return raw_input('Heads or Tails?')

def flipcoin(guess, side, wins, losses):
    side = coin[randint(0,1)]
    print 'You Chose: %s' %(guess)
    print 'Coin Is: %s' %(side)
    if guess == side:
        print 'you win'
        wins = wins + 1
    else:
        print 'you lose'
        losses = losses + 1
    return side, wins, losses

def main():
    token = int(raw_input('how many games?'))
    wins = 0
    losses = 0
    side = coin[0]
    guess = 'heads'

    while token > 0:
        guess = getinfo(token)
        side, wins, losses = flipcoin(guess, side, wins, losses)
        if wins > losses:
            print "You are winning %s to %d" %(wins , losses)
        elif wins == losses:
            print "You are tied %s to %d" %(wins , losses)
        else:
            print "You are losing %s to %d" %(losses, wins)
        token -= 1
        print '%d games left' %(token)
        print 'wins: %s' %(wins)
        print 'losses: %s' %(losses)

if __name__ == '__main__':
    main()