用python和pygame库实现刮刮乐游戏

用python和pygame库实现刮刮乐游戏

首先,确保你已经安装了pygame库。如果没有安装,可以通过以下命令安装:

pip install pygame

示例有两个。

一、简单刮刮乐游戏

准备两张图片,一张作为背景bottom_image.png,一张作为刮开的图片top_image.png:

请将bottom_image.png和top_image.png图片文件与游戏代码文件(.py文件)放在在同一目录下。

以下是简单刮刮乐游戏的代码:

import pygame
import os# 初始化pygame
pygame.init()# 设置游戏窗口
width, height = 356, 358
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('刮刮乐游戏')# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)# 确保图片文件存在
if not os.path.isfile('bottom_image.png') or not os.path.isfile('top_image.png'):raise Exception("图片文件未找到,请确保bottom_image.png和top_image.png文件在同一目录下。")# 加载图片
bottom_image = pygame.image.load('bottom_image.png').convert()
top_image = pygame.image.load('top_image.png').convert_alpha()# 调整图片大小以适应窗口
bottom_image = pygame.transform.scale(bottom_image, (width, height))
top_image = pygame.transform.scale(top_image, (width, height))# 创建一个与顶层图片相同大小的透明表面
scratch_surface = pygame.Surface((width, height), pygame.SRCALPHA)# 将顶层图片绘制到透明表面上
scratch_surface.blit(top_image, (0, 0))# 游戏主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 获取鼠标位置和状态mouse_pos = pygame.mouse.get_pos()mouse_pressed = pygame.mouse.get_pressed()# 如果按下鼠标左键,则在透明表面上绘制透明圆形,模拟刮开效果if mouse_pressed[0]:  # 检测鼠标左键是否按下pygame.draw.circle(scratch_surface, (0, 0, 0, 0), mouse_pos, 20)# 绘制背景图片screen.blit(bottom_image, (0, 0))# 绘制刮开的透明表面screen.blit(scratch_surface, (0, 0))# 更新屏幕pygame.display.flip()# 退出游戏
pygame.quit()

运行效果:

二、多对图片的刮刮乐游戏

使用多对图片,准备了好了多对图片,如bottom1.png和top1.png 、 bottom2.png和top2.png 、 bottom2.png和top3.png,并将它们放到了img文件夹中。用户可以选择图对游戏,游戏过程中可按下ESC 键返回到菜单页开始重玩。

项目的目录(project_directory)结构如下:

源码如下:

import pygame
import os
import sys# 初始化pygame
pygame.init()# 设置游戏窗口
width, height = 356, 358
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('刮刮乐游戏(可选择图片对)')# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)# 图片对列表
image_pairs = [("img/bottom1.png", "img/top1.png"),("img/bottom2.png", "img/top2.png"),("img/bottom3.png", "img/top3.png")
]# 加载图片
def load_images(pair_index):bottom_image_path, top_image_path = image_pairs[pair_index]bottom_image = pygame.image.load(bottom_image_path).convert()top_image = pygame.image.load(top_image_path).convert_alpha()bottom_image = pygame.transform.scale(bottom_image, (width, height))top_image = pygame.transform.scale(top_image, (width, height))return bottom_image, top_image# 游戏主函数
def run_game(bottom_image, top_image):scratch_surface = pygame.Surface((width, height), pygame.SRCALPHA)scratch_surface.blit(top_image, (0, 0))running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 检测键盘事件以返回菜单elif event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:  # 按下ESC键return  # 返回到菜单,而不是退出游戏mouse_pos = pygame.mouse.get_pos()mouse_pressed = pygame.mouse.get_pressed()if mouse_pressed[0]:pygame.draw.circle(scratch_surface, (0, 0, 0, 0), mouse_pos, 20)screen.blit(bottom_image, (0, 0))screen.blit(scratch_surface, (0, 0))pygame.display.flip()# 菜单函数
def menu():font = pygame.font.Font(None, 26)    menu_running = Truetext_surfaces = []text_rects = []for i, pair in enumerate(image_pairs):text = font.render(f"[ Image {i+1} ]", True, RED)text_rect = text.get_rect(topleft=(10, 40 + i * 30))text_surfaces.append(text)text_rects.append(text_rect)while menu_running:screen.fill(WHITE)text = font.render(f"Press Esc to return to the menu:", True, BLACK)text_rect = text.get_rect(topleft=(10, 5))screen.blit(text, text_rect)for i, text in enumerate(text_surfaces):screen.blit(text, text_rects[i])pygame.display.flip()for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:  # Left clickfor i, rect in enumerate(text_rects):if rect.collidepoint(event.pos):bottom_image, top_image = load_images(i)run_game(bottom_image, top_image)# 在这里不需要设置menu_running = False,因为我们希望在游戏结束后自动返回菜单# 运行菜单
menu()

