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
相关产品推荐
相关产品推荐

