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

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。

准备工作

在开始之前,请确保已安装Pygame库。可以通过以下命令安装:

pip install pygame

游戏设计

我们的游戏将包括以下几个部分:

  1. 初始化Pygame:设置游戏窗口和基本参数。
  2. 创建网格:生成一个随机颜色的方块网格。
  3. 实现交换和消除功能:允许玩家点击交换方块,并检测和消除匹配的方块。
  4. 更新游戏状态:处理方块下落和新方块生成。
  5. 显示分数:记录玩家的得分。

代码实现

以下是完整的代码实现:

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

游戏玩法

  1. 选择方块:点击第一个方块选中它(会显示白色边框)。
  2. 交换方块:点击相邻的第二个方块进行交换。
  3. 消除匹配:如果形成三个或更多相同颜色的连续方块,它们会被消除。
  4. 方块下落:上方的方块会下落填充空缺,顶部会生成新的随机方块。
  5. 得分:每消除一个方块得10分。

结论

通过这篇博文,我们学习了如何使用Pygame创建一个简单的消消乐游戏。你可以在此基础上继续扩展功能,比如添加音效、特殊方块、关卡系统等。希望这能激发你对游戏开发的兴趣!

相关文章:

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏&#xff0c;玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块&#xff0c;从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前&#xff0c;请确保已安装Pygame库。可以通过以下命…...

证明直纹面是可展曲面沿着直母线,曲面的切平面不变

目录 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线&#xff0c;曲面的切平面不变. 证明&#xff1a;设直纹面 S S S的参数式为 r ( u …...

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…...

Typora创建markdwon文件的基础语法

标题的创建 使用#空格xxx 可使xxx为标题&#xff0c;同时第一标题为#空格标题&#xff1b;第二标题为##空格标题2。以此类推最多可创建六个标题。 同时按住Ctrl1可创建第一标题&#xff0c;同时按住Ctrl2可创建第二标题&#xff0c;以此类推&#xff0c;最多可创建六个标题。也…...

《嵌入式硬件设计》

一、引言 嵌入式系统在现代科技中占据着至关重要的地位&#xff0c;广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础&#xff0c;直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面&#xff…...

【AIGC】大模型面试高频考点-位置编码篇

【AIGC】大模型面试高频考点-位置编码篇 &#xff08;一&#xff09;手撕 绝对位置编码 算法&#xff08;二&#xff09;手撕 可学习位置编码 算法&#xff08;三&#xff09;手撕 相对位置编码 算法&#xff08;四&#xff09;手撕 Rope 算法&#xff08;旋转位置编码&#xf…...

如何使用 SQL 语句创建一个 MySQL 数据库的表,以及对应的 XML 文件和 Mapper 文件

文章目录 1、SQL 脚本语句2、XML 文件3、Mapper 文件4、启动 ServiceInit 文件5、DataService 文件6、ComplianceDBConfig 配置文件 这个方式通常是放在项目代码中&#xff0c;使用配置在项目的启动时创建表格&#xff0c;SQL 语句放到一个 XML 文件中。在Spring 项目启动时&am…...

Unity性能优化---动态网格组合(二)

在上一篇中&#xff0c;组合的是同一个材质球的网格&#xff0c;如果其中有不一样的材质球会发生什么&#xff1f;如下图&#xff1a; 将场景中的一个物体替换为不同的材质球 运行之后&#xff0c;就变成了相同的材质。 要实现组合不同材质的网格步骤如下&#xff1a; 在父物体…...

JVM学习《垃圾回收算法和垃圾回收器》

目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些&#xff1f; 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…...

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

什么是TCP的三次握手

TCP&#xff08;传输控制协议&#xff09;的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据&#xff0c;并且初始化双方的序列号。以下是三次握手的详细步骤&#xff1a; 第一次握手&#xff08;SYN&#xff09;&…...

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…...

Linux ifconfig ip 命令详解

简介 ifconfig 和 ip 命令用于配置和显示 Linux 上的网络接口。虽然 ifconfig 是传统工具&#xff0c;但现在已被弃用并被提供更多功能的 ip 命令取代。 ifconfig 安装 sudo apt install net-toolssudo yum install net-tools查看所有活动的网络接口 ifconfig启动/激活网络…...

Vue3 对于echarts使用 v-show,导致显示不全,宽度仅100px,无法重新渲染的问题

参考链接&#xff1a;解决Echarts图表使用v-show,显示不全,宽度仅100px的问题_echarts v-show图表不全-CSDN博客 Vue3 echarts v-show无法重新渲染的问题_v-show echarts不渲染-CSDN博客 原因不多赘述了&#xff0c;大概就是v-show 本身是结构已经存在&#xff0c;当数据发生…...

C++实现俄罗斯方块

俄罗斯方块 还记得俄罗斯方块吗&#xff1f;相信这是小时候我们每个人都喜欢玩的一个小游戏。顾名思义&#xff0c;俄罗斯方块自然是俄罗斯人发明的。这人叫阿列克谢帕基特诺夫。他设置这个游戏的规则是&#xff1a;由小方块组成的不同形状的板块陆续从屏幕上方落下来&#xf…...

鸿蒙分享:添加模块,修改app名称图标

新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&#xff1a; common--src--resources--string.json 新增&#xff1a; {"name&q…...

扫描IP段内的使用的IP

扫描IP段内的使用的IP 方法一&#xff1a;命令行 命令行进入 for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.3.%iarp -a方法二&#xff1a;python from scapy.all import ARP, Ether, srp import keyboarddef scan_network(ip_range):# 创建一个ARP请求包arp ARP(pds…...

【专题】虚拟存储器

前文提到的存储器管理方式有一个共同的特点&#xff0c;即它们都要求将一个作业全部装入内存后方能运行。 但有两种特殊情况&#xff1a; 有的作业很大&#xff0c;其所要求的内存空间超过了内存总容量&#xff0c;作业不能全部被装入内存&#xff0c;致使该作业无法运行&#…...

Python之爬虫入门--示例(2)

一、Requests库安装 可以使用命令提示符指令直接安装requests库使用 pip install requests 二、爬取JSON数据 &#xff08;1&#xff09;、点击网络 &#xff08;2&#xff09;、刷新网页 &#xff08;3&#xff09;、这里有一些数据类型&#xff0c;选择全部 &#xff08…...

5G CPE终端功能及性能评测(四)

5G CPE 功能性能评测 本文选取了几款在工业应用领域应用较多的5G CPE,对其功能和性能进行了对比评测。功能方面主要对比了网络接口数量,VPN功能 支持情况。以下测试为空口测试,测试结果受环境影响较大,性能仅供参考。总体看,高通X55芯片下行最优,速率稳定。 功能 对比CPE…...

人工智能驱动的骗局会模仿熟悉的声音

由于人工智能技术的进步&#xff0c;各种现代骗局变得越来越复杂。 这些骗局现在包括人工智能驱动的网络钓鱼技术&#xff0c;即使用人工智能模仿家人或朋友的声音和视频。 诈骗者使用来自社交媒体的内容来制作深度伪造内容&#xff0c;要求提供金钱或个人信息。个人应该通过…...

电子病历静态数据脱敏路径探索

一、引言 数据脱敏&#xff08;Data Masking&#xff09;&#xff0c;屏蔽敏感数据&#xff0c;对某些敏感信息&#xff08;比如patient_name、ip_no、ad、no、icd11、drug等等 &#xff09;通过脱敏规则进行数据的变形&#xff0c;实现隐私数据的可靠保护。电子病历作为医疗领…...

混合云策略在安全领域受到青睐

Genetec 发布了《2025 年物理安全状况报告》&#xff0c;该报告根据超过 5,600 名该领域领导者&#xff08;其中包括 100 多名来自澳大利亚和新西兰的领导者&#xff09;的回应&#xff0c;揭示了物理安全运营的趋势。 报告发现&#xff0c;澳大利亚和新西兰的组织采用混合云策…...

Echarts使用平面方法绘制三维立体柱状图表

目录 一、准备工作 1.下载引入ECharts库 2.创建容器 二、绘制基本柱状 三、绘制立体柱状方法一 1.定义立方体形状 2.注册立方体形状 3.配置custom系列 4.设置数据 5.渲染图表 四、绘制立体柱状方法二 1.画前知识 2.计算坐标renderItem 函数 &#xff08;1&#x…...

java-判断语句

题目一&#xff1a;选择练习1 657. 选择练习1 - AcWing题库 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.nextInt(), b sc.nextInt();int c sc.nextInt(), d sc.nextInt();…...

11.14【JAVA EXP3】【DEBUG】

比较疑惑的一点是当前页面&#xff08;资源的url)与请求的url? 请求的url由webService接收&#xff0c;servelt当中也可以发送出这个url 进行页面跳转&#xff0c;是跳转到某个Jsp页面&#xff0c;这个页面的url是在哪里定义的&#xff1f; 在Jsp打印信息&#xff0c;这个报…...

UE5 和 UE4 中常用的控制台命令总结

调用控制台 按下键盘上的 ~ 键可以调用控制台命令。 技巧 使用键盘的 ↑ 键可以查看之前输入过的指令。控制台指令并不需要打全名&#xff0c;输入空格后跟随指令的部分字符可以进行模糊搜索。按下 Ctrl Shift , 打开 GPUProfile 面板。 命令如下&#xff1a; 调试类 s…...

MR30分布式IO模块赋能喷水织机

纺织行业作为我国传统支柱产业&#xff0c;历经数千年的演变&#xff0c;如今仍面临着诸多困境&#xff0c;在纺织行业中&#xff0c;每一次技术的飞跃都是对行业边界的勇敢探索。在纺织行业&#xff0c;喷水织机作为关键生产设备&#xff0c;其性能直接影响到产品质量和产能。…...

C++中的封装性

定义&#xff1a; 封装性&#xff1a; 1.将属性&#xff08;成员变量&#xff09;和行为&#xff08;成员函数&#xff09;作为一个整体&#xff0c;表现在生活中的事物 2.将属性和行为加以权限控制 &#xff08;将事物的属性&#xff08;成员变量&#xff09;和行为&#…...

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具

PyTorch 深度学习框架简介&#xff1a;灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架&#xff0c;以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验&#xff0c;还是在工业界构建生产级的深度学习模型&#xff0c;PyTorch 都能提供所需的工具和…...