搞定Python课程设计,Pygame全民飞机大战【源码素材齐全】

 Hello,铁子们,临近学期末,各类课程设计扑面而来,今天,攀哥给大家分享一个很实用的课程设计源码:Python全民飞机大战,话不多说,各位先点个关注+收藏囤起来!!

源代码代码+素材领取方式:关注+评论区留言

        Python飞机大战源码是一个典型的基于Python及其pygame库实现的射击类游戏项目。下面将从项目概述、主要组成部分、核心功能实现以及开发流程等几个方面进行详细介绍。

一、项目概述

飞机大战游戏是一款经典的射击类游戏,玩家需要驾驶飞机在空中与敌人进行战斗,躲避敌人的攻击,并发射子弹消灭敌人。游戏背景通常设定在蓝天白云之间,通过键盘控制飞机的移动和射击,增加游戏的互动性和挑战性。

二、主要组成部分

  1. 游戏界面:包括背景、飞机、敌机、子弹等元素。背景采用蓝天白云的图片,飞机和敌机使用图像资源绘制在屏幕上,子弹则使用简单的矩形或图像表示。
  2. 游戏角色
    • 玩家飞机:玩家控制的飞机,可以移动和发射子弹。
    • 敌机:从屏幕上方不断飞来,玩家需要射击它们以获得分数。
    • 子弹:玩家飞机发射的子弹,用于击中敌机。
  1. 游戏逻辑:包括飞机的移动控制、子弹的发射和移动、敌机的生成和移动、碰撞检测等。

三、核心功能实现

  1. 初始化游戏
    • 使用pygame库创建游戏窗口,并设置窗口的大小和标题。
    • 加载游戏所需的图像资源,如背景图、飞机图、敌机图和子弹图等。
    • 初始化游戏变量和常量,如屏幕宽度、高度、飞机速度、敌机速度等。
  1. 绘制游戏元素
    • 在游戏窗口上绘制背景、飞机、敌机和子弹等元素。
    • 根据需要更新这些元素的位置和状态。
  1. 控制飞机移动
    • 使用pygame库中的键盘事件检测函数来检测玩家按下的键盘按键。
    • 根据按键更新飞机的位置,实现飞机的上下左右移动。
  1. 发射子弹
    • 当玩家按下空格键时,在飞机位置发射子弹。
    • 子弹以一定速度向上移动,直到离开屏幕或击中敌机。
  1. 生成敌机
    • 在游戏过程中,不断生成新的敌机从屏幕上方飞入。
    • 敌机的飞行速度和生成频率可以根据游戏难度进行调整。
  1. 碰撞检测
    • 检测子弹与敌机之间的碰撞。
    • 当子弹击中敌机时,敌机消失并增加玩家分数。
    • 检测敌机与玩家飞机之间的碰撞,如果发生碰撞则游戏结束。
  1. 游戏循环
    • 通过游戏主循环不断处理事件、绘制游戏元素、更新游戏状态等。
    • 在每次循环结束时更新屏幕显示。

四、开发流程

  1. 环境搭建:安装Python解释器和pygame库。
  2. 设计游戏界面:确定游戏背景、角色和元素的设计。
  3. 编写代码
    • 创建游戏窗口并设置窗口属性。
    • 加载游戏资源并初始化游戏变量。
    • 编写绘制游戏元素的代码。
    • 实现飞机移动、子弹发射和敌机生成的逻辑。
    • 编写碰撞检测和游戏结束的逻辑。
  1. 测试与优化
    • 对游戏进行测试,检查是否存在bug或性能问题。
    • 根据测试结果进行优化和改进,提高游戏的稳定性和流畅度。
  1. 发布与分享:将游戏打包并发布到相关平台,与玩家分享。

五、注意事项

  • 在开发过程中,需要注意代码的清晰性和可读性,以便后续维护和扩展。
  • 使用的图像和音效资源需要确保合法合规,避免侵犯版权。
  • 游戏难度和游戏体验可以通过不断迭代和优化来提升。

