使用python中的pygame简单实现飞机大战游戏

前言

在这个教程中,我们将使用 Python 的 Pygame 库来开发一个简单的飞机大战游戏。Pygame 是一个开源的 Python 库,用于编写视频游戏。它包括计算机图形和声音库,设计目的是为游戏开发者提供一个简单易用的接口。

一、环境准备

在开始编码之前,请确保已经安装了 Python 和 Pygame。可以通过以下命令安装 Pygame:

bash 复制代码
pip install pygame
二、项目结构

我们的项目将包含以下几个主要部分:

  • plane_sprites.py:定义游戏中的所有精灵类。
  • main.py:游戏主逻辑文件。
三、代码详解
1. 初始化游戏

首先,在 main.py 中导入必要的模块,并创建 PlanGame 类来封装游戏逻辑。

python 复制代码
import pygame
import sys
from plane_sprites import *  # 假设这里导入了所有的精灵类

class PlanGame(object):
    def __init__(self):
        print("游戏初始化")
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)  # 创建游戏窗口
        self.clock = pygame.time.Clock()  # 创建时钟对象,用于控制游戏帧率
        self.__create_sprites()  # 初始化精灵和精灵组
        
        # 设置定时器事件,用于创建敌机和触发英雄发射子弹
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
        pygame.time.set_timer(HERO_FIRE_EVENT, 600)
2. 创建精灵与精灵组

在 __create_sprites 方法中,我们初始化背景、敌人以及英雄精灵。

python 复制代码
def __create_sprites(self):
    bg1 = Background()
    bg2 = Background(is_alt=True)
    self.back_group = pygame.sprite.Group(bg1, bg2)  # 背景精灵组
    self.enemy_group = pygame.sprite.Group()  # 敌人精灵组
    self.hero = Hero()  # 英雄精灵
    self.hero_group = pygame.sprite.Group(self.hero)  # 英雄精灵组
3. 开始游戏循环

start_game 方法包含了游戏主循环,处理事件、更新屏幕等。

python 复制代码
def start_game(self):
    print("游戏开始...")
    while True:
        self.clock.tick(FRAME_PER_SEC)  # 控制游戏更新频率
        self.__event_handler()  # 事件处理
        self.__check_collide()  # 碰撞检测
        self.__update_sprites()  # 更新并绘制精灵
        pygame.display.update()  # 刷新显示
4. 事件处理

在 __event_handler 方法中,监听用户输入和定时器事件。

python 复制代码
def __event_handler(self):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 如果用户点击关闭按钮
            self.__game_over()
        elif event.type == CREATE_ENEMY_EVENT:  # 创建敌机
            enemy = Enemy()
            self.enemy_group.add(enemy)
        elif event.type == HERO_FIRE_EVENT:  # 英雄开火
            self.hero.fire()
    
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[pygame.K_RIGHT]:  # 向右移动
        self.hero.speed = ½
    elif keys_pressed[pygame.K_LEFT]:  # 向左移动
        self.hero.speed = -2
    # 更多按键逻辑...
    else:
        self.hero.speed = 0
5. 碰撞检测

__check_collide 方法用于检测子弹与敌机之间的碰撞,以及英雄与敌机之间的碰撞。

python 复制代码
def __check_collide(self):
    # 子弹击毁敌机
    pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
    # 敌机击毁英雄
    enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
    if len(enemies) > 0:
        self.hero.kill()
        self.__game_over()
6. 更新并绘制精灵

__update_sprites 方法更新每个精灵的位置,并在屏幕上绘制它们。

python 复制代码
def __update_sprites(self):
    self.back_group.update()
    self.back_group.draw(self.screen)
    self.enemy_group.update()
    self.enemy_group.draw(self.screen)
    self.hero_group.update()
    self.hero_group.draw(self.screen)
    self.hero.bullets.update()
    self.hero.bullets.draw(self.screen)
7. 游戏结束

当游戏结束时,__game_over 方法会被调用来清理资源并退出程序。

python 复制代码
@staticmethod
def __game_over():
    print("游戏结束")
    pygame.quit()
    sys.exit()
四、运行游戏

最后,在 main.py 文件的底部加入以下代码来实例化 PlanGame 并启动游戏。

python 复制代码
if __name__ == '__main__':
    game = PlanGame()
    game.start_game()

总结

本教程展示了如何使用 Pygame 开发一个简单的飞机大战游戏。通过这个过程,你可以学习到 Pygame 的基本概念和使用方法。请注意,本文档仅作为教学示例之用,实际开发中可能需要更复杂的设计和功能实现。

相关推荐
hhcgchpspk19 分钟前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事23 分钟前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python
vipxieliang24 分钟前
Python collections:高效容器与实战案例
后端·python
青少儿编程课堂39 分钟前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
特创数字科技1 小时前
写了个 Windows 下载器:一键拉 GitHub / Gitee 源码,带 SHA256 校验
python·github
郝学胜-神的一滴2 小时前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
系统集成-鹰翔2 小时前
ERP单据已作废为什么商品仍不能删除,引用检查与软删除怎么查
javascript·经验分享·后端
天天被压力2 小时前
【A股分钟级高频数据完全手册 #09】A股历史分时交易数据接口:普通分时怎么批量下
java·人工智能·python
聪明的笨猪猪2 小时前
政务知识库AI架构选型:强合规约束下的架构决策与落地路径
经验分享·架构·ai编程·政务
天天被压力2 小时前
【A股分钟级高频数据完全手册 #10】股票实时行情数据接口Python:公开源实时交易取数
java·人工智能·python