用Python实现飞机大战小游戏的完整代码

 更新时间:2025年11月10日 10:46:45   作者:你才是向阳花  
不知道大家是否曾体验过打飞机的乐趣,或者是否曾与朋友们一起较量过这款游,这篇文章主要介绍了用Python实现飞机大战小游戏的完整代码,文中通过代码介绍的非常详细,需要的朋友可以参考下

飞机大战是个什么样的小游戏呢?

  • 首先我们需要有一个自己的飞机,它可以在画面上进行上下左右移动,我们通过方向键来控制它的移动,我们的飞机要发射子弹,用来击打敌机,我们用空格键来控制子弹的发射

  • 然后需要设置敌机,随机出现在画面上,以一定的速度向下移动 敌机和我们自己的飞机相撞时游戏结束

  • 游戏结束时统计得分,击落一只敌机得10分

    至此,我们一个飞机大战的小游戏就设计完成了!那么,要如何实现呢?

上完整代码:

# air_shoot.py
# 飞机大战小游戏

import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 屏幕大小
WIDTH, HEIGHT = 480, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("plane war")

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 时钟(控制帧率)
clock = pygame.time.Clock()

# 字体
font = pygame.font.SysFont("simhei", 32)  # 如果报错,改为 None 或 "Arial"
small_font = pygame.font.SysFont("simhei", 24)

# 玩家飞机
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 10
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

# 敌机
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed = random.randint(2, 5)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.kill()  # 移出屏幕后删除

# 子弹
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed = -10

    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()

# 显示文字
def draw_text(surf, text, font, x, y, color=WHITE):
    img = font.render(text, True, color)
    rect = img.get_rect()
    rect.midtop = (x, y)
    surf.blit(img, rect)

