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

如何为Python Tkinter卡片配对记忆游戏添加重置按钮

为Tkinter卡片记忆游戏添加重置功能

你只需要把游戏初始化逻辑封装为独立函数,再添加一个触发重置的按钮即可,不需要改动核心的配对判断逻辑,修改要点如下:

  • 把全局状态重置、符号打乱、卡片按钮生成的逻辑从主流程抽离到reset_game()函数中
  • 重置时先销毁已存在的旧卡片按钮,避免界面控件堆叠
  • 在界面预留位置添加重置按钮,绑定reset_game()函数作为点击触发事件
  • 游戏通关弹出提示后可自动触发重置,也可保留手动点击重置的入口

注意:原代码中time.sleep()会阻塞Tkinter主线程刷新,修改版里替换为Tkinter原生的after()方法避免界面卡顿,不需要的话也可以改回原来的sleep写法。

修改后的完整可运行代码:

import random
from tkinter import Tk, Button, DISABLED, messagebox

def close_window():
    root.destroy()

def show_symbol(x, y):
    global first
    global previousX, previousY
    global moves
    global pairs
    buttons[x, y]['text'] = button_symbols[x, y]
    buttons[x, y].update_idletasks()
    if first:
        previousX = x
        previousY = y
        first = False
        moves = moves + 1
    elif previousX != x or previousY != y:
        if buttons[previousX, previousY]['text'] != buttons[x, y]['text']:
            # 替换sleep为tkinter原生after避免界面卡死
            def hide_cards():
                buttons[previousX, previousY]['text'] = ''
                buttons[x, y]['text'] = ''
            root.after(500, hide_cards)
        else:
            buttons[previousX, previousY]['command'] = DISABLED
            buttons[x, y]['command'] = DISABLED
            pairs = pairs + 1
            if pairs == len(buttons) / 2:
                messagebox.showinfo('Matching', f'完成!总步数: {moves}\n点击确定重新开始游戏')
                reset_game()
        first = True

def reset_game():
    global buttons, first, previousX, previousY, moves, pairs, button_symbols, symbols
    # 清空已有的卡片按钮
    for btn in buttons.values():
        btn.destroy()
    buttons = {}
    # 重置所有全局状态
    first = True
    previousX = 0
    previousY = 0
    moves = 0
    pairs = 0
    button_symbols = {}
    # 重新打乱符号
    symbols = [u'\u2702', u'\u2702', u'\u2705', u'\u2705', u'\u2708', u'\u2708',
               u'\u2709', u'\u2709', u'\u270A', u'\u270A', u'\u270B', u'\u270B',
               u'\u270C', u'\u270C', u'\u270F', u'\u270F', u'\u2712', u'\u2712',
               u'\u2714', u'\u2714', u'\u2716', u'\u2716', u'\u2728', u'\u2728',
              ]
    random.shuffle(symbols)
    # 重新生成卡片按钮,行号从1开始,给顶部重置按钮留位置
    for x in range(6):
        for y in range(4):
            button = Button(command=lambda x=x, y=y: show_symbol(x, y), width=5, height=3, border=2)
            button.grid(column=x, row=y+1, padx=15, pady=10)
            buttons[x, y] = button
            button_symbols[x, y] = symbols.pop()

root = Tk()
root.title('Igra Memorije')
root.resizable(width=False, height=False)

buttons = {}
# 添加重置按钮,放在界面顶部跨6列居中
reset_btn = Button(command=reset_game, text="重新开始", width=10, height=1)
reset_btn.grid(column=0, row=0, columnspan=6, pady=10)

# 初始化游戏
reset_game()

root.mainloop()

修改后效果:

  • 界面顶部新增重新开始按钮,任何时候点击都可以立刻重置游戏,重新打乱卡片、步数清零
  • 配对成功通关弹出提示后,点击确定会自动重置游戏开始新局
  • 修复了原代码中time.sleep导致的界面无响应问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:39:58