硬币折腾得分为零

时间:2015-01-05 20:10:05

标签: python

绝对的初学者在这里,尝试做一个简单的投掷游戏来练习我读过的前几章。我试图在比赛中添加一个得分板,但得分始终保持在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)

3 个答案:

答案 0 :(得分:1)

您的问题是变量在函数外部的“模块范围”声明,然后您尝试从函数内部修改它们。

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

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

Use of "global" keyword in Python

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

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

state = GameState()

# later, in code:

state.wins += 1  # for a win

全局变量使程序变得混乱而难以弄清楚。您可以通过将它们放在一个类中来改进程序。您可以通过使连接显式来更好地改进程序:向函数添加参数,在这些函数中传入要修改的函数的类实例,而不是在模块级别有一个实例。

其他答案建议只将变量移至main()。这也是一种有效的方法,特别是对于像这样的小而简单的程序。我喜欢将所有变量打包成一个类来自我对小程序随着时间的推移逐渐成长为大型程序的经验。如果将相关内容保持在一起,则可以更轻松地扩展程序。但对于这个程序,只需将变量放入main()即可。

答案 1 :(得分:0)

你的猜测,一方,胜利,损失"变量是全局变量,所以你不应该将它们传递给" 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()

答案 2 :(得分: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']

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()