# 游戏结束画面
def show_game_over(score):
    screen.fill(BLACK)
    draw_text(screen, "GAME OVER", font, WIDTH//2, HEIGHT//2 - 50, RED)
    draw_text(screen, f"SCORE: {score}", small_font, WIDTH//2, HEIGHT//2)
    draw_text(screen, "press R restart, Q quit", small_font, WIDTH//2, HEIGHT//2 + 50)
    pygame.display.flip()

    waiting = True
    while waiting:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

# 主游戏函数
def game():
    global all_sprites, bullets, enemies

    all_sprites = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    score = 0
    enemy_spawn_rate = 30  # 帧数(越小越密集)
    running = True

    while running:
        clock.tick(60)
        current_frame = pygame.time.get_ticks() // 1000 * 60  # 当前帧数(粗略)

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # 按键射击(长按连续发射)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            if len(bullets) < 5:  # 限制子弹数量
                player.shoot()

        # 生成敌机
        if random.randint(1, enemy_spawn_rate) == 1:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

        # 更新所有精灵
        all_sprites.update()

        # 子弹击中敌机
        hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
        for hit in hits:
            score += 10

        # 玩家与敌机碰撞
        if pygame.sprite.spritecollide(player, enemies, False):
            running = False

        # 绘制
        screen.fill(BLACK)
        all_sprites.draw(screen)
        draw_text(screen, f"score: {score}", small_font, 60, 10)

        pygame.display.flip()

    # 游戏结束
    show_game_over(score)

# 主循环(支持重玩)
while True:
    game()

游戏整体结构

这个游戏使用了 Pygame 框架面向对象编程(OOP) 的方式来组织代码。主要分为以下几个部分:

  1. 初始化设置
  2. 定义游戏对象类(玩家、敌机、子弹)
  3. 游戏主循环
  4. 碰撞检测与得分
  5. 游戏结束界面
  6. 支持重玩机制

第一部分:导入模块和初始化

import pygame
import random
import sys
  • pygame:核心游戏库。
  • random:用于生成随机位置、速度等。
  • sys:用于安全退出程序。
pygame.init()

初始化所有 Pygame 的模块(如声音、显示、字体等),这是使用 Pygame 的第一步。

WIDTH, HEIGHT = 480, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("飞机大战")
  • 设置窗口大小为 480×600 像素。
  • 创建一个显示窗口,并设置标题为“飞机大战”。
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

定义颜色常量。Pygame 中颜色用 RGB 元组表示:

  • (255, 255, 255) 是白色
  • (0, 0, 0) 是黑色
  • (255, 0, 0) 是红色(敌机)
  • (0, 255, 0) 是绿色(玩家)
clock = pygame.time.Clock()

创建一个时钟对象,用来控制游戏帧率(FPS),防止运行过快或过慢。

font = pygame.font.SysFont("simhei", 32)
small_font = pygame.font.SysFont("simhei", 24)

创建字体对象,用于在屏幕上绘制文字。

  • "simhei" 是黑体,支持中文。
  • 如果系统没有这个字体,可以用 'Arial'None 替代。

第二部分:定义游戏角色类

1. 玩家飞机类Player

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH // 2
        self.rect.bottom = HEIGHT - 10
        self.speed = 5
  • 继承自 pygame.sprite.Sprite —— 这是 Pygame 中所有可移动对象的基础类。
  • image:角色的外观,这里是一个绿色矩形(50宽 × 40高)。
  • rect:角色的位置和边界框。
  • 初始位置:水平居中,底部距离屏幕底边 10 像素。
  • speed:移动速度。
    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < WIDTH:
            self.rect.x += self.speed
        if keys[pygame.K_UP] and self.rect.top > 0:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT:
            self.rect.y += self.speed

每一帧调用一次 update() 方法:

  • 获取当前按下的按键状态。
  • 控制方向键移动。
  • 加入边界判断,不让飞机飞出窗口。
    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

发射子弹的方法:

  • 在飞机顶部中心创建一颗子弹。
  • 把它加入总精灵组 all_sprites 和子弹组 bullets,以便更新和绘制。

2. 敌机类Enemy

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((40, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed = random.randint(2, 5)
  • 红色矩形代表敌机。
  • 出现在屏幕上方(y 为负值),从不同 x 位置随机出现。
  • 下落速度随机(2~5像素/帧)。
    def update(self):
        self.rect.y += self.speed
        if self.rect.top > HEIGHT:
            self.kill()  # 移出屏幕后删除

敌机持续下落,一旦完全移出屏幕底部就自动销毁(kill()),避免内存泄漏。

3. 子弹类Bullet

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed = -10  # 负数表示向上飞
  • 白色小矩形表示子弹。
  • 从玩家飞机顶部发射。
  • 向上飞行(speed = -10)。
    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()  # 子弹飞出屏幕顶端就销毁

第三部分:辅助函数

显示文字函数

def draw_text(surf, text, font, x, y, color=WHITE):
    img = font.render(text, True, color)
    rect = img.get_rect()
    rect.midtop = (x, y)
    surf.blit(img, rect)

封装了一个通用的文字绘制函数:

  • surf:要画在哪(通常是 screen
  • text:要显示的文字
  • font:字体对象
  • (x, y):文字左上角坐标
  • blit():把文字图像画到屏幕上

游戏结束画面

def show_game_over(score):
    screen.fill(BLACK)
    draw_text(screen, "游戏结束", font, WIDTH//2, HEIGHT//2 - 50, RED)
    draw_text(screen, f"得分: {score}", small_font, WIDTH//2, HEIGHT//2)
    draw_text(screen, "按 R 重新开始,Q 退出", small_font, WIDTH//2, HEIGHT//2 + 50)
    pygame.display.flip()

    waiting = True
    while waiting:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    waiting = False
                if event.key == pygame.K_q:
                    pygame.quit()
                    sys.exit()

显示“游戏结束”界面并等待用户选择:

  • 填黑背景,显示得分。
  • 提示按 R 重玩,Q 退出。
  • 使用一个循环等待输入,直到用户决定。

第四部分:主游戏函数game()

def game():
    global all_sprites, bullets, enemies

    all_sprites = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    score = 0
    enemy_spawn_rate = 30  # 每30帧左右生成一架敌机
    running = True

初始化游戏状态:

  • 创建三个精灵组:
    • all_sprites:所有要绘制和更新的对象
    • bullets:所有子弹
    • enemies:所有敌机
  • 添加玩家
  • 得分从 0 开始
    while running:
        clock.tick(60)  # 锁定60 FPS

        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

主循环每秒运行约 60 次(由 clock.tick(60) 控制)。
处理退出事件。

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            if len(bullets) < 5:  # 限制最多5发子弹
                player.shoot()

检测是否按下空格键,如果是且子弹不多于5个,则发射。

        # 生成敌机
        if random.randint(1, enemy_spawn_rate) == 1:
            enemy = Enemy()
            all_sprites.add(enemy)
            enemies.add(enemy)

随机生成敌机(大约每 30 帧生成一架)。

        all_sprites.update()

更新所有精灵的位置(包括玩家、敌机、子弹)。

        # 子弹击中敌机
        hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
        for hit in hits:
            score += 10

groupcollide() 自动检测两组精灵之间的碰撞:

  • 子弹打中敌机 → 双方都销毁(True, True
  • 每消灭一个敌机加 10 分
        # 玩家与敌机碰撞
        if pygame.sprite.spritecollide(player, enemies, False):
            running = False

如果玩家碰到任何敌机(即使只是擦边),游戏结束。

        # 绘制画面
        screen.fill(BLACK)
        all_sprites.draw(screen)
        draw_text(screen, f"得分: {score}", small_font, 60, 10)
        pygame.display.flip()

清屏 → 画所有精灵 → 显示得分 → 刷新屏幕

    show_game_over(score)  # 游戏结束后显示结束画面

第五部分:支持重复游戏

while True:
    game()

主循环外再套一层 while True,这样每次游戏结束后都可以重新开始。

总结:游戏运行流程图

开始游戏
   ↓
初始化 Pygame 和变量
   ↓
进入 game() 函数
   ↓
创建玩家和精灵组
   ↓
主循环:
   → 处理事件(退出、按键)
   → 玩家移动/射击
   → 随机生成敌机
   → 更新所有精灵位置
   → 检测碰撞(子弹打敌机、玩家撞敌机)
   → 绘制画面和得分
   ↓
玩家被撞 → 结束主循环
   ↓
调用 show_game_over()
   ↓
等待用户按 R 或 Q
   → 按 R:回到 game() 重新开始
   → 按 Q:退出程序

后续扩展建议

你可以基于这个框架继续添加功能:

功能实现思路
添加音效使用 pygame.mixer.Sound() 播放射击、爆炸音效
使用图片代替方块pygame.image.load("player.png")
添加爆炸动画碰撞时播放一系列图片
生命值系统玩家可承受多次撞击
道具掉落敌机死亡时随机掉落加速、多子弹等道具

到此这篇关于用Python实现飞机大战小游戏的文章就介绍到这了,更多相关Python飞机大战小游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python经典趣味24点游戏程序设计

    python经典趣味24点游戏程序设计

    这篇文章主要介绍了python经典趣味24点游戏程序设计,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python django中如何使用restful框架

    Python django中如何使用restful框架

    今天给大家带来的是关于Python框架的相关知识,文章围绕着django中restful框架的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 分享unittest单元测试框架中几种常用的用例加载方法

    分享unittest单元测试框架中几种常用的用例加载方法

    这篇文章主要介绍了unittest单元测试框架中常用的几种用例加载方法,帮助大家更好的理解和使用python的unittest测试模块,感兴趣的朋友可以了解下
    2020-12-12
  • python实现淘宝购物系统

    python实现淘宝购物系统

    这篇文章主要为大家详细介绍了python实现简易的淘宝购物系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法

    Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法

    今天小编就为大家分享一篇Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 使用selenium模拟登录解决滑块验证问题的实现

    使用selenium模拟登录解决滑块验证问题的实现

    这篇文章主要介绍了使用selenium模拟登录解决滑块验证问题的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • python安装并使用virtualenv管理包的详细过程

    python安装并使用virtualenv管理包的详细过程

    本文主要介绍了Python的安装过程和如何使用virtualenv管理包,首先,用户需要访问Python官网下载安装包,并运行安装程序,安装完成后,在命令行输入Python,显示安装的Python版本号,即表示安装成功,感兴趣的朋友一起看看吧
    2024-10-10
  • python免杀技术shellcode的加载与执行

    python免杀技术shellcode的加载与执行

    本文主要介绍了python免杀技术shellcode的加载与执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • python简单实现获取当前时间

    python简单实现获取当前时间

    最近项目中经常需要python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次,为了能够更好的记住,我今天特意写下python 当前时间这篇文章,如果你觉的对你有用的话,可以收藏下。
    2016-08-08
  • Python中heapq模块的各种用法实例

    Python中heapq模块的各种用法实例

    Python的heapq模块提供了一组函数用于操作堆,其中所有函数都基于列表实现,下面这篇文章主要介绍了Python中heapq模块各种用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09

最新评论