You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python猜数字游戏Bug求助:始终校验首次用户输入值

Python猜数字游戏Bug修复方案

问题描述

开发的Python猜数字游戏接近完成,但存在Bug:尽管在函数内重新赋值了用户输入的新数值,程序始终基于首次输入的数值进行条件校验。调整check函数的调用位置后问题依旧,以下是原代码及修复方案。

原代码

import random

number = random.randint(1,101)

print(f"the no is {number}")

def check(user_guess):
    global level
    global game_over 
    if level <= 0:
        print("you ran out of guesses...")
        return False
    if user_guess > number:
        print("too high")
        level -= 1
        print(f"guesses left: {level}")
        user_guess = int(input("guess again "))
        game_over  = False
    elif user_guess < number:
        print("too low")
        level -= 1
        print(f"guesses left: {level}")
        user_guess = int(input("guess again "))
    elif user_guess == number:
        print("you guessed right")
        return False
    



level = 0


def levels():
    '''assigns the level to the user'''
    global game_over
    global level
    print("Welcome to the number guessing game...")
    difficulty = input("enter a difficulty: Easy or Hard? ").lower()
    if difficulty == 'easy':
        level = 10
        print(f"guesses: {level}")
    elif difficulty == 'hard':
        level = 5
        print(f"guesses : {level}")
    else:
        print("error")
        


game_over = False

levels()
user_guess = int(input("make a guess "))

while not game_over:
    check(user_guess)
    if check(user_guess) == False:
        game_over = True

问题原因

  • check函数内的user_guess是局部变量,修改它不会影响外部全局变量user_guess的值,循环始终使用第一次输入的数值
  • 循环内两次调用check(user_guess),第一次调用获取新输入但未更新全局变量,第二次仍用旧值校验,逻辑混乱
  • game_over控制逻辑不清晰,函数返回值和全局变量混用,容易触发错误的终止条件

修复后的代码

import random

number = random.randint(1, 101)
print(f"the no is {number}")

level = 0
game_over = False

def levels():
    '''assigns the level to the user'''
    global level
    print("Welcome to the number guessing game...")
    difficulty = input("enter a difficulty: Easy or Hard? ").lower()
    if difficulty == 'easy':
        level = 10
        print(f"guesses: {level}")
    elif difficulty == 'hard':
        level = 5
        print(f"guesses : {level}")
    else:
        print("error")

def check(user_guess):
    global level
    if level <= 0:
        print("you ran out of guesses...")
        return True  # 返回True表示游戏结束
    if user_guess > number:
        print("too high")
        level -= 1
        print(f"guesses left: {level}")
        return False  # 返回False表示继续游戏
    elif user_guess < number:
        print("too low")
        level -= 1
        print(f"guesses left: {level}")
        return False
    elif user_guess == number:
        print("you guessed right")
        return True

levels()
user_guess = int(input("make a guess "))

while not game_over:
    game_over = check(user_guess)
    if not game_over:
        user_guess = int(input("guess again "))

关键修改点

  • 将用户输入逻辑从check函数移出,放到循环内统一处理,确保user_guess每次都更新为最新输入
  • 让check函数只负责校验逻辑,返回布尔值表示游戏是否结束,避免局部变量与全局变量混淆
  • 简化循环逻辑,仅调用一次check函数,根据返回值决定是否继续循环并获取新输入
  • 移除check函数内对game_over全局变量的依赖,改用返回值控制游戏状态

内容的提问来源于stack exchange,提问作者rokari19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:35:08