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

Python Tkinter数字猜谜游戏尝试次数变负问题修复

问题根因

原代码存在2个核心逻辑漏洞导致次数出现负数、交互不终止:

  • 次数扣减逻辑位置错误:无论用户输入是否合法(非整数、超出0-999范围),只要触发校验逻辑就会先扣减attempts计数
  • 次数归0时未阻断交互:attempts == 0的分支仅修改了提示文本、清空输入框,既没有禁用提交按钮/输入框,也没有终止逻辑执行,用户可以反复点击Check按钮持续扣减次数。
修复逻辑
  • 调整次数扣减位置:仅当用户输入合法整数、且在0-999有效范围内时才扣减尝试次数
  • 次数归0时增加阻断逻辑:弹出失败提示告知用户正确答案,同时禁用输入框、Check提交按钮,禁止后续交互
  • 补充前置校验:用户未点击「Generate Random No」生成随机数时点击Check,直接给出提示,避免触发变量不存在的报错
  • 补充重开逻辑:点击生成随机数按钮时自动重置所有状态,支持重新开局
修复后完整可运行代码
from tkinter import *
from tkinter.messagebox import *
import random

root = Tk()
root.title('Number Guessing Game E-project')
root.geometry('500x500')

label1 = Label(root, text= "WELCOME TO NUMBER GUESSING GAME",fg='Maroon',font= ('bold',17))
label2 = Label(root, text= "Enter your guess between 0-999:",font=('Italics',15), fg='Maroon')

label1.grid(row=1 , column=0  ,ipadx=20,pady=10)
label2.grid(row=4 , column=0 ,ipadx=10,pady=10)

player1 = StringVar(root,value="Generate A Random Number First")

entry1 = Entry(root,textvariable=player1,width=30,bd=4)
entry2 = Entry(root,width=30,bd=4)
entry1.grid(row =12 , column= 0 ,ipadx=10,pady=10)
entry2.grid(row =13, column= 0 ,ipadx=10,pady=10)

attempts = 10
random_number = None

chances = StringVar()
chances.set("10 Attempts Remaining")
label4 = Label(root,textvariable=chances,font='Italics')
label4.grid(row=7,column=0 ,ipadx=10,pady=10)

def clear_the_screen():
    entry1.delete(0,END)

def random_num_generate():
    global random_number, attempts
    random_number = random.randint(0,999)
    # 重置次数和控件状态
    attempts = 10
    chances.set("10 Attempts Remaining")
    entry1.config(state=NORMAL)
    button3.config(state=NORMAL)
    entry2.delete(0, END)
    clear_the_screen()

def player_input():
    # 先判断是否已生成随机数
    if random_number is None:
        entry2.delete(0, END)
        entry2.insert(0, "Please generate random number first!")
        return
    try:
        user_guess = int(entry1.get())
        # 先判断数值范围,不合法不扣次数
        if user_guess <0 or user_guess >999:
            entry2.delete(0, END)
            entry2.insert(0, "Please enter number between 0-999!")
            clear_the_screen()
            return
        winning_logic(random_number,user_guess)
    except ValueError:
        entry2.delete(0, END)
        entry2.insert(0,"Enter integers only!")
        clear_the_screen()

def winning_logic(random_no,player_guess):
    global attempts
    global chances
    # 仅合法有效输入才扣次数
    attempts -= 1

    if player_guess == random_no:
        result1 = 'Bravo! Success!'
        entry2.delete(0, END)
        entry2.insert(0,result1)
        chances.set(f'You Win!')
        win = (f'Congrats! You have guessed the correct number !')
        showinfo(f'Number Guessing Game', win)
        response = askquestion('Number Guessing Game', 'Did you like the game?')
        if response == 'yes':
            showinfo('Number Guessing Game', "That's Great!!")
        else:
            showinfo('Number Guessing Game',"So Sad!")
        root.destroy()

    elif attempts == 0:
        chances.set("Oops! You are out of attempts :(")
        clear_the_screen()
        # 弹出失败提示
        showerror("Game Over", f"You have used all attempts! The correct number is {random_no}")
        # 禁用交互控件
        entry1.config(state=DISABLED)
        button3.config(state=DISABLED)

    elif player_guess < random_no:
        result2 = 'Guess Higher!'
        entry2.delete(0,END)
        entry2.insert(0, result2)
        chances.set(f'Wrong! {attempts} attempts remaining')
        clear_the_screen()

    elif player_guess > random_no:
        result3 = 'Guess Lower!'
        entry2.delete(0,END)
        entry2.insert(0, result3)
        chances.set(f'Wrong! {attempts} attempts remaining')
        clear_the_screen()

button1 = Button(root, text='Generate Random No',fg='white',bg='brown',command=random_num_generate)
button1.grid(row=9, column=0,ipadx=20,pady=8)

button2 = Button(root, text='Clear',fg='white',bg='brown',command=clear_the_screen)
button2.grid(row=18, column=0,ipadx=73,pady=10)

button3 = Button(root, text='Check',fg='white',bg='brown',command=player_input)
button3.grid(row=20, column=0,ipadx=70,pady=8)

root.mainloop()
修复效果说明
  • 输入非整数、超出0-999范围的内容时,不会扣减尝试次数
  • 10次有效猜测用完后,自动弹出失败提示展示正确答案,输入框和Check按钮直接禁用,无法继续提交猜测,不会出现负数次数
  • 点击生成随机数按钮时会自动重置所有状态,可重新开始游戏
  • 未生成随机数时点击Check会给出对应提示,不会触发程序报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:24:22