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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSI七层模型TCP/IP四层面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点 1 OSI七层模型 1. 物理层:透明地传输比特流 在物理媒介上传输原始比特流,定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输,例如通过以太网、光纤和无线电波等媒…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行,这一立法是中国信息化法律的重要里程碑,为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段,更是一种法律认可的签名形式。那么究竟什…

Python私教张大鹏 PyWebIO通过事件回调实现表格的编辑和删除功能

从上面可以看出,PyWebIO把交互分成了输入和输出两部分:输入函数为阻塞式调用,会在用户浏览器上显示一个表单,在用户提交表单之前输入函数将不会返回;输出函数将内容实时输出至浏览器。这种交互方式和控制台程序是一致的…

学习TTS遇到的问题2 什么是TCN模型

学习TTS遇到的问题2 什么是TCN模型 什么是TCN模型怎么理解 TCN中的 dilation?什么是 Dilation具体例子数学表达作用例子代码示例 什么是TCN模型 https://juejin.cn/post/7262269863343079479 https://blog.csdn.net/weixin_57726558/article/details/132163074 由下…

出手便是王炸,曙光存储将高端存储推向新高度

二十年磨一剑,今朝试锋芒。 近日,曙光存储重磅发布全球首个亿级IOPS集中式全闪存储FlashNexus,正式宣告进入高端存储市场。 作为存储产业皇冠上的明珠,高端存储一向以技术难度大、市场准入门槛高和竞争格局稳定著称,…

从0-1搭建一个web项目(package.json)详解

本章分析package.json文件详解 本文主要对packge.json配置子文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等…

Centos7源码方式安装sqle及开发相关

官方文档-源码安装 操作系统:centos:7.9,everything (DVD版应该也可以) (在ubuntu22.04装了两天之后乖乖开了一个新Centos7虚拟机) 镜像:清华大学开源软件镜像站 centos/7.9.2009 安装git sudo yum update -y sudo yum install -y git git --version安…

数据结构与算法笔记:高级篇 - B+树:MySql数据库索引是如何实现的?

概述 作为一名软件开发工程师,你对数据库肯定再熟悉不过了。MySQL 作为主流的数据库存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,…

01.Ambari自定义服务开发-项目初始化

文章目录 基础环境在PyCharm中初始化项目配置项目相关依赖在PyCharm中导入依赖 基础环境 PyCharmPython 2.7已经安装完成的Ambari服务端 在PyCharm中初始化项目 项目名称就是我们要安装服务的名称,要求名称为全大写,如:DORIS创建Python2.7…

龙迅LT8711V TYPE-CDP 1.2转VGA芯片,内置MCU,成熟批量产品

龙迅LT8711V描述: LT8711V是一种高性能的Type-C/DP1.2到VGA转换器,设计用于连接USB Type-C源或DP1.2源到VGA接收器。LT8711V集成了一个DP1.2兼容的接收器,和一个高速三通道视频DAC。此外,还包括两个CC控制器,用于CC通…

图像大小调整(缩放)

尺寸调整前尺寸调整前 1、背景介绍 在深度学习中,将图像调整到固定尺寸(如28x28像素)的操作是非常常见的,尤其是在处理诸如图像分类、物体检测和图像分割等任务时。这种操作有几个重要原因: 标准化输入:许…

【可控图像生成系列论文(五)】ControlNet 和 IP-Adapter 之间的区别有哪些?

系列文章目录 【可控图像生成系列论文(一)】 简要介绍了 MimicBrush 的整体流程和方法;【可控图像生成系列论文(二)】 就MimicBrush 的具体模型结构、训练数据和纹理迁移进行了更详细的介绍。【可控图像生成系列论文&…

【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…

Linux系统编程(七)进程间通信IPC

进程间通讯的7种方式_进程间通信的几种方法-CSDN博客 管道 pipe(命名管道和匿名管道);信号 signal;共享内存;消息队列;信号量 semaphore;套接字 socket; 1. 管道 内核提供&#x…

Arduino平台软硬件原理及使用——SR04超声波传感器的使用

文章目录: 一、超声波传感器工作原理 二、SR04超声波库的使用 三、SR04超声波传感器在Arduino中的使用 一、超声波传感器工作原理 如上图所示:HCSR04超声波传感器拥有4个针脚,除了VCC接正极、GND接负极外,还有两个引脚“Trig”及“…

Linux线程互斥锁

目录 🚩看现象,说原因 🚩解决方案 🚩互斥锁 🚀关于互斥锁的理解 🚀关于原子性的理解 🚀如何理解加锁和解锁是原子的 🚩对互斥锁的简单封装 引言 大家有任何疑问,可…

CCSP自考攻略+经验总结

备考攻略 备考攻略准备阶段通读阶段精度阶段总复习阶段刷题阶段命运审判 写到最后 备考攻略 趁着对ssp知识点的理解还在,开始ccsp的考证之路,文章结构还是按照cissp备考篇的结构梳理。本次备考和cissp的离职在家备考不同,ccsp是在职利用非工…

如何用亚马逊合作伙伴网络快速上线跨境电商

目前跨境电商已成为行业发展主流,如何快速、低成本打造品牌海外独立站和智能客服营销中心、构建全链路跨境电商体系是出海电商商家都会遇到的难题。亚马逊云科技凭借与亚马逊电商平台易于集成的先天优势成为首选的电商解决方案平台。本文介绍了如何用亚马逊云科技平…

Elasticsearch8.x聚合查询全面指南:从理论到实战

聚合查询的概念 聚合查询(Aggregation Queries)是Elasticsearch中用于数据汇总和分析的查询类型。它不同于普通的查询,而是用于执行各种聚合操作,如计数、求和、平均值、最小值、最大值、分组等。 聚合查询的分类 分桶聚合&…

centos7 安装单机MongoDB

centos7安装单机 yum 安装 1、配置yum源 vim /etc/yum.repos.d/mongodb.repo [mongodb-org-7.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp…