当前位置: 首页 > news >正文

Python和tkinter实现的字母记忆配对游戏

Python和tkinter实现的字母记忆配对游戏

因为这个小游戏用到了tkinter,先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库,它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具,同时保持了相对简单的学习曲线。tkinter是Python的内置库,无需额外安装。

messagebox是tkinter中用于创建各种类型的消息对话框的模块,需要注意的是messagebox是tkinter的一个子模块。为了正确使用messagebox,你需要从tkinter中单独导入它。

这个小游戏具有重新开始和难度设置功能。

“游戏”菜单,包含“新游戏”选项,点击它或完成一局游戏后,会自动开始新游戏。

“难度”菜单,难度设置,包含简单、中等和困难三个选项。

简单难度: 4x2 网格,8个方块

中等难度: 4x3 网格,12个方块

困难难度: 4x4 网格,16个方块

运行界面:

现在Python和tkinter实现字母记忆配对游戏源码,先看使用面向过程风格的版本源码:

import tkinter as tk
import tkinter.messagebox 
import randomdef setup_menu(root, difficulty, new_game_func):"""设置游戏菜单"""menubar = tk.Menu(root)root.config(menu=menubar)# 创建"游戏"菜单game_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="游戏", menu=game_menu)game_menu.add_command(label="新游戏", command=new_game_func)# 创建"难度"菜单difficulty_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="难度", menu=difficulty_menu)difficulty_menu.add_radiobutton(label="简单", variable=difficulty, value="简单", command=new_game_func)difficulty_menu.add_radiobutton(label="中等", variable=difficulty, value="中等", command=new_game_func)difficulty_menu.add_radiobutton(label="困难", variable=difficulty, value="困难", command=new_game_func)def create_button(frame, row, col, on_click_func):"""创建游戏按钮"""button = tk.Button(frame, text='', width=10, height=5, command=lambda: on_click_func(row, col))button.grid(row=row, column=col, padx=5, pady=5)return buttondef new_game():"""开始新游戏"""global matches_found, first_click, buttons, symbolsmatches_found = 0first_click = None# 清除旧的游戏布局for widget in frame.winfo_children():widget.destroy()buttons = []# 根据难度设置游戏布局和符号if difficulty.get() == "简单":rows, cols = 4, 2symbols = ['A', 'B', 'C', 'D'] * 2elif difficulty.get() == "中等":rows, cols = 4, 3symbols = ['A', 'B', 'C', 'D', 'E', 'F'] * 2else:  # 困难rows, cols = 4, 4symbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] * 2random.shuffle(symbols)# 创建游戏按钮for i in range(rows):for j in range(cols):button = create_button(frame, i, j, on_click)buttons.append(button)def on_click(row, col):"""处理按钮点击事件"""global first_click, matches_foundindex = row * len(frame.grid_slaves()) // 4 + colbutton = buttons[index]if button['text'] == '':button['text'] = symbols[index]if first_click is None:first_click = (index, button)else:if symbols[index] == first_click[1]['text']:matches_found += 1if matches_found == len(symbols) // 2:tk.messagebox.showinfo("恭喜", "你赢了!")new_game()else:# 如果不匹配,0.5秒后隐藏按钮root.after(500, hide_buttons, index, first_click[0])first_click = Nonedef hide_buttons(index1, index2):"""隐藏不匹配的按钮"""buttons[index1]['text'] = ''buttons[index2]['text'] = ''# 主程序
root = tk.Tk()
root.title("字母记忆配对游戏")
root.geometry("400x450")  # 设置窗口的宽度为400像素,高度为450像素difficulty = tk.StringVar()
difficulty.set("简单")  # 默认难度为简单frame = tk.Frame(root)
frame.pack()setup_menu(root, difficulty, new_game)# 初始化游戏变量
matches_found = 0
first_click = None
buttons = []
symbols = []new_game()  # 开始第一局游戏root.mainloop()  # 启动主事件循环

上面是使用面向过程风格的版本,下面改写为使用面向对象风格的版本,源码如下:

import tkinter as tk
import tkinter.messagebox 
import randomclass MemoryGame:def __init__(self, master):self.master = masterself.master.title("字母记忆配对游戏")self.master.geometry("400x450") #设置了窗体的宽度为400像素,高度为450像素self.buttons = []self.first_click = Noneself.matches_found = 0self.difficulty = tk.StringVar()self.difficulty.set("简单")self.setup_menu()self.setup_game()def setup_menu(self):menubar = tk.Menu(self.master)self.master.config(menu=menubar)game_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="游戏", menu=game_menu)game_menu.add_command(label="新游戏", command=self.new_game)difficulty_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="难度", menu=difficulty_menu)difficulty_menu.add_radiobutton(label="简单", variable=self.difficulty, value="简单", command=self.new_game)difficulty_menu.add_radiobutton(label="中等", variable=self.difficulty, value="中等", command=self.new_game)difficulty_menu.add_radiobutton(label="困难", variable=self.difficulty, value="困难", command=self.new_game)def setup_game(self):self.frame = tk.Frame(self.master)self.frame.pack()self.new_game()def new_game(self):self.matches_found = 0self.first_click = Nonefor widget in self.frame.winfo_children():widget.destroy()self.buttons = []if self.difficulty.get() == "简单":rows, cols = 4, 2symbols = ['A', 'B', 'C', 'D'] * 2elif self.difficulty.get() == "中等":rows, cols = 4, 3symbols = ['A', 'B', 'C', 'D', 'E', 'F'] * 2else:  # 困难rows, cols = 4, 4symbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] * 2random.shuffle(symbols)for i in range(rows):for j in range(cols):button = tk.Button(self.frame, text='', width=10, height=5, command=lambda x=i, y=j: self.on_click(x, y))button.grid(row=i, column=j, padx=5, pady=5)self.buttons.append(button)self.symbols = symbolsdef on_click(self, row, col):index = row * len(self.frame.grid_slaves()) // 4 + colbutton = self.buttons[index]if button['text'] == '':button['text'] = self.symbols[index]if self.first_click is None:self.first_click = (index, button)else:if self.symbols[index] == self.first_click[1]['text']:self.matches_found += 1if self.matches_found == len(self.symbols) // 2:tk.messagebox.showinfo("恭喜", "你赢了!")self.new_game()else:# 如果不匹配,0.5秒后隐藏按钮self.master.after(500, self.hide_buttons, index, self.first_click[0])self.first_click = Nonedef hide_buttons(self, index1, index2):self.buttons[index1]['text'] = ''self.buttons[index2]['text'] = ''root = tk.Tk()
game = MemoryGame(root)
root.mainloop()

