Python实现水果忍者游戏:Pygame源码与逻辑解析

Ada
Ada
发布时间:2026-10-15| 7人浏览过
原创

本文详细介绍如何使用Python和Pygame库开发一个简易版水果忍者游戏。内容涵盖窗口设置、水果随机生成算法、碰撞检测机制、生命值管理及游戏主循环逻辑。通过完整代码解析,帮助开发者掌握2D游戏开发的核心要素,包括帧率控制、事件处理及图形渲染。

前言

相信大多数人都玩过经典游戏《水果忍者》,但你是否尝试过用Python自己编写一个版本?本文将演示如何利用Python语言复刻这一经典游戏。游戏的核心玩法十分直观:玩家需要在屏幕上尽可能多地切开被抛出的水果。

我们将使用Python构建一个简化版的游戏原型。在该项目中,玩家通过鼠标点击来切割水果,同时需要警惕隐藏在其中的炸弹。游戏规则设定为:一旦玩家切开了3颗炸弹,游戏即判定为失败。

一、环境依赖与导入模块

import pygame, sys
import os
import random

二、游戏窗口初始化配置

# 游戏窗口
WIDTH = 800
HEIGHT = 500
FPS = 15             # gameDisplay的帧率,1/12秒刷新一次
pygame.init()
pygame.display.set_caption('水果忍者') # 标题
gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT)) # 固定窗口大小
clock = pygame.time.Clock()
# 用到的颜色
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)

background = pygame.image.load('背景.jpg') # 背景
font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42) # 字体
score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) # 得分字体样式

三、水果随机生成逻辑

def generate_random_fruits(fruit):
fruit_path = "images/" + fruit + ".png"
data[fruit] = {
'img': pygame.image.load(fruit_path),
 'x' : random.randint(100,500),
 'y' : 800,
'speed_x': random.randint(-10,10),
'speed_y': random.randint(-80, -60),
 'throw': False,
 't': 0,
'hit': False,
 }
if random.random() >= 0.75:
data[fruit]['throw'] = True
else:
data[fruit]['throw'] = False
data = {}
for fruit in fruits:
generate_random_fruits(fruit)

 

该函数负责随机生成水果对象并维护其状态数据。

变量 'x' 和 'y' 分别记录水果在屏幕坐标系中的横纵位置。

变量 'speed_x' 和 'speed_y' 存储水果在水平和垂直方向的移动速度,同时控制水果沿对角线运动的轨迹。

变量 'throw' 用于判断生成的水果是否处于游戏有效区域内。若水果坐标超出边界,则该水果将被丢弃并不再参与后续计算。

字典 'data' 用于集中存储所有随机生成水果的完整数据集合,包括图像、坐标及运动状态。

四、文本渲染函数

font_name = pygame.font.match_font('comic.ttf')
def draw_text(display, text, size, x, y):
font = pygame.font.Font(font_name, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect()
 text_rect.midtop = (x, y)
 gameDisplay.blit(text_surface, text_rect)

函数 'Draw_text' 实现在屏幕上绘制指定文字的功能。

方法 'get_rect()' 用于返回包含文本的矩形对象,以便确定绘制区域。

参数 'X' 和 'y' 分别指定文本在水平和垂直方向上的起始位置。

方法 'blit()' 负责在屏幕指定的坐标位置绘制图像或渲染文字内容。

五、玩家生命值可视化

# 绘制玩家的生命
def draw_lives(display, x, y, lives, image) :
for i in range(lives) :
img = pygame.image.load(image)
img_rect = img.get_rect()
img_rect.x = int(x + 35 * i)
img_rect.y = y
display.blit(img, img_rect)

def hide_cross_lives(x, y):
gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))

 

变量 'img_rect' 用于获取代表生命值的十字图标坐标,该图标位于屏幕最右上方。

属性 'img_rect.x' 用于设置下一个十字图标与前一个图标之间的水平间距,固定为35像素。

属性 'img_rect.y' 负责确定十字图标在屏幕垂直方向上的起始位置,通常从顶部开始排列。

此外,关注相关技术公众号Linux就该这样学,并在后台回复“git书籍”,可获取一份惊喜礼包。

