首页 > 编程语言 >用Python的Pygame包实现水果忍者小游戏

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

时间:2024-01-04 23:55:06浏览次数:39  
标签:忍者 load randint Python image random 小游戏 pygame png

先上一下运行结果

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

 

初始化

帧率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, y
self.p = position
self.dis, self.img, self.fru = dis, img, fru

# 被切割的水果类
class Acut_fruit:
sx = 0 # x速度
x1, x2 = 0, 0
y = 0
fru = None
t = 0 # 时间
def __init__(self, sx, x1, x2, y, fru):
self.sx = sx
self.x1, self.x2 = x1, x2
self.y = y
self.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, MAXFRUIT
    if existfruit >= MAXFRUIT:  # 如果已经存在足够多的水果, 就不生成
        return
    existfruit += 1
    fru = 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, 0
    for 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 = True
elif event.type == MOUSEBUTTONUP:
loose = False
points.clear()
sur.blit(back, (0, 0))
if event.type == MOUSEMOTION and loose:
x1, y1 = event.pos
points.append((x1, y1, p_time))

...
...

 

 

总结

剩下还有部分功能就不一一描述了, 有兴趣或者有问题可以私信, 代码这里不方便放出来, 因为图片素材实在是太多.

 

标签:忍者,load,randint,Python,image,random,小游戏,pygame,png
From: https://www.cnblogs.com/xanderChou/p/17946420

相关文章

  • 5种Python雪花飘落代码(建议收藏)
    第一种普通雪花代码:importturtleimportrandomdefdraw_snowflake(length,depth):ifdepth==0:turtle.forward(length)returnlength/=3.0draw_snowflake(length,depth-1)turtle.left(60)draw_snowflake(length,depth-1)......
  • 软件测试/测试开发|什么是Python,我们为什么选择Python?
    简介要说最近几年,哪个编程语言是最受欢迎的?学习人数最多的?那非Python莫属,加上人工智能时代的到来,Python热度就更加持续,那么Python为什么能够超越Java和C语言,成为现在最受欢迎的语言呢?本文就带大家一探究竟。Python简介Python发展背景Python是一种高级编程语言,由荷兰人吉多·范罗苏......
  • Python 中的变量如何定义和使用
    Python是一种解释性语言,它使用动态类型系统,这意味着变量的类型不需要在定义时显式指定,而是根据变量的值来推断其类型。在Python中,变量可以存储各种类型的数据,如字符串、整数、浮点数、布尔值、列表、元组、字典等。本文将介绍Python中变量的定义和使用,包括变量命名规则、变量赋值、......
  • 有哪些常用的 Python 模块需要进行安装
    Python是一种高级编程语言,它提供了许多标准库和第三方库,可以帮助我们更快、更高效地编写程序。在Python中,模块是一组相关的函数、类和变量的集合,可以通过导入模块来使用其中的功能。本文将介绍一些常用的Python模块,需要进行安装才能使用。一、NumPyNumPy是一个用于科学计算的Python......
  • 如何在 Geany 中添加对 Python 语言的支持
    Geany是一个轻量级的集成开发环境(IDE),它支持多种编程语言,包括Python。在Geany中添加对Python语言的支持可以提供更好的代码编辑和调试体验。下面是在Geany中添加对Python语言支持的步骤:步骤一:安装Python首先,确保已在您的计算机上安装了Python。安装完成后,可以在命令行中输入`python-......
  • python 中的 numpy 库为什么无法使用
    Python中的NumPy库是一个重要的科学计算库,它提供了高效的数值计算工具和数据结构,被广泛用于数据科学、统计学、机器学习等领域。如果无法使用NumPy库,可能是由于以下原因导致的:1.未安装NumPy库在使用NumPy库之前,需要先安装该库。可以通过pip工具来安装NumPy库,执行以下命令即可:```pi......
  • Python 开发中有哪些常见的编程错误需要注意
    在Python开发中,常常会遇到各种编程错误。这些错误可能导致程序崩溃、产生错误的输出或者不符合预期的行为。为了提高代码质量和减少错误,以下是一些常见的编程错误和注意事项:1.语法错误语法错误是最常见的编程错误之一,它通常是由于拼写错误、缺少冒号、括号不匹配等导致的。为了避免......
  • 如何处理 Python 爬虫中的反爬机制
     在网络爬虫的开发过程中,我们常常会遇到网站的反爬机制,这些反爬机制旨在阻止爬虫程序对网站内容的访问。为了成功绕过这些反爬机制,我们需要采取一系列的策略和技术手段。本文将介绍一些常见的反爬机制,并提供相应的应对方法。 1.User-Agent检测 User-Agent是HTTP请求头中的一个......
  • PythonQt简明教程
    PythonQt简明教程PythonQt是Qt框架的Python动态绑定,是一种将Python脚本语言嵌入C++Qt应用程序的简便方法。与PyQt、PySide不同,PythonQt侧重点在于将Python嵌入到现有的C++应用程序,而不是使用Python编写应用程序。接口PythonQt的主要接口通过PythonQt::self()单例提供,并由Pytho......
  • # yyds干货盘点 # 盘点一个工作中Python自动化处理实战问题(番外篇)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个工作中Python自动化处理实战问题,一起来看看吧。问题描述:数据在提供的数据表中,在表有编号、环节、审核人、金额、结束时间5列,对【编号、环节、审核人、金额】四条件进行分组,分组内结束时间升序排列......