使用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…...
KRaft VS RocketMQ NameServer
Kafka KRaft 和 RocketMQ NameServer 是两大消息队列用于元数据/路由管理的核心组件,但设计哲学完全不同:KRaft 是强一致的共识集群(CP),NameServer 是无状态的分布式路由表(AP)。下面从架构、原理、优缺点、选型做全面对比。 一、核心定位与本质区别 Kafka KRaft 定位…...
从野火官方手册到实战:我的RK3568 NPU开发环境搭建全记录(含conda虚拟环境管理心得)
从野火官方手册到实战:我的RK3568 NPU开发环境搭建全记录(含conda虚拟环境管理心得) 作为一名长期在边缘计算领域折腾的开发者,最近终于有机会上手Rockchip的RK3568芯片。这款芯片内置的NPU(神经网络处理单元ÿ…...
SAP销售订单BAPI调用避坑指南:手把手教你处理增强字段、合作伙伴与定价(附完整ABAP代码)
SAP销售订单BAPI实战:增强字段、合作伙伴与定价的深度解决方案 当你第一次调用SD_SALESDOCUMENT_CREATE创建销售订单时,可能会遇到这样的场景:订单看似创建成功,但增强字段没值、合作伙伴角色错乱、定价条件未生效。这种"表…...
基于朴素贝叶斯分类算法的收入预测:Python 数据挖掘项目实战
数据挖掘项目python--基于朴素贝叶斯分类算法的收入预测 项目流程:数据分析训练朴素贝叶斯分类器两个方案实现(pycharmjupyter) 包含内容:数据集代码(pycharmjupyter)文档在数据挖掘领域,预测任…...
用风水学重构代码:周易卦象优化系统架构
在软件工程领域,系统架构的优化与性能调优一直是技术专家们不懈探索的核心课题。传统的优化思路往往聚焦于算法效率、资源调度、中间件配置等技术维度。然而,一个更具颠覆性的视角正在悄然兴起:将源自古老东方智慧的《周易》卦象体系…...
网络钓鱼攻击特征识别与多维度防御技术研究
摘要 网络钓鱼是当前最普遍、危害最突出的网络安全威胁类型,攻击者依托伪造邮件、短信、社交信息与虚假网站,结合社会工程学手段诱导用户泄露敏感数据或执行恶意操作,对个人信息安全与机构运行稳定构成持续威胁。本文以网络钓鱼攻击机理、典型…...
显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题
显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 核心关键词:显卡显…...
【CW32无线抄表项目】W25Q+CW32程序示例
资料下载: https://telesky.yuque.com/bdys8w/01/zr02y6vd0r7mnzcl?singleDoc# 参考仓库: https://gitee.com/Armink/SFUD 一、程序分析 硬件总线映射(引脚与时钟的“避坑点”) #define FLASH_SPIx CW_SPI2 // 注意&…...
Mod Loader:重新定义GTA系列模组管理的技术架构与实践指南
Mod Loader:重新定义GTA系列模组管理的技术架构与实践指南 【免费下载链接】modloader Mod Loader for GTA III, Vice City and San Andreas 项目地址: https://gitcode.com/gh_mirrors/mo/modloader 一、核心痛点解析:传统模组管理的三大技术瓶颈…...
百度网盘秒传链接网页工具终极指南:全平台免费极速转存方案
百度网盘秒传链接网页工具终极指南:全平台免费极速转存方案 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 还在为百度网盘资源分享的繁…...