六、具体实现

9.1 创建项目,导入素材

9.2 设计游戏窗体
9.2.1 创建游戏配置文件

游戏配置文件中可以设置游戏常用的参数,方便后期调整游戏数据,改变游戏效果。这里我们在code目录中新建一个constant.py,代码如下:

"""
  游戏的配置文件
  在这个文件中可以设置游戏的参数,
  方便后期修改数值来调整游戏效果
"""

# 游戏界面的宽度
SCREEN_WIDTH = 512

# 游戏界面的高度
SCREEN_HEIGHT = 768

# 游戏标题
GAME_TITLE = "全民飞机大战"
9.2.2 编写游戏窗体

在code目录中新建game.py

"""
全民飞机大战
"""
# 导入pygame模块
import sys

import pygame

from constant import *

# 初始化pygame模块
pygame.init()

# 设置窗体大小
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))

# 设置游戏标题 (标题使用constant中的GAME_TITLE)
pygame.display.set_caption(GAME_TITLE)


while True:

    # 遍历事件列表
    for event in pygame.event.get():
        # 如果当前的事件类型为退出系统
        if event.type == pygame.QUIT:
            # 退出pygame模块
            pygame.quit()
            # 结束系统
            sys.exit()

    # 刷新界面
    pygame.display.update()

运行效果:

9.3 制作游戏背景
9.3.1 设计游戏背景类
"""
游戏背景类
    游戏背景移动原理:
        假设只有一张背景,这张背景图向下移动的时候,游戏界面上方就会出现没有背景的情况
        解决方法:显示两张背景图,首尾相接。一起移动,当第一张移动的时候,第二张可以
        把位置补齐,当第一张背景图移除到屏幕外面去了之后,就让第一张重新回到屏幕的上方
        继续下落
"""
import pygame

from constant import *


class Background:

    def __init__(self, index, case):
        """
        构造器
        :param index: 第几张背景
        :param case: 当前的关卡,用来确定显示哪一张背景图
        """
        self.index = index
        # 根据当前的关卡显示对应的图片
        self.image = pygame.image.load("../img/maps/img_bg_level_%s.jpg" % case)
        if index == 1:
            # 确定矩形对象,第一张背景图刚好覆盖游戏界面
            self.rect = self.image.get_rect(top=0,left=0)
        else:
            # 如果是第二张背景图,让其显示在第一张背景图的上方
            self.rect = self.image.get_rect(top=-self.image.get_height(), left=0)


    def move(self):
        """
        背景图移动的方法,背景图向下移动
        :return:
        """
        # constant.py定义的BG_SPEED表示背景移动的速度
        self.rect.move_ip(0,BG_SPEED)
        # 如果图片完全移出到游戏屏幕外面
        if self.rect.y > SCREEN_HEIGHT:
            # 让背景重新回到游戏屏幕的上面,继续下落
            self.rect.y = -self.image.get_height()
9.3.2 创建背景图并绘制

在game.py 的while循环外面,我们创建两个背景图出来,并在while循环中将其画出,如下所示:

运行效果:

9.3.3 让背景图移动

在绘制图片后,分别调用图片移动的方法,让图片移动起来。如下图:

运行起来之后会发现确实移动了,但是移动的非常的快,原因是我们电脑处理速度非常的快,这个时候我们就需要设置游戏的FPS帧率,我们先在constant.py中添加一个FPS并设置好数值,然后创建时钟。

# 游戏的FPS帧率
FPS = 30

然后在game.py中创建时钟对象

clock = pygame.time.Clock()

最后在循环中使用时钟对象,处理游戏帧率

clock.tick(FPS)

完整代码如下:

9.4 制作玩家机
9.4.1 显示玩家机

创建玩家类,代码如下:

"""
玩家类
"""
import pygame
from constant import *


