用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…

如何在Linux配置C、C++、Go语言的编译环境?

在 Linux 系统上配置 C、C、Go 语言的编译环境可以通过安装相应的编译器和相关工具来实现。以下是在 Linux 系统上配置这些语言的编译环境的一般步骤: 1. C 和 C 编译环境配置: 安装 GCC 编译器(一般 Linux 发行版都会包含)&…

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 创建…

在Redhat 7 Linux上安装llama.cpp [ 错误stdatomic.h: No such file or directory]

前期准备 在github上下载llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C ​ git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 执行make命令编译llama.cpp make 在huggingface里下载量化了的 gguf格式的llama2模型。 https:/…

每日一练:笔试题复盘-LeeCode原题-判断二叉树两数之和-->找到满足二叉树两数之和的所有路径

用Java实现&#xff0c;给定一个二叉树root和一个值 sum &#xff0c;找到从根节点到叶子节点的节点值之和等于 sum 的路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点&#xff0c;不能从子…

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…

JS值和引用

在javaScript中&#xff0c;数据类型整体上可以分为两大类&#xff1a;基本数据类型和引用数据类型 基本数据类型&#xff1a; string , symbol , number , boolean , undefined , null 引用数据类型&#xff1a; object 1.简单值&#xff08;原始值&#xff09; 由于简单…

职业生涯知识回顾-关于抽象类和接口的思考

抽象类和接口是两个很容易产生疑惑的概念&#xff0c;分不清它们的使用场景&#xff0c;其实只要记住两点就比较好理解&#xff1a; 接口是对行为的抽象抽象类是对子类有哪些属性和行为的抽象 当你需要对一个类有哪些行为进行约束时&#xff0c;使用接口&#xff1b;需要为其…

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 …