运行效果如下图所示:

用户可以单击菜单项选择图对游戏,游戏过程中可按下ESC 键返回到菜单页开始重玩。

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

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

相关文章

Leetcoder Day35| 动态规划part02

62.不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&#xff…

Android 显示系统框架

一.FrameBuffer FrameBuffer 介绍: FrameBuffer中文译名为帧缓冲驱动,它是出现在2.2.xx内核中的一种驱动程序接口。主设备号为29,次设备号递增。 Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能…

Day11:信息打点-Web应用企业产权指纹识别域名资产网络空间威胁情报

目录 Web信息收集工具 业务资产-应用类型分类 Web单域名获取-接口查询 Web子域名获取-解析枚举 Web架构资产-平台指纹识别 思维导图 章节知识点: Web:语言/CMS/中间件/数据库/系统/WAF等 系统:操作系统/端口服务/网络环境/防火墙等 应用…

dart中的事件队列与微任务

dart在每个事件循环中,会先执行同步任务代码,然后分别检查两个任务队列:微任务队列和事件队列。dart总是先执行微任务队列中的代码,然后才是事件队列中的代码。当两个队列中的任务都执行完成后,线程进入休眠状态&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候,打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因: 修bug,改来改去遇到了以下两种页面: 此时http://127.0.0.1:7860可以如下正常显示: 查资料的时候找…

vue+springboot项目部署服务器

项目仓库:vuespringboot-demo: vuespringboot增删改查的demo (gitee.com) ①vue中修改配置 在public文件夹下新建config.json文件: {"serverUrl": "http://localhost:9090"//这里localhost在打包后记得修改为服务器公网ip } 然后…

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置浏览器不缓存文件 每次都会从服务器 请求新的文件

目录 解决问题方法说明 测试html环境js环境第一步然后修改内容 打开带有js缓存的页面强制刷新 配置nginx 每次打开页面都会重新请求index.js 文件重启nginx再次修改index.js 总结设置为全局 解决问题 适用于实时更新数据的&#xff0c;网页 可以让用户每次都是重新请求&#x…

C语言中的套娃——函数递归

目录 一、什么是递归 1.1.递归的思想 1.2.递归的限制条件 二、举例体会 2.1.求n的阶乘 2.2.顺序打印整数的每一位 2.3.斐波那契数列 三、递归与迭代 一、什么是递归 在学习C语言的过程中&#xff0c;我们经常会跟递归打交道&#xff0c;什么是递归呢&#xff1f;它其实…

LNMP 架构

环境准备&#xff1a;lnmp 需要安装 nginx mysql php 论坛/博客 软件 使用LNMP架构搭建 论坛 1. 关闭防火墙和和核心防护 systemctl disable --now firewalld setenforce 0 2. 编译安装 nginx 安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 创建…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源码链接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

#WEB前端(表单)

1.实验&#xff1a; form、input、label 登录界面&#xff0c;表单填写界面 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

RedisTemplate中opaForValue.set的注意之处

问题 原本写了一个小项目&#xff0c;想通过redis缓存实现登录退出功能&#xff0c;结果出现了莫名奇妙的问题 代码如下&#xff1a; 报错&#xff1a; 经过多次调试之后我发现是opsForValue.set(key,value,expireTime)这行代码的问题&#xff0c;没有指定过期时间的单位&…

备战蓝桥杯---动态规划之悬线法

Em...属于一知道就会&#xff0c;不知道的话比较难想。 我们先看题&#xff1a; 我们不妨把1抽象成一个平面上的点&#xff0c;因此可以变成这一幅图&#xff1a; 我们假设每一个点被向上牵拉了一根线&#xff1a; 显然&#xff0c;每一条悬线都有可能成为边界限制&#xff0c…

Bulingbuling - 《历史的教训》 [ The Lessons of History ]

《历史的教训》 两位当代最伟大思想家的著名论文集&#xff0c;汇集了 5000 多年的历史 作者&#xff1a;威尔-杜兰特和阿里尔-杜兰特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

Siamrpn++论文中文翻译(详细!)

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks SiamRPN&#xff1a;具有非常深度网络的Siamese视觉跟踪的进化 【siamrpn论文地址】 https://arxiv.org/abs/1812.11703 摘要 基于Siamese网络的跟踪器将跟踪表示为目标模板和搜索区域之间的卷积特征…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前&#xff0c;数据应在一定时间内保持稳定&#xff0c;这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

基于springboot+vue的社区医院管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

chatgpt-3的文章生成器有哪些?可以批量生成文章的生成器

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;作为人工智能领域的一项重大突破&#xff0c;开启了新一代的文本生成技术。同时市面上也涌现出了一些GPT-3文章生成器&#xff0c;为用户提供了快速、高效地生成各种类型文章的工具。本文将介绍一些中国的GP…