用Python的Pygame包实现水果忍者小游戏

先上一下运行结果

长按鼠标左键出刀, 切割水果几分, 切割炸弹结束游戏, 漏掉的水果也会几分, 难度会随时间慢慢提高(水果的刷新频率变快)

初始化

帧率200帧/秒, 游戏窗口大小800×600

# 游戏设置
pygame.init()
FPS = 200
fpsClock = pygame.time.Clock()
WIDTH, HEIGHT = 800, 600
sur = pygame.display.set_mode((WIDTH, HEIGHT))
back = pygame.image.load('back2.jpg')
sur.blit(back, (0, 0))# 颜色资源
WHITE = (255, 255, 255)
RED  = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE  = (0, 0, 255)
BLACK = (0, 0, 0)
YELLOW = (255, 255, 0)
SILVER = (192, 192, 192)
GRAY = (169, 169, 169)
PURPLE = (127, 0, 255)
PINK = (255, 51, 153)
ORANGE = (255, 128, 0)
BROWN = (165, 42, 42)
LIGHTBLUE = (137, 207, 240)

基础变量

主要是一些语法糖, 图片导入, 和基本存储数据结构的定义, 后面会一一细说这些变量的作用

# 水果变量
MAXFRUIT = 10  # 同时存在的水果最多数量
SCORE = pygame.image.load('score.png')
ERROR = pygame.image.load('error.png')
APPLE, BANANA, PEACH, STRAWBERRY, WATERMELON = 'apple', 'banana', 'peach', 'strawberry', 'watermelon'
FRUIT = (APPLE, BANANA, PEACH, STRAWBERRY, WATERMELON)
# 导入水果图片
FRUIT_IMG = {BANANA:pygame.image.load('banana.png'), APPLE:pygame.image.load('apple.png'),PEACH:pygame.image.load('peach.png'), STRAWBERRY:pygame.image.load('strawberry.png'),WATERMELON:pygame.image.load('watermelon.png')}
# 导入切割水果图片
FRUITCUT_IMG = {BANANA: (pygame.image.load('banana1.png'), pygame.image.load('banana2.png')),APPLE: (pygame.image.load('apple1.png'), pygame.image.load('apple2.png')),PEACH: (pygame.image.load('peach1.png'), pygame.image.load('peach2.png')),STRAWBERRY: (pygame.image.load('strawberry1.png'), pygame.image.load('strawberry2.png')),WATERMELON: (pygame.image.load('watermelon2.png'), pygame.image.load('watermelon1.png'))}
FRUIT_SIZE = {BANANA:(126, 50), APPLE:(65, 65), PEACH:(62, 59), STRAWBERRY:(68, 72),WATERMELON:(97, 84)}  # 水果的尺寸
existfruit = 0  # 目前存在水果的数量
fruits = [False for _ in range(MAXFRUIT)]  # 当前存在的水果
cutfruits = [False for _ in range(MAXFRUIT*2)]  # 被切割的水果数组
cut_count = 0  # 已经切割水果的数量
error_count = 0  # 失误次数
boom = None  # 炸弹的信息
BOOMSIZE = (65, 67)  # 炸弹尺寸
points = []  # 刀痕的点存放数组# 水果类
class Afruit:sx, sy = 0, 0  # x和y的速度p, t = 0, 0  # 初始位置, 生成时间dis, img, fru = None, None, None    # 方向, 图片, 水果类型x, y = 0, 0  # 坐标def __init__(self, x, y, position, dis, img, fru):self.sx, self.sy = x, yself.p = positionself.dis, self.img, self.fru = dis, img, fru# 被切割的水果类
class Acut_fruit:sx = 0  # x速度x1, x2 = 0, 0y = 0fru = Nonet = 0  # 时间def __init__(self, sx, x1, x2, y, fru):self.sx = sxself.x1, self.x2 = x1, x2self.y = yself.fru = fru
 

如何随机生成一个水果

水果有八种生成方式, 即: 从左边出来往右上或右下走, 从右边出来往左上或左下走, 从上面出来往左下或右下走, 从下面出来往左上或右上走

在主循环里只需要用随机概率来随机生成即可, 这里difficult表示当前游戏的难度, 每秒平均生成 (8*difficult*FPS) /1000个水果, 也就是每秒平均生成 1.6*difficult 个水果

然后根据不同的生成位置, 设置不同的速度和初始坐标即可, 生成炸弹同理, 这里就不赘述了, 代码如下: 