相关文章:

Python和tkinter实现的字母记忆配对游戏

Python和tkinter实现的字母记忆配对游戏 因为这个小游戏用到了tkinter,先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库,它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具,同时保…...

Leetcode Hot100之链表

1.相交链表 解题思路 快慢指针:分别求出两个链表的长度n1和n2,在长度较长的那个链表上,快指针先走n2 - n1,慢指针再出发,最后能相遇则链表相交 时间复杂度O(mn),空间复杂度O(1)代码# Definition for singl…...

5.9k!一款清新好用的后台管理系统!【送源码】

今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的: Soybean Admin 使用的是Vue3作为前端框架,TypeScript作为开发语言,同时还整合了NaiveUI组件库,使得系统具有高可用性和…...

Vue-cli搭建项目----基础版

什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…...

python之__call__函数介绍

Python 中的 __call__ 方法是一种特殊的方法,它允许对象像函数一样被调用。当你创建一个对象并使用括号 () 调用它时,Python 会自动调用这个对象的 __call__ 方法。 1. 基本用法 下面是一个简单的例子: class MyClass:def __init__(self, value):self.value valued…...

【AI】生成式AI服务器最低配置

【背景】 考虑数据安全,又想用AI赋能企业内部的日常工作,答案只有一个,本地部署。 UI采用open-web-ui,模型用Ollama管理,在局域网做成SAAS服务。要组一个服务器,提供部门内部最多30个的API并发。以下为反复…...

2.Android逆向协议-了解常用的逆向工具

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:1.Android逆向协议-环境搭建 常用的工具:AndroidKiller、jadx、JEB、IDA AndroidKiller…...

大数据------额外软件、插件及技术------Linux(完整知识点汇总)

Linxu 不同领域的主流操作系统 桌面操作系统 WindowsMAac OSLinux 服务器端操作系统 UNIX(付费)LinuxWindows Server(付费) 移动设备操作系统 Android(基于Linux开源)IOS(不开源) 嵌…...

iOS 其他应用的文件如何在分享中使用自己的应用打开

废话少说 一、第一步:先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型,也可使用property List中配置,一样的 其他的文件可是参考文档:System-Declared Uniform Type Identifiers 可复制的代码&am…...

【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄

写在最前 本文为编译原理重点考察大题之一,理论基础见专栏文章,0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树,短语,简单短语,句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…...

redis服务介绍

redis 基础概念安装使用基础操作命令数据类型操作命令 管理和维护命令 基础概念 Remote Dictionary Server(Redis)远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,是一个高性能的(key/val…...

nodepad 中换行符、tab替换

1 nodepad 主要符号 换行符: \r\n(windows) tab: \t 2 展示符号 3 相互替换 tip:需要点击扩展 参考: https://blog.csdn.net/lijing742180/article/details/85174564...

常见的字符串函数(包含头文件string.h)和字符函数(2)

八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置,记录并返回该位置的指针,如果找不到,则返回NULL ->2. str1:查找字符…...

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…...

SpringCloud分布式微服务链路追踪方案:Skywalking

一、引言 随着微服务架构的广泛应用&#xff0c;系统的复杂性也随之增加。在这种复杂的系统中&#xff0c;应用通常由多个相互独立的服务组成&#xff0c;每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性&#xff0c;但也带来了新的挑战&#xf…...

首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会

6月22日&#xff0c;2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕&#xff0c;泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司&#xff08;NASDAQ:LIDR&#xff09;及光电器件规模化量产巨头Accelight Technologies&#xff…...

一文入门CMake

我们前几篇文章已经入门了gcc和Makefile&#xff0c;现在可以来玩玩CMake了。 CMake和Makefile是差不多的&#xff0c;基本上是可以相互替换使用的。CMAke可以生成Makefile&#xff0c;所以本质上我们还是用的Makefile&#xff0c;只不过用了CMake就不用再写Makefile了&#x…...

【LeetCode面试经典150题】117. 填充每个节点的下一个右侧节点指针 II

一、题目 117. 填充每个节点的下一个右侧节点指针 II - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个…...

RTDETR更换优化器——Lion

RTDETR更换Lion优化器 论文&#xff1a;https://arxiv.org/abs/2302.06675 代码&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介&#xff1a; Lion优化器是一种基于梯度的优化算法&#xff0c;旨在提高梯度下降法在深度学习中的优化效果…...

Spring Boot中最佳实践:数据源配置详解

Spring Boot中最佳实践&#xff1a;数据源配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...