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

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()

问题分析

当前代码的核心问题:

  1. Prestige状态触发时机错误:只有在购买第10次升级时才设置prestige=True,但此时times_bought已自增到11,后续无法触发状态切换逻辑。
  2. 按钮文本更新滞后:没有在每次购买后立即检查是否达到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()

关键修改说明

  1. 拆分按钮文本更新逻辑:新增update_upgrade_button_text()函数,确保任何状态变化时按钮文本立即同步。
  2. 调整Prestige触发时机:普通升级购买完成后,立即检查times_bought是否等于10,满足条件则切换Prestige状态并设置5倍成本,按钮文本立刻更新。
  3. 重构Prestige购买逻辑:通过prestige状态判断进阶操作,避免购买次数自增导致的逻辑混乱。
  4. 重置购买次数:完成Prestige进阶后,重置times_bought为0,开启新一轮10次普通升级循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:05:18