使用Pygame创建一个简单的消消乐游戏
消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。
准备工作
在开始之前,请确保已安装Pygame库。可以通过以下命令安装:
pip install pygame
游戏设计
我们的游戏将包括以下几个部分:
- 初始化Pygame:设置游戏窗口和基本参数。
- 创建网格:生成一个随机颜色的方块网格。
- 实现交换和消除功能:允许玩家点击交换方块,并检测和消除匹配的方块。
- 更新游戏状态:处理方块下落和新方块生成。
- 显示分数:记录玩家的得分。
代码实现
以下是完整的代码实现:
import pygame
import random
import time# 初始化Pygame
pygame.init()# 设置屏幕大小
screen_width, screen_height = 600, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("消消乐")# 定义颜色
COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 165, 0)]
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)# 定义网格大小
GRID_SIZE = 8
BLOCK_SIZE = screen_width // GRID_SIZE# 创建网格
grid = [[random.choice(COLORS) for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]# 选中的方块
selected = Nonedef draw_grid():for row in range(GRID_SIZE):for col in range(GRID_SIZE):# 绘制方块pygame.draw.rect(screen, grid[row][col], (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))# 绘制边框pygame.draw.rect(screen, BLACK, (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 1)# 如果有方块被选中,绘制高亮边框if selected:row, col = selectedpygame.draw.rect(screen, WHITE, (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 3)def get_clicked_pos(pos):x, y = posreturn y // BLOCK_SIZE, x // BLOCK_SIZEdef is_adjacent(pos1, pos2):row1, col1 = pos1row2, col2 = pos2return abs(row1 - row2) + abs(col1 - col2) == 1def check_matches():matches = set()# 检查水平匹配for row in range(GRID_SIZE):for col in range(GRID_SIZE-2):if (grid[row][col] == grid[row][col+1] == grid[row][col+2] and grid[row][col] is not None):matches.update([(row, col), (row, col+1), (row, col+2)])# 检查垂直匹配for row in range(GRID_SIZE-2):for col in range(GRID_SIZE):if (grid[row][col] == grid[row+1][col] == grid[row+2][col] and grid[row][col] is not None):matches.update([(row, col), (row+1, col), (row+2, col)])return matchesdef remove_matches(matches):# 移除匹配的方块for row, col in matches:grid[row][col] = None# 方块下落for col in range(GRID_SIZE):empty_cells = []# 从下往上检查空格for row in range(GRID_SIZE-1, -1, -1):if grid[row][col] is None:empty_cells.append(row)elif empty_cells:# 将方块下移到最低的空位grid[empty_cells[0]][col] = grid[row][col]grid[row][col] = Noneempty_cells.pop(0)empty_cells.append(row)# 填充顶部空格for row in empty_cells:grid[row][col] = random.choice(COLORS)def main():global selectedrunning = Truescore = 0font = pygame.font.Font(None, 36)while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.MOUSEBUTTONDOWN:pos = get_clicked_pos(pygame.mouse.get_pos())if pos[0] < GRID_SIZE and pos[1] < GRID_SIZE: # 确保点击在网格内if selected is None:selected = poselse:if is_adjacent(selected, pos):# 交换方块row1, col1 = selectedrow2, col2 = posgrid[row1][col1], grid[row2][col2] = grid[row2][col2], grid[row1][col1]# 检查是否有匹配matches = check_matches()if matches:score += len(matches) * 10remove_matches(matches)else:# 如果没有匹配,换回来grid[row1][col1], grid[row2][col2] = grid[row2][col2], grid[row1][col1]selected = None# 持续检查和消除匹配matches = check_matches()if matches:score += len(matches) * 10remove_matches(matches)pygame.time.wait(200) # 添加短暂延迟使动画更流畅# 绘制游戏界面screen.fill(BLACK)draw_grid()# 显示分数score_text = font.render(f"分数: {score}", True, WHITE)screen.blit(score_text, (10, 10))pygame.display.flip()pygame.quit()if __name__ == "__main__":main()
游戏玩法
- 选择方块:点击第一个方块选中它(会显示白色边框)。
- 交换方块:点击相邻的第二个方块进行交换。
- 消除匹配:如果形成三个或更多相同颜色的连续方块,它们会被消除。
- 方块下落:上方的方块会下落填充空缺,顶部会生成新的随机方块。
- 得分:每消除一个方块得10分。
结论
通过这篇博文,我们学习了如何使用Pygame创建一个简单的消消乐游戏。你可以在此基础上继续扩展功能,比如添加音效、特殊方块、关卡系统等。希望这能激发你对游戏开发的兴趣!
相关文章:
使用Pygame创建一个简单的消消乐游戏
消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前,请确保已安装Pygame库。可以通过以下命…...
node.js基础学习-JWT登录鉴权(十四)
一、前言 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它本质上是一个字符串,由三部分组成:头部(Header)、载荷(Payload&am…...
AbutionGraph-时序向量图谱数据库-快速安装部署
运行环境 1)操作系统 最好是使用CentOS7或者Ubuntu18以上系统,不满足的话请升级系统内核gcc版本至8以上版本。 支持所有国产主流操作系统银河麒麟、统信OS、深度等等,均做过兼容性测试; 2)CPU 为确保数据库每个进…...
翻译质量差对电子课程用户体验的影响
电子学习改变了教育交付方式,使全球不同受众更容易获得课程。然而,随着这种学习模式的发展,对周到地本地化和翻译的需求也在增长。如果做得好,翻译可以弥合文化和语言分歧,创造无缝和包容的学习体验。然而,…...
PS的功能学习(修复、画笔)
混合器画笔工具 就像,电子毛笔 关键功能有两个,自带一个混合器色板 清理画笔是全清,换一支新的毛笔,执行完之后在判断是否载入画笔 载入画笔就是把前景色上的颜色进行叠加处理,重新混入当前的混合色 (…...
Android 使用 Canvas 和 Paint 实现圆形图片
学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …...
vxe-table 键盘操作,设置按键编辑方式,支持覆盖方式与追加方式
vxe-table 全键盘操作,按键编辑方式设置,覆盖方式与追加方式; 通过 keyboard-config.editMode 设置按键编辑方式;支持覆盖方式编辑和追加方式编辑 安装 npm install vxe-pc-ui4.3.15 vxe-table4.9.15// ... import VxeUI from v…...
BUUCTF Pwn [HarekazeCTF2019]baby_rop 题解
下载 checksec 64位 用IDA64打开 定位main函数 栈溢出漏洞 SHIFTF12的字符串看到了binsh 以及函数窗口有system 因为是64位 找到rdi传参和ret栈平衡 构造exp: from pwn import *#p process(./babyrop) p remote("node5.buuoj.cn", 27869)addr_prr 0…...
什么是封装性?C++ 中如何实现封装?封装性的好处是什么?
一、引言 在面向对象编程中,封装性是一个重要的概念。封装可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和安全性。本文将详细介绍什么是封装性,C 中如何实现封装以及封装性的好处。 二、什么是封装性? 封装…...
【MySQL】[42000][1071] Specified key was too long; max key length is 3072 bytes
问题描述 创建表时发生错误。 create table if not exists tbl_user(id int unsigned auto_increment comment 用户IDprimary key,username varchar(1023) not null comment 用户名,password varchar(1023) default 123456 …...
人工智能驱动的骗局会模仿熟悉的声音
由于人工智能技术的进步,各种现代骗局变得越来越复杂。 这些骗局现在包括人工智能驱动的网络钓鱼技术,即使用人工智能模仿家人或朋友的声音和视频。 诈骗者使用来自社交媒体的内容来制作深度伪造内容,要求提供金钱或个人信息。个人应该通过…...
实数与复数频谱掩蔽在音频分离中的应用
使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中,通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型:实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…...
C++算法练习-day62——491.非递减子序列
题目来源:. - 力扣(LeetCode) 题目思路分析 这个问题要求找出数组 nums 中的所有非严格递增子序列,其中每个子序列至少包含两个元素。非严格递增子序列意味着子序列中的元素可以相等,但不允许递减。 为了解决这个问…...
golang实现单例日志对象
原文地址:golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包,通过设置和修改都能实现日志轮转和自定义日志格式。例如:log、zap、golog、slog、log4go 等等。 …...
Redis——个人笔记留存
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是…...
c# Grpc取消
net6.0 通过CancellationTokenSource 客户端取消Grpc,服务端判断 IsCancellationRequested 是否取消。 proto: syntax "proto3";// 引用可空类型 import "google/protobuf/wrappers.proto";option csharp_namespace "Grpc.Common"…...
Flask 是什么?
近期开发chatbot 程序,过程中要使用Flask,所以收集资料记录这个套件的信息: Flask 是什么? Flask 是一个轻量级、模块化的 Python Web 框架,用于构建 Web 应用程序和 API。它被设计为简单、灵活且可扩展,…...
智能合约
06-智能合约 0 啥是智能合约? 定义 智能合约,又称加密合约,在一定条件下可直接控制数字货币或资产在各方之间转移的一种计算机程序。 角色 区块链网络可视为一个分布式存储服务,因为它存储了所有交易和智能合约的状态 智能合约还…...
【机器学习】分类器
在机器学习(Machine Learning,ML)中,分类器泛指算法或模型,用于将输入数据分为不同的类别或标签。分类器是监督学习的一部分,它依据已知的数据集中的特征和标签进行训练,并根据这些学习到的知识对新的未标记数据进行分…...
ASP 快速参考
ASP 快速参考 概述 ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于动态生成交互性网页。它允许开发者结合HTML、VBScript或JScript脚本语言来创建和运行动态网页或Web应用程序。本快速参考将提供ASP的基础知识、常用内置…...
支持向量机算法:原理、实现与应用
摘要: 本文深入探讨支持向量机(Support Vector Machine,SVM)算法,详细阐述其原理、数学模型、核函数机制以及在分类和回归问题中的应用方式。通过以 Python 和 C# 为例,展示 SVM 算法在不同编程环境下的具体…...
蓝桥杯分治
P1226 【模板】快速幂 题目描述 给你三个整数 𝑎,𝑏,𝑝a,b,p,求 𝑎𝑏 mod 𝑝abmodp。 输入格式 输入只有一行三个整数,分别代表 𝑎,𝑏,𝑝a,b,p。…...
群控系统服务端开发模式-应用开发-邮件工厂结构封装
首先在系统根目录下extend文件夹下创建邮件工厂文件夹并更名叫Mail。 一、邮件发送父类 在Mail目录下创建邮件发送父类并更名为MailSenderInterface.php,代码如下 <?php /*** 邮件发送父类* User: 龙哥三年风水* Date: 2024/12/5* Time: 14:22*/ namespace Ma…...
COCO数据集理解
COCO(Common Objects in Context)数据集是一个用于计算机视觉研究的广泛使用的数据集,特别是在物体检测、分割和图像标注等任务中。COCO数据集由微软研究院开发,其主要特点包括: 丰富的标签:COCO数据集包含…...
数据结构与算法学习笔记----堆
数据结构与算法学习笔记----堆 author: 明月清了个风 first publish time: 2024.12.2 revised: 2024.12.3 - 例题标题错误,已修改。 ps⛹从这里开始调整了文章结构,先讲解算法和数据结构基本原理,再给出例题,针对例题中的应用再…...
在玩“吃鸡”的时候游戏崩溃要如何解决?游戏运行时崩溃是什么原因?
“吃鸡”游戏崩溃问题深度解析与解决方案:原因、修复与预防 在紧张刺激的“吃鸡”(即《绝地求生》)游戏中,突然遭遇游戏崩溃无疑会让玩家倍感沮丧。作为一名经验丰富的软件开发从业者,我深知游戏崩溃可能由多种因素引…...
AndroidAutoSize实战教程:今日头条屏幕适配方案详解
如何在项目中结合 AndroidAutoSize 来进行今日头条屏幕适配,我会具体讲解如何用 AndroidAutoSize 实现屏幕适配,并结合 Kotlin 代码举例分析。 通过 AndroidAutoSize 库来实现屏幕适配,确保在不同的屏幕尺寸、分辨率、密度下,应用…...
学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 贴图 二、…...
图生3d 图生全景 学习笔记
目录 Aluciddreamer ZoeDepth 会自动下载模型: 图生全景图SD-T2I-360PanoImage: Aluciddreamer GitHub - luciddreamer-cvlab/LucidDreamer: Official code for the paper "LucidDreamer: Domain-free Generation of 3D Gaussian Splatting Sce…...
Delphi 实现键盘模拟、锁定键盘,锁定鼠标等操作
Delphi 模拟按键的方法 SendMessageA 说明: 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回SendMessage所包含4个参数: 1. hwnd 32位的窗口句柄窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数…...
6. 一分钟读懂“抽象工厂模式”
6.1 模式介绍 书接上文,工厂方法模式只能搞定单一产品族,遇到需要生产多个产品族时就歇菜了。于是,在需求的“花式鞭策”下,程序员们再次绷紧脑细胞,创造出了更强大的抽象工厂模式,让工厂一次性打包多个产品…...
(四)lerobot开源项目的主从臂的远程操作(带相机)(操作记录)
目录 《项目简介》 一、B站视频参考(推荐) 二、确定两个usb相机的端口号 三、远程操作(带相机) 四、遇到问题 《项目简介》 项目地址:GitHub - huggingface/lerobot: 🤗 LeRobot: Making AI for Ro…...
离线安装ollama到服务器
搜了很多教程不满意,弄了半天才弄好,这里记录下,方便以后的人用,那个在线下载太慢,怕不是得下载到明年。 一.从官网下在liunx版的tgz安装包 Releases ollama/ollama (github.com) 查看自己的服务器信息(参考 https:/…...
Vue前端开发-多级路由配置
在Vue 路由数组中,允许配置多级的路由对象结构,可以是二级、三级或者更多级别,最大级别原则上没有限制,但通常最大的是三或四级,这种路由结构,称之为多级路由。 例如:一级路由地址/list&#x…...
Yocto bitbake and codeSonar
1 mdm 1.1 屏蔽mdm sysvinit的console输出 - uboot传入参数的时候传入consolenull,这样Linux启动信息没有了 - 还需要在Linux配置中去掉Support for console on AMBA serial port - 文件系统/etc/inittab文件里注释掉::respawn:/sbin/getty -L ttyS000 115200 vt100…...
sheng的学习笔记-【中】【吴恩达课后测验】Course 5 -序列模型 - 第二周测验 - 自然语言处理与词嵌入
课程5_第2周_测验题 目录 第一题 1.假设你为10000个单词学习词嵌入,为了捕获全部范围的单词的变化以及意义,那么词嵌入向量应该是10000维的。 A. 【 】正确 B. 【 】错误 答案: B.【 √ 】错误 第二题 2.什么是t-SNE?…...
数字图像处理内容详解
1.对比度 最大亮度 / 最小亮度 2.邻域 m邻接:对于像素p和q,如果p和q四临接,或p和q八临接且两者的四邻域的交集为空 通路:如果俩点全部是K邻接(K代表4,8,m),则说明存在K…...
python通过ODBC连接神通数据库
1、安装神通数据库 2、安装python 3、安装pyodbc pip3 install pyodbc-5.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 注:pyodbc要和python版本相对应 4、安装unixodbc 5、配置神通数据库ODBC数据源 6、示例代码如下 #!/usr/bin/python…...
QNX的PPS发布/订阅模型
参考资料: QNX官方文档 以下摘自官网介绍: TheQNX NeutrinoPersistent Publish/Subscribe (PPS) service is a small, extensible publish/subscribe service that offers persistence across reboots. It’s designed to provide a simple and easy-to-use solution for b…...
Ubuntu——extrepo添加部分外部软件源
extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具,它的主要作用是简化和管理外部软件源(repositories)的添加和更新。通过使用 extrepo,用户可以方便地添加、删除和管理第三方软件源,而不需要手动编辑源列表…...
java基础教程第16篇( 正则表达式)
Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 Java 提供了 java.util.regex 包,它包含了 Pattern 和 Matcher 类,用于处理正…...
【Shell 脚本实现 HTTP 请求的接收、解析、处理逻辑】
以下是一个实现客户端对 Shell HTTP 服务发起 POST 请求并传入 JSON 参数的完整示例。Shell 服务会解析收到的 JSON 数据,根据内容执行操作。 服务端脚本:http_server.sh 以下脚本使用 netcat (nc) 来监听 HTTP 请求,并通过 jq 工具解析 JSO…...
Leetcode 每日一题 290.单词规律
目录 一、问题分析 二、解题思路 三、代码实现 四、复杂度分析 五、总结 在编程的世界里,我们常常会遇到各种有趣的字符串匹配问题。今天要探讨的就是这样一个问题:给定一种规律 pattern 和一个字符串 s,判断 s 是否遵循与 pattern 相同…...
图像滤波和卷积的不同及MATLAB应用实例
滤波与卷积在图像处理中都是非常重要的运算,但它们有着明显的区别。以下是滤波与卷积的主要不同点,并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的: 1)滤波:滤波是一种信…...
【AI模型对比】AI新宠Kimi与ChatGPT的全面对比:技术、性能、应用全揭秘
文章目录 Moss前沿AI技术背景Kimi人工智能的技术积淀ChatGPT的技术优势 详细对比列表模型研发Kimi大模型的研发历程ChatGPT的发展演进 参数规模与架构Kimi大模型的参数规模解析ChatGPT的参数体系 模型表现与局限性Kimi大模型的表现ChatGPT的表现 结论:如何选择适合自…...
详细解读CMA实验室认可
CMA实验室认可,即中国计量认证(China Metrology Accreditation)的实验室资质认定,以下是对其的详细解读: 一、定义与目的 CMA认证是经省级以上人民政府计量行政部门对实验室的计量检定、测试能力和可靠性考核合格后进…...
H5与支付宝小程序通信,调起扫一扫
1.public/index.html加入代码 <script>if (navigator.userAgent.indexOf(AliApp) > -1) {document.writeln(<script src"https://appx/web-view.min.js" > < / script>);}window.$my my </script>2.vue其他具体页面加入代码 metho…...
Lighthouse(灯塔)—— Chrome 浏览器性能测试工具
1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具,用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈,并基于优化建议进行改进。 核心功能&…...
深入浅出机器学习中的梯度下降算法
大家好,在机器学习中,梯度下降算法(Gradient Descent)是一个重要的概念。它是一种优化算法,用于最小化目标函数,通常是损失函数。梯度下降可以帮助找到一个模型最优的参数,使得模型的预测更加准…...
AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!
AIGC 012-Video LDM-Stable Video diffusion前身,将LDM扩展到视频生成任务! 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者,作者在SD的架构上进行扩展,实现了视频的生成。后续在Vid…...