# 继承Sprite方便后面做碰撞检测
class Player(pygame.sprite.Sprite):

    def __init__(self, index):
        """
        玩家构造器
        :param index: 第几个敌机
        """
        super().__init__()
        self.image = pygame.image.load("../img/hero/hero_%s.png" % index)
        x = SCREEN_WIDTH / 2
        y = SCREEN_HEIGHT - self.image.get_height() - 50
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = PLAYER_SPEED

    # 向上移动的方法
    def move_up(self):
        self.rect.move_ip(0, -self.speed)

    # 向下移动的方法
    def move_down(self):
        self.rect.move_ip(0,self.speed)

    # 向左移动的方法
    def move_left(self):
        self.rect.move_ip(-self.speed,0)

    # 向右移动的方法
    def move_right(self):
        self.rect.move_ip(self.speed,0)

在game.py 中创建player玩家机并绘制出来,代码如下:

运行效果:

9.4.2 让玩家机移动

编写玩家类

"""
玩家类
"""
import pygame
from constant import *


# 继承Sprite方便后面做碰撞检测
class Player(pygame.sprite.Sprite):

    def __init__(self, index):
        """
        玩家构造器
        :param index: 第几个敌机
        """
        super().__init__()
        self.image = pygame.image.load("../img/hero/hero_%s.png" % index)
        x = SCREEN_WIDTH / 2
        y = SCREEN_HEIGHT - self.image.get_height() - 50
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = PLAYER_SPEED

    # 向上移动的方法
    def move_up(self):
        self.rect.move_ip(0, -self.speed)
        # 如果向上移出屏幕外面,不再继续向上移动,停在上边界
        if self.rect.y < 0:
            self.rect.y = 0

    # 向下移动的方法
    def move_down(self):
        self.rect.move_ip(0, self.speed)
        # 如果向下移出屏幕外面,不再继续向下移动,停在下边界
        if self.rect.y > SCREEN_HEIGHT-self.rect.height:
            self.rect.y = SCREEN_HEIGHT-self.rect.height

    # 向左移动的方法
    def move_left(self):
        self.rect.move_ip(-self.speed, 0)
        # 如果向左移出屏幕外面,不再继续向左移动,停在左边界
        if self.rect.x < 0:
            self.rect.x = 0

    # 向右移动的方法
    def move_right(self):
        self.rect.move_ip(self.speed, 0)
        # 如果向右移出屏幕外面,不再继续向右移动,停在右边界
        if self.rect.x > SCREEN_WIDTH-self.rect.width:
            self.rect.x = SCREEN_WIDTH-self.rect.width

在game.py中添加键盘监听器

# 获取按键列表
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_UP]:
    player.move_up()
    if key_pressed[pygame.K_DOWN]:
        player.move_down()
if key_pressed[pygame.K_LEFT]:
    player.move_left()
    if key_pressed[pygame.K_RIGHT]:
        player.move_right()
9.5 制作敌机
9.5.1 添加敌机类
"""
敌人
"""
import pygame.sprite
import random
from constant import *

