【问题标题】:python guessing game excersise蟒蛇猜谜游戏练习
【发布时间】:2017-02-19 16:05:04
【问题描述】:

我目前正在 learnpython.org 上做一个 python excersise: 我在粗体的额外练习中遇到了麻烦:

生成一个介于 1 和 9(包括 1 和 9)之间的随机数。让用户猜数字,然后告诉他们猜的太低、太高还是完全正确。 (提示:记得使用第一个练习中的用户输入课程)

附加:

让游戏继续进行,直到用户输入“退出”

记录用户猜了多少次,并在游戏结束时打印出来。

到目前为止,这是我的代码:

import random


def gameTracker():
    global playedGames
    playedGames = 1
    playedGames = playedGames+1

def generateNumber():
    global generatednumber
    generatednumber = random.randint(1, 9)

def generateuserGuess():
    global userguess
    userguess = int(input('Pick a number between 1-9: '))


def generationProcess():
    global userguess
    if int(userguess) == generatednumber:
        print('You have guessed the number. Congratulations.')
        gameTracker()
        global playAgain
        playAgain = input('Want to play again? y/n: ')
        if playAgain == 'y':
            generateNumber()
            userguess = input('Pick a new number between 1-9: ')
            generationProcess()
        if playAgain == 'n':
            print('The game has ended. You have played: ')
            print(int(playedGames))
            print('games')

    if int(userguess) > generatednumber:
        print('You have guessed too high.')
        global conConfirm
        conConfirm = str(input('Guess again?: c/quit: '))
        conGame()

    if int(userguess) < generatednumber:
        print('You have guessed too low.')
        conConfirm = str(input('Guess again?: c/quit: '))
        conGame()


def conGame():
    if conConfirm == 'c':
        global userguess
        userguess = int(input('Your new guess please: '))
        generationProcess()

    if conConfirm == 'quit':
          print('The game has ended. You have played: ')
          print(int(playedGames))
          print('games')

generateNumber()
generateuserGuess()
generationProcess() 

当用户在玩游戏后按“n”或“退出”时,它不会打印出正确的游戏数量,这意味着 gameTracker() 写得不好/错误,但它也出于某种原因打印了游戏次数游戏已经玩过 * playAgain == 'n' 之后会发生什么。

我将如何完成这项工作?

【问题讨论】:

  • 我的最终代码可以在这里找到:codepad.org/4T6v7C56 我有点作弊并为sys.exit 导入了sys 模块,它停止了递归。代码不是那么漂亮,但它可以工作。如果您在玩游戏时发现了错误或其他问题,请告诉我。

标签: python tracker


【解决方案1】:

使用您的 globalsfunction returns。我已经调整了您代码中的一些错误并添加了一些 cmets。仔细看!

import random

#create variable for num of played games
playedGames = 0

#creat variable to count number of guesses per game
guesses = 0
#create function to generate new random num
def generateNumber():
    return random.randint(1, 9)

#askk initial question

generatednumber = generateNumber()

userguess = int(input('Pick a number between 1-9: '))

def generationProcess():
    global userguess, guesses, playedGames,generatednumber

    while True:


        if userguess == generatednumber:
            print('You have guessed the number. Congratulations.')
            playedGames += 1
            global playAgain
            playAgain = input('Want to play again? y/n: ')
            if playAgain == 'y':
                generatednumber = generateNumber()
                userguess = input('Pick a new number between 1-9: ')
                generationProcess()
            if playAgain == 'n':
                print('The game has ended. You have played: '+ str(playedGames)+' games')

        elif int(userguess) > generatednumber:
            print('You have guessed too high.')
            guesses+=1
            conConfirm = str(input('Guess again?: c/quit: '))
            conGame(conConfirm)

        elif int(userguess) < generatednumber:

            guesses+=1
            print('You have guessed too low.')
            conConfirm = str(input('Guess again?: c/quit: '))
            conGame(conConfirm)


def conGame(conConfirm):
    global userguess
    if conConfirm == 'c':
        userguess = int(input('Your new guess please: '))
        generationProcess()

if conConfirm == 'quit':
    print('The game has ended. You have played: ' + str(playedGames) + ' games')


generationProcess()

【讨论】:

  • 这家伙很好地解释了我代码中的错误。他还提供了一些很好的提示: - 在 generationProcess() 中一起声明所有全局变量 - 使用 while Trueelif 而不是新的 if 语句 - 使用 =+ 1 和 playedGames - 将 conConfirm 输入传递给 conGame 函数避免递归总体上是最好的解决方案,而其他解决方案也提供了关于我的特定代码有什么问题的见解。
  • @Alekong 谢谢,别忘了点击投票按钮表示感谢!
  • 我做了,但是很遗憾,因为我的声望低于 15,所以投票将不可见。
【解决方案2】:

gameTracker() 方法中声明后,您应该增加在generateNumber() 方法中玩的游戏数。这样,无论玩了多少游戏,您都可以跟踪已玩了多少游戏!它看起来像这样:

def gameTracker():
    global playedGames
    playedGames = 0

def generateNumber():
    global generatednumber
    generatednumber = random.randint(1, 9)
    playedGames += 1

【讨论】:

  • 这行得通。我完全丢弃了 gameTracker(),它现在看起来像这样:global playedGames playedGames = 0 def generateNumber(): global generatednumber generatednumber = random.randint(1, 9) global playedGames playedGames += 1 playedGames += 1 是我无法弄清楚的。
【解决方案3】:

在您的 gameTracker() 代码中,您将playedGames 初始化为 1,然后将其递增。所以看起来它总是会存储值 2。

由于您的递归,您会获得多个输出。在最后一次递归调用之后,程序控制返回到 if 语句,变量的值仍然是 'n' 或 'quit' 将再次打印详细信息。您可以在退出条件之后将变量初始化为不同的值以避免这种情况。

import random

playedGames = 0

def gameTracker():
    global playedGames
    playedGames = playedGames+1

def generateNumber():
    global generatednumber
    generatednumber = random.randint(1, 9)
    gameTracker()

def generateuserGuess():
    global userguess
    userguess = int(input('Pick a number between 1-9: '))


def generationProcess():
    global userguess
    global generatednumber
    if int(userguess) == generatednumber:
        print('You have guessed the number. Congratulations.')
        global playAgain
        playAgain = input('Want to play again? y/n: ')
        if playAgain == 'y':
            generateNumber()
            userguess = input('Pick a new number between 1-9: ')
            generationProcess()
        if playAgain == 'n':
            print('The game has ended. You have played: ')
            print(int(playedGames))
            print('games')
            playAgain = 'x'


    if int(userguess) > generatednumber:
        print('You have guessed too high.')
        global conConfirm
        conConfirm = input('Guess again?: c/quit: ')
        conGame()

    if int(userguess) < generatednumber:
        print('You have guessed too low.')
        conConfirm = str(input('Guess again?: c/quit: '))
        conGame()


def conGame():
    global conConfirm
    if conConfirm == 'c':
        global userguess
        userguess = int(input('Your new guess please: '))
        generationProcess()

    if conConfirm == 'quit':
          print('The game has ended. You have played: ')
          print(int(playedGames))
          print('games')
          conConfirm = 'x'

generateNumber()
generateuserGuess()
generationProcess() 

【讨论】:

  • 这解释了递归的发生。我明白为什么会发生这种情况,谢谢。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多