Tkinter点击器游戏Prestige功能触发时机异常求助
问题:点击器游戏Prestige机制无法在购买满10次升级后立即切换按钮文本
我开发了一款点击器游戏,基础功能已实现:点击按钮获得点击数,购买升级提升点击力,升级价格每次上涨15%。现在要为升级添加Prestige机制:
- 购买该升级满10次后,按钮文本切换为
MAX UPGRADES BOUGHT\nPRESTIGE COST: [进阶成本] - 支付当前成本5倍的费用完成进阶后,升级提供更多奖励
但实际运行中,Prestige提示需要在购买升级10次后再点击购买2-3次才会显示,无法立即触发。
更新后仍有问题的代码
from tkinter import * from threading import Timer window = Tk() window.minsize(1200, 500) window.title("Clicker Game") # general setup default_font = ("Calibri", 15, "normal") clicks = 0 click_power = 1 # upgrade variables upgrade1_stats = { "cost": 15, "can buy": False, "times bought": 0, "click power given": 1, "prestige": False, } # functions def check_clicks(): global clicks, upgrade1_stats if clicks >= 10: upgrade1.place(x=200, y=50) if clicks >= upgrade1_stats["cost"]: upgrade1_stats["can buy"] = True else: upgrade1_stats["can buy"] = False def get_upgrade1(): global clicks, upgrade1_stats, click_power if upgrade1_stats["times bought"] == 10 and upgrade1_stats["can buy"]: upgrade1_stats["cost"] = int(upgrade1_stats["cost"] * 5) update_stats() upgrade1_stats["prestige"] = True upgrade1_stats["click power given"] += 1 upgrade1_stats["times bought"] += 1 elif upgrade1_stats["can buy"] and upgrade1_stats["times bought"] != 10: clicks -= upgrade1_stats["cost"] click_power += upgrade1_stats["click power given"] upgrade1_stats["cost"] = int(upgrade1_stats["cost"] * 1.15) upgrade1_stats["times bought"] += 1 upgrade1_stats["prestige"] = False update_stats() else: not_enough_clicks() check_clicks() if upgrade1_stats["prestige"]: upgrade1.config(text=f"MAX UPGRADES BOUGHT\nPRESTIGE COST: {upgrade1_stats['cost']}") else: upgrade1.config(text=f"+{upgrade1_stats['click power given']} Click Power\nCost: {upgrade1_stats['cost']}") def not_enough_clicks(): new_label = Label(text="NOT ENOUGH CLICKS", font=("Calibri", 80, "bold")) new_label.place(x=125, y=180) t = Timer(1, new_label.destroy) t.start() def increase_score(*args): global clicks if len(args) > 0: update_amount = args[0] else: update_amount = click_power clicks += update_amount update_stats() check_clicks() def update_stats(**kwargs): global clicks, click_power click_display.config(text=f"{clicks} Clicks") if click_power == 1: click_power_display.config(text=f"{click_power} Click per Button Click") else: click_power_display.config(text=f"{click_power} Clicks per Button Click") # title text title_label = Label(text="Clicker Game", font=("Calibri", 30, "bold")) title_label.grid(column=1, columnspan=2, row=1) window.grid_columnconfigure(2, weight=1) window.grid_rowconfigure(1, weight=1) # click display click_display = Label(text=f"{clicks} Clicks", font=default_font) click_display.grid(column=2, row=2) window.grid_rowconfigure(2, weight=0, pad=70) # button to click clicker = Button(text="Click Me", command=increase_score, height=3, width=10, bg="red") clicker.grid(column=2, row=3) window.grid_rowconfigure(3, pad=200) # click power display click_power_display = Label(text=f"{click_power} Click per Button Click", font=default_font) click_power_display.place(x=495, y=150) # upgrades upgrade1 = Button(text=f"+1 Click Power\nCost: {upgrade1_stats['cost']}", command=get_upgrade1) window.mainloop()
问题分析
当前代码的核心问题:
- Prestige状态触发时机错误:只有在购买第10次升级时才设置
prestige=True,但此时times_bought已自增到11,后续无法触发状态切换逻辑。 - 按钮文本更新滞后:没有在每次购买后立即检查是否达到10次购买阈值,导致按钮文本无法及时切换。
修复方案
调整逻辑,在每次购买升级后立即检查是否达到10次阈值,触发Prestige状态并更新按钮;同时重构Prestige购买的判断逻辑,避免次数自增导致的混乱。
修改后的完整代码
from tkinter import * from threading import Timer window = Tk() window.minsize(1200, 500) window.title("Clicker Game") # general setup default_font = ("Calibri", 15, "normal") clicks = 0 click_power = 1 # upgrade variables upgrade1_stats = { "cost": 15, "can buy": False, "times bought": 0, "click power given": 1, "prestige": False, } # functions def check_clicks(): global clicks, upgrade1_stats if clicks >= 10: upgrade1.place(x=200, y=50) if clicks >= upgrade1_stats["cost"]: upgrade1_stats["can buy"] = True else: upgrade1_stats["can buy"] = False # 每次检查点击数后同步更新按钮文本 update_upgrade_button_text() def get_upgrade1(): global clicks, upgrade1_stats, click_power # 处理Prestige进阶操作 if upgrade1_stats["prestige"] and upgrade1_stats["can buy"]: clicks -= upgrade1_stats["cost"] click_power += upgrade1_stats["click power given"] # 进阶后重置状态,开启新一轮升级 upgrade1_stats["prestige"] = False upgrade1_stats["cost"] = int(upgrade1_stats["cost"] * 1.15) upgrade1_stats["times bought"] = 0 update_stats() # 处理普通升级 elif upgrade1_stats["can buy"] and not upgrade1_stats["prestige"]: clicks -= upgrade1_stats["cost"] click_power += upgrade1_stats["click power given"] upgrade1_stats["cost"] = int(upgrade1_stats["cost"] * 1.15) upgrade1_stats["times bought"] += 1 update_stats() # 购买后检查是否达到10次,触发Prestige状态 if upgrade1_stats["times bought"] == 10: upgrade1_stats["prestige"] = True upgrade1_stats["cost"] = int(upgrade1_stats["cost"] * 5) else: not_enough_clicks() check_clicks() def update_upgrade_button_text(): """单独处理按钮文本更新,确保状态变化时立即同步""" if upgrade1_stats["prestige"]: upgrade1.config(text=f"MAX UPGRADES BOUGHT\nPRESTIGE COST: {upgrade1_stats['cost']}") else: upgrade1.config(text=f"+{upgrade1_stats['click power given']} Click Power\nCost: {upgrade1_stats['cost']}") def not_enough_clicks(): new_label = Label(text="NOT ENOUGH CLICKS", font=("Calibri", 80, "bold")) new_label.place(x=125, y=180) t = Timer(1, new_label.destroy) t.start() def increase_score(*args): global clicks if len(args) > 0: update_amount = args[0] else: update_amount = click_power clicks += update_amount update_stats() check_clicks() def update_stats(**kwargs): global clicks, click_power click_display.config(text=f"{clicks} Clicks") if click_power == 1: click_power_display.config(text=f"{click_power} Click per Button Click") else: click_power_display.config(text=f"{click_power} Clicks per Button Click") # title text title_label = Label(text="Clicker Game", font=("Calibri", 30, "bold")) title_label.grid(column=1, columnspan=2, row=1) window.grid_columnconfigure(2, weight=1) window.grid_rowconfigure(1, weight=1) # click display click_display = Label(text=f"{clicks} Clicks", font=default_font) click_display.grid(column=2, row=2) window.grid_rowconfigure(2, weight=0, pad=70) # button to click clicker = Button(text="Click Me", command=increase_score, height=3, width=10, bg="red") clicker.grid(column=2, row=3) window.grid_rowconfigure(3, pad=200) # click power display click_power_display = Label(text=f"{click_power} Click per Button Click", font=default_font) click_power_display.place(x=495, y=150) # upgrades upgrade1 = Button(text=f"+1 Click Power\nCost: {upgrade1_stats['cost']}", command=get_upgrade1) window.mainloop()
关键修改说明
- 拆分按钮文本更新逻辑:新增
update_upgrade_button_text()函数,确保任何状态变化时按钮文本立即同步。 - 调整Prestige触发时机:普通升级购买完成后,立即检查
times_bought是否等于10,满足条件则切换Prestige状态并设置5倍成本,按钮文本立刻更新。 - 重构Prestige购买逻辑:通过
prestige状态判断进阶操作,避免购买次数自增导致的逻辑混乱。 - 重置购买次数:完成Prestige进阶后,重置
times_bought为0,开启新一轮10次普通升级循环。
内容的提问来源于stack exchange,提问作者yugms
相关产品推荐
相关产品推荐

