使用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库。可以通过以下命…...
证明直纹面是可展曲面沿着直母线,曲面的切平面不变
目录 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线,曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线,曲面的切平面不变. 证明:设直纹面 S S S的参数式为 r ( u …...
Chrome控制台 网站性能优化指标一览
打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页,可以看到从输入url到页面资源请求并加载网页,用于查看资源加载,接口请求,评估网页、网站性能等,如下图: request、stransferred、resour…...
Typora创建markdwon文件的基础语法
标题的创建 使用#空格xxx 可使xxx为标题,同时第一标题为#空格标题;第二标题为##空格标题2。以此类推最多可创建六个标题。 同时按住Ctrl1可创建第一标题,同时按住Ctrl2可创建第二标题,以此类推,最多可创建六个标题。也…...
《嵌入式硬件设计》
一、引言 嵌入式系统在现代科技中占据着至关重要的地位,广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础,直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面ÿ…...
【AIGC】大模型面试高频考点-位置编码篇
【AIGC】大模型面试高频考点-位置编码篇 (一)手撕 绝对位置编码 算法(二)手撕 可学习位置编码 算法(三)手撕 相对位置编码 算法(四)手撕 Rope 算法(旋转位置编码…...
如何使用 SQL 语句创建一个 MySQL 数据库的表,以及对应的 XML 文件和 Mapper 文件
文章目录 1、SQL 脚本语句2、XML 文件3、Mapper 文件4、启动 ServiceInit 文件5、DataService 文件6、ComplianceDBConfig 配置文件 这个方式通常是放在项目代码中,使用配置在项目的启动时创建表格,SQL 语句放到一个 XML 文件中。在Spring 项目启动时&am…...
Unity性能优化---动态网格组合(二)
在上一篇中,组合的是同一个材质球的网格,如果其中有不一样的材质球会发生什么?如下图: 将场景中的一个物体替换为不同的材质球 运行之后,就变成了相同的材质。 要实现组合不同材质的网格步骤如下: 在父物体…...
JVM学习《垃圾回收算法和垃圾回收器》
目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些? 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…...
GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
什么是TCP的三次握手
TCP(传输控制协议)的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据,并且初始化双方的序列号。以下是三次握手的详细步骤: 第一次握手(SYN)&…...
《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024
摘要 这篇论文介绍了S2VNet,这是一个用于医学图像分割的通用框架,它通过切片到体积的传播(Slice-to-Volume propagation)来统一自动(AMIS)和交互式(IMIS)医学图像分割任务。S2VNet利…...
Linux ifconfig ip 命令详解
简介 ifconfig 和 ip 命令用于配置和显示 Linux 上的网络接口。虽然 ifconfig 是传统工具,但现在已被弃用并被提供更多功能的 ip 命令取代。 ifconfig 安装 sudo apt install net-toolssudo yum install net-tools查看所有活动的网络接口 ifconfig启动/激活网络…...
Vue3 对于echarts使用 v-show,导致显示不全,宽度仅100px,无法重新渲染的问题
参考链接:解决Echarts图表使用v-show,显示不全,宽度仅100px的问题_echarts v-show图表不全-CSDN博客 Vue3 echarts v-show无法重新渲染的问题_v-show echarts不渲染-CSDN博客 原因不多赘述了,大概就是v-show 本身是结构已经存在,当数据发生…...
C++实现俄罗斯方块
俄罗斯方块 还记得俄罗斯方块吗?相信这是小时候我们每个人都喜欢玩的一个小游戏。顾名思义,俄罗斯方块自然是俄罗斯人发明的。这人叫阿列克谢帕基特诺夫。他设置这个游戏的规则是:由小方块组成的不同形状的板块陆续从屏幕上方落下来…...
鸿蒙分享:添加模块,修改app名称图标
新建公共模块common 在entry的oh-package.json5添加dependencies,引入common模块 "dependencies": {"common": "file:../common" } 修改app名称: common--src--resources--string.json 新增: {"name&q…...
扫描IP段内的使用的IP
扫描IP段内的使用的IP 方法一:命令行 命令行进入 for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.3.%iarp -a方法二:python from scapy.all import ARP, Ether, srp import keyboarddef scan_network(ip_range):# 创建一个ARP请求包arp ARP(pds…...
【专题】虚拟存储器
前文提到的存储器管理方式有一个共同的特点,即它们都要求将一个作业全部装入内存后方能运行。 但有两种特殊情况: 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行&#…...
Python之爬虫入门--示例(2)
一、Requests库安装 可以使用命令提示符指令直接安装requests库使用 pip install requests 二、爬取JSON数据 (1)、点击网络 (2)、刷新网页 (3)、这里有一些数据类型,选择全部 (…...
5G CPE终端功能及性能评测(四)
5G CPE 功能性能评测 本文选取了几款在工业应用领域应用较多的5G CPE,对其功能和性能进行了对比评测。功能方面主要对比了网络接口数量,VPN功能 支持情况。以下测试为空口测试,测试结果受环境影响较大,性能仅供参考。总体看,高通X55芯片下行最优,速率稳定。 功能 对比CPE…...
CANN/asc-devkit bfloat16精度转换函数
__float22bfloat162_rd 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://…...
《Windows Sysinternals实战指南》VMMap 学习笔记(8.8):恢复默认视图、清理环境与分析后“归零”技巧
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
本地视频怎么去水印?2026最全去水印方法与软件推荐
如果你经常从各个视频平台保存视频素材,水印问题往往让人头疼。本地视频上的水印可能是平台logo、主播昵称、或者其他标识。今天就为你盘点本地视频去水印的多种方法,以及2026年最实用的去水印软件推荐,助你快速解决视频水印困扰。 本地视频去…...
STM32F103 平行替代方案全面分析(2026 年最新)
STM32F103 作为全球最经典的 Cortex-M3 MCU,凭借成熟的生态和广泛的应用基础统治了中低端嵌入式市场十余年。但近年来受国际供应链波动影响,其价格持续走高(2026 年 5 月 STM32F103C8T6 批量价约 8-12 元,部分型号甚至超过 20 元&…...
初识C语言(一)
C语言的介绍 计算机语言 C语言是通用的计算机编程语言,广泛应用于底层开发(操作系统及以下)。 计算机语言可以分为三大类: 机器语言(二进制,可直接被机器识别)汇编语言(用助记符来…...
告别黑白日志!用Xshell正则高亮集,让服务器报错、成功信息一目了然
告别黑白日志!用Xshell正则高亮集,让服务器报错、成功信息一目了然 在运维和开发人员的日常工作中,与服务器打交道是家常便饭。无论是查看系统日志、调试应用程序,还是执行自动化脚本,我们都需要面对大量的命令行输出信…...
保姆级教程:在群晖DSM 7.2上为虚幻引擎5项目配置Perforce Helix Core(附TypeMap避坑清单)
群晖DSM 7.2上为虚幻引擎5配置Perforce Helix Core全指南 对于独立游戏开发者和小型工作室来说,版本控制系统是项目管理的基石。Perforce Helix Core以其卓越的大文件处理能力,成为虚幻引擎项目版本控制的首选方案。本文将手把手指导你在群晖NAS上搭建Pe…...
告别邮件测试烦恼:MailHog一站式解决方案让开发调试更高效
告别邮件测试烦恼:MailHog一站式解决方案让开发调试更高效 【免费下载链接】MailHog Web and API based SMTP testing 项目地址: https://gitcode.com/gh_mirrors/ma/MailHog 还在为测试邮件功能而烦恼吗?每次开发邮件发送模块时,你是…...
使用Python快速上手Taotoken实现你的第一个大模型对话
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Python快速上手Taotoken实现你的第一个大模型对话 对于刚接触大模型API的Python开发者而言,最直接的入门方式就是编…...
SegFormer凭什么不用位置编码?深入拆解Mix-FFN与重叠Patch Merging的设计哲学
SegFormer革命性设计:为何抛弃位置编码仍能称霸语义分割? 在视觉Transformer的浪潮中,SegFormer以其独特的设计哲学脱颖而出——它大胆摒弃了传统Transformer中视为标配的位置编码(Positional Encoding),却…...