while True:......if random.randint(0, 1000) < difficult: create_fruit('left_down')if random.randint(0, 1000) < difficult: create_fruit('left_up')if random.randint(0, 1000) < difficult: create_fruit('right_down')if random.randint(0, 1000) < difficult: create_fruit('right_up')if random.randint(0, 1000) < difficult: create_fruit('up_left')if random.randint(0, 1000) < difficult: create_fruit('up_right')if random.randint(0, 1000) < difficult: create_fruit('down_left')if random.randint(0, 1000) < difficult: create_fruit('down_right')      def create_fruit(dis):  # 随机生成一个水果global idx, existfruit, MAXFRUITif existfruit >= MAXFRUIT:  # 如果已经存在足够多的水果, 就不生成returnexistfruit += 1fru = random.choice(FRUIT)  # 水果类型img = FRUIT_IMG[fru]  # 获取图片if dis in ('left_up', 'right_up'):  # 从两边出来, 往上走position = random.randint(300, 650)speed_x = random.randint(200, 300)speed_y = random.randint(50, 100)elif dis in ('left_down', 'right_down'):  # 从两边出来, 往下走position = random.randint(-50, 300)speed_x = random.randint(200, 300)speed_y = random.randint(50, 100)elif dis in ('up_left', 'down_left'):  # 从上下出来, 往左走position = random.randint(400, 850)speed_x = random.randint(100, 300)speed_y = random.randint(100, 200)elif dis in ('down_right', 'up_right'):  # 从上下出来, 往右走position = random.randint(-50, 400)speed_x = random.randint(100, 300)speed_y = random.randint(100, 200)else:position, speed_x, speed_y = 0, 0, 0for i in range(MAXFRUIT):  # 生成水果if not fruits[i]:fruits[i] = Afruit(speed_x, speed_y, position, dis, img, fru)break  

如何画出刀锋划过的痕迹

首先需要记录鼠标的位置, 从按下左键开始, 每一帧都会搜集鼠标的坐标, 直到松开左键, 在此过程中还要边搜集边画出刀锋

代码思路就用列表来实现动态增删即可

while True:......# 根据鼠标走过的点绘制刀锋轨迹if points:copy = list(points)while points[-1][2] - points[0][2] >= 0.05:points.pop(0)linex, liney, _ = copy.pop(0)for temx, temy, _ in points:pygame.draw.line(sur, WHITE, (linex, liney-2), (temx, temy-2), 1)pygame.draw.line(sur, GRAY, (linex, liney), (temx, temy), 3)pygame.draw.line(sur, WHITE, (linex, liney+2), (temx, temy+2), 1)linex, liney = temx, temy......
# 响应事件
for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 鼠标长按响应, 连续的点形成刀锋elif event.type == MOUSEBUTTONDOWN:loose = Trueelif event.type == MOUSEBUTTONUP:loose = Falsepoints.clear()sur.blit(back, (0, 0))if event.type == MOUSEMOTION and loose:x1, y1 = event.pospoints.append((x1, y1, p_time))...
...

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

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

相关文章