六、游戏开始与结束界面处理

def show_gameover_screen():
    gameDisplay.blit(background, (0,0))
   draw_text(gameDisplay, "FRUIT NINJA!", 90, WIDTH / 2, HEIGHT / 4)
    if not game_over :
        draw_text(gameDisplay,"Score : " + str(score), 50, WIDTH / 2, HEIGHT /2)
   draw_text(gameDisplay, "Press a key to begin!", 64, WIDTH / 2, HEIGHT * 3 / 4)
   pygame.display.flip()
    waiting = True
    while waiting:
     clock.tick(FPS)
      for event in pygame.event.get():
           if event.type == pygame.QUIT:
            pygame.quit()
          if event.type == pygame.KEYUP:
         waiting = False

函数 'show_gameover_screen()' 用于显示游戏初始画面以及游戏结束时的提示界面。

调用 'pygame.display.flip()' 时,若未传递参数,则该函数会更新整个屏幕显示内容。

函数 'pygame.event.get()' 用于检索并返回存储在pygame事件队列中的所有当前事件。

当检测到事件类型等于 'quit' 时,pygame模块将执行退出程序的操作。

事件类型 'event.KEYUP' 表示按键被按下并随后释放时触发的事件,常用于确认操作。

七、游戏主循环逻辑

first_round = True
game_over = True        
game_running = True    
while game_running :
   if game_over :
      if first_round :
        show_gameover_screen()
         first_round = False
      game_over = False
       player_lives = 3
       draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
       score = 0
   for event in pygame.event.get():
       if event.type == pygame.QUIT:
         game_running = False
   gameDisplay.blit(background, (0, 0))
   gameDisplay.blit(score_text, (0, 0))
    draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
   for key, value in data.items():
        if value['throw']:
          value['x'] += value['speed_x']
      value['y'] += value['speed_y']
            value['speed_y'] += (1 * value['t'])
          value['t'] += 1
           if value['y'] <= 800:
                gameDisplay.blit(value['img'], (value['x'], value['y']))
           else:
               generate_random_fruits(key)
          current_position = pygame.mouse.get_pos()
           if not value['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 \
                    and current_position[1] > value['y'] and current_position[1] < value['y']+60:
                if key == 'bomb':
                   player_lives -= 1
                  if player_lives == 0:
                  elif player_lives == 1 :
                      hide_cross_lives(725, 15)
                   elif player_lives == 2 :
                      hide_cross_lives(760, 15)
                  if player_lives < 0 :
                       show_gameover_screen()
             game_over = True
                    half_fruit_path = "images/explosion.png"
                else:
                   half_fruit_path = "images/" + "half_" + key + ".png"
                value['img'] = pygame.image.load(half_fruit_path)
                value['speed_x'] += 10
               if key != 'bomb' :
                    score += 1
               score_text = font.render('Score : ' + str(score), True, (255, 255, 255))
                value['hit'] = True
        else:
            generate_random_fruits(key)
    pygame.display.update()
    clock.tick(FPS)
pygame.quit()

此部分代码构成了游戏运行的核心主循环。

逻辑判断:若被切开的炸弹数量超过3个,变量 'game_over' 将置为真以终止游戏,并结束当前循环。

变量 'game_running' 用于控制游戏主循环的持续运行状态。

当检测到事件类型为退出时,游戏窗口将被关闭并释放资源。

在游戏循环内部,系统动态刷新并显示屏幕内的水果对象。

若水果未被切开,则保持原有状态不变;若水果被成功切开,则在该水果位置显示半切开的水果图像。

若用户累计切开了3颗炸弹,系统将显示 'GAME OVER' 提示信息,并重置游戏窗口状态。

函数 'clock.tick()' 用于保持循环以设定的帧率运行。根据配置,循环应在每1/12秒后更新一次画面。

最后

建议大家动手尝试运行此游戏,体验开发乐趣。这个小游戏效果不错,不妨看看谁的手速更快。

至此,关于利用Python编写水果忍者小游戏的介绍已结束。如需了解更多Python水果忍者相关内容,请搜索本站历史文章或继续浏览后续教程。感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。