ep_index = 0


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.index = 0
        index = random.randint(1, 4)
        # 显示敌机动画的图片列表
        self.animations = []
        self.animations.append(pygame.image.load("../img/enemy/a%s_1.png" % index))
        self.animations.append(pygame.image.load("../img/enemy/a%s_2.png" % index))
        # 取出第一张图片作为当前显示的图片
        self.image = self.animations[0]
        # 随机显示横坐标
        x = random.randint(0, SCREEN_WIDTH - self.image.get_width())
        y = -self.image.get_height()
        # 创建矩形对象
        self.rect = self.image.get_rect(center=(x, y))
        # 敌机的速度
        self.speed = random.randint(2, 5)
        # 敌机移动的方向
        self.dir = random.randint(1, 3)
        self.id = 0
        self.active = True

    # 敌机移动的方法
    def move(self):
        # 如果方向向下
        if self.dir == DOWN:
            # 让敌机向下移动
            self.rect.move_ip(0, self.speed)
        self.check_re_init()

        # 如果方向向左下角
        if self.dir == LEFT_DOWN:
            self.rect.move_ip(-EP_X_SPEED, self.speed)
            if self.rect.x <= 0:
                self.dir = RIGHT_DOWN
        self.check_re_init()

        # 如果方向向右下角
        if self.dir == RIGHT_DOWN:
            self.rect.move_ip(EP_X_SPEED, self.speed)
            if self.rect.x > SCREEN_WIDTH:
                self.dir = LEFT_DOWN
        self.check_re_init()

    # 检测敌机是否移除屏幕外面,如果是,就重新出现
    def check_re_init(self):
        if self.rect.y > SCREEN_HEIGHT:
            self.__init__()

    # 显示动画
    def show_animation(self):
        global ep_index
        ep_index += 1
        if ep_index > 10:
            self.image = self.animations[self.id]
            self.id += 1
            if self.id >= 2:
                self.id = 0
            ep_index = 0

    # 重新出现敌机
    def reset(self):
        self.__init__()
9.5.2 创建敌机

在game.py中设置敌机的数量,并创建敌机

注意:

1. 敌机的数量EP_NUM 是在constant中定义的,表示基础敌机的数量。比如:EP_NUM设置为10 ,第一关有10个敌机,第二关就有20个敌机。
2. 敌机后面需要做碰撞检测的,所以我们敌机的敌机大本营用精灵组表示。
9.5.3 绘制敌机

如果敌机当前的存活状态为True就绘制敌机,并让敌机移动,显示敌机的动画

9.6 制作子弹
9.6.1 添加子弹类
"""
    子弹类
"""
import pygame.sprite


class Bullet(pygame.sprite.Sprite):

    def __init__(self, position):
        """
        构造器
        :param position: 发射子弹的位置(位置根据玩家的位置确定)
        """
        super().__init__()
        self.image = pygame.image.load("../img/bullet/bullet_2.png")
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = position
        self.rect.left -= self.image.get_width()/2
        self.rect.top -= 30
        self.speed = 10
        self.active = True

    # 移动的方法
    def move(self):
        self.rect.move_ip(0, -self.speed)

    # 重新出现子弹的方法(子弹碰撞到敌机,或者移出屏幕外面调用此方法让子弹重新出现)
    def reset(self,position):
        self.__init__(position)
9.6.2 创建子弹

9.6.3 绘制子弹并让子弹移动

运行效果:

9.7 击中敌机和爆炸效果
9.7.1 子弹击中敌机

使用精灵组判断子弹是否有击中敌机,如果有,将敌机和子弹的存活状态设置为False,表示死亡。

9.7.2 爆炸效果

在game.py中加载爆炸效果图片

如果敌机存活状态为False的时候,绘制爆炸效果

运行效果:

9.8 玩家血量和游戏结束
9.8.1 在配置文件中设置玩家血量

9.8.2 在game.py中定义玩家血量

9.8.3 绘制指定数量的玩家机作为血量

显示效果:

9.8.4 游戏结束

定义游戏结束的开关

碰撞到敌机的时候,玩家血量减少1

开关控制玩家移动:

开关控制子弹发射

开关控制敌机出现和移动

开关控制背景移动

游戏结束时,绘制结束语句

运行效果:

9.9 制作分数功能
9.9.1 定义分数变量

9.9.2 绘制分数

9.9.3 打掉敌机后增加分数

9.10 游戏音效
9.10.1 加载音乐

9.10.2 播放背景音乐

9.10.3 播放发射子弹音效

每次发射子弹时,播放一次射击音效

9.10.4 播放爆炸音效

当打掉敌机之后,播放爆炸音效

9.11 游戏的重新开始

在玩家类中添加重新回到原来位置的reset方法

更多学习资料:小破(B)站:墨轩大楼

===源代码以及素材,请关注+评论区留言获取===

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值