【FPGA】静态分析与时序约束(持续更新

Reference&#xff1a; V2静态时序分析与时序约束文档 入门 无时序约束场景中&#xff0c;普通图像显示不清晰&#xff0c;千兆网口接收Ethernet package 数据不正常&#xff0c;红外场景中图像显示不正常 Definition&#xff1a; 我们提出一些特定的时序要求&#xff08;或…

文章MSM_metagenomics(七):分组马赛克图

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程是使用一个Python脚本来绘制马赛克图&#xff0c;用于可视化两个变量的频率分布。 数…

我的Mac疯了!居然可以生成这样的奇葩AI图片!

在当今人工智能领域&#xff0c;midjourney无疑是生成图片的王者&#xff0c;但是苦于付费才能使用&#xff0c;今天我就给大家分享一下midjourney平替stable diffusion&#xff0c;实现本地生成不逊色于midjourney的图片 效果图 先上一个我自己生成的效果(就是在我的Mac上用C…

【anaconda】本地永久设置镜像源

【anaconda】本地永久设置镜像源 可以通过命令行设置全局的 pip 配置&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

python字符串的一些操作实例

已知字符串 a “aAsomr3idd4HGHbigs7Dlsf9YeAF”&#xff0c;要求如下 1. 请将a字符串的大写改为小写&#xff0c;小写改为大写。 2.将a字符串的数字取出&#xff0c;并输出成一个新的字符串。 3.将a字符串中的内容反向输出 4.打印a字符串中所有奇数位上的字符(下标是1&#x…

【已解决】手机进入fastboot无法退出

文章目录 报错及效果图报错代码效果图 解决方案必要的解决方法可能有用的解决方法 报错及效果图 报错代码 手机屏幕显示fastboot&#xff0c;长按电源键无法正常启动 效果图 解决方案 必要的解决方法 1.在电脑上下载并安装adb/fastboot驱动&#xff0c;可以在这里免费下载&…

【机器学习300问】129、RNN如何在情感分析任务中起作用的?

情感分析是自然语言处理&#xff08;NLP&#xff09;领域的一个重要分支&#xff0c;它的目标是自动检测和提取出非结构化文本数据中的主观信息&#xff08;比如&#xff1a;情绪、意见、评价等&#xff09; 一、情感分析任务案例 分析电商产品评论的情感倾向&#xff08;三分类…

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…

数据资产在供应链管理中担当核心角色:利用数据驱动,显著提升运营效率,有效降低潜在风险,实现决策优化,为企业的可持续发展奠定坚实基础

一、引言 在当今全球化和数字化的时代&#xff0c;供应链管理已成为企业竞争力的关键要素之一。随着信息技术的高速发展&#xff0c;数据资产在供应链管理中扮演着越来越重要的角色。通过有效地利用数据资产&#xff0c;企业能够显著提升运营效率&#xff0c;降低潜在风险&…

opencascade AIS_InteractiveContext源码学习2

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

Hadoop3:MapReduce中Reduce阶段自定义OutputFormat逻辑

一、情景描述 我们知道&#xff0c;在MapTask阶段开始时&#xff0c;需要InputFormat来读取数据 而在ReduceTask阶段结束时&#xff0c;将处理完成的数据&#xff0c;输出到磁盘&#xff0c;此时就要用到OutputFormat 在之前的程序中&#xff0c;我们都没有设置过这部分配置 …

SQLite 3 优化批量数据存储操作---事务transaction机制

0、事务操作 事务的目的是为了保证数据的一致性和完整性。 事务&#xff08;Transaction&#xff09;具有以下四个标准属性&#xff0c;通常根据首字母缩写为 ACID&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;确保工作单位内的所有操作都成功完成&…

八、yolov8模型预测和模型导出(目标检测)

模型查看 模型预测 模型导出 模型训练完成后&#xff0c;找到训练文件生成文件夹&#xff0c;里面包含wights、过程图、曲线图。 模型预测 1、在以下文件夹中放入需要预测的图&#xff1b; 2、找到detect文件下的predict.py文件&#xff0c;修改以下内容。 3、右键点击…

【NLP练习】Transformer实战-单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 任务&#xff1a;自定义输入一段英文文本进行预测 一、定义模型 from tempfile import TemporaryDirectory from typing import Tuple from torch import nn…

AI时代:硬件狂欢,软件落寞 华为开发者大会2024

内容提要 分析师表示&#xff0c;目前AI行业大多数的支出都流向用于训练大模型的硬件或云基础设备。相较之下&#xff0c;软件应用商们在AI时代显得停滞不前。尽管软件应用商们十分热衷于构建AI工具&#xff0c;然而其收入状况却并不乐观。 文章正文 AI浪潮之下&#xff0c;英…

AIGC时代,重塑人的核心竞争力?

随着人工智能技术的飞速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;的时代已经悄然而至。在这个时代&#xff0c;AI不再仅仅是一个技术概念&#xff0c;而是深入到我们生活的方方面面&#xff0c;从创作到生产&#xff0c;从娱乐到工作&#xff0c;AI都在以…

RabbitMQ 相关概念

引言 什么是消息中间件 消息是指在应用间传送的数据&#xff0c;包含文本字符串、JSON等。消息队列中间件&#xff08;MQ&#xff09;指利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型…

剑指offer 算法题(搜索二维矩阵)

剑指offer 第二题 去力扣里测试算法 思路一&#xff1a; 直接暴力遍历二维数组。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (unsigned int i{ 0 }; i < matrix.size(); i){for (unsigned int j{ 0 };…

Shell脚本:条件语句(if、case)

目录 硬编码 硬编码的缺点 条件判断 $? 命令行语句 判断指定目录是否存在 判断指定文件是否存在 判断指定对象是否存在 表达式形式语句 判断对象是否存在 判断对象是否有权限 与、或、非 运算 与运算 或运算 非运算 比较大小 判断磁盘利用率实验步骤 字符串…

Java基础之练习(2)

需求: 键盘录入一个字符串,使用程序实现在控制台遍历该字符串 package String;import java.util.Scanner;public class StringDemo5 {public static void main(String[] args) {//录入一个字符串Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串…