Python飞机大战游戏设计报告

Python飞机大战游戏设计报告

一、引言
1.1 项目背景

随着计算机技术的不断发展,计算机游戏已成为人们休闲娱乐的重要方式之一。Python作为一种功能强大且易于学习的编程语言,在游戏开发领域具有广泛的应用。本项目旨在使用Python开发一款经典的飞机大战游戏,通过此项目,我们可以深入理解游戏设计原理,并提升Python编程能力。

1.2 项目目标

设计并实现飞机大战游戏的基本框架和核心功能。

创建游戏界面,包括背景、飞机、敌机、子弹等元素。

实现玩家控制、敌机生成、碰撞检测等游戏逻辑。

提供游戏暂停和重新开始功能

优化游戏性能,确保流畅的游戏体验。

1.3 项目操作

操作:W 前、S 后、A 左、D 右、J 发射1个子弹、K 发射 3 个子弹、L 发射 5 个子弹、空格暂停、P复活。

二、游戏设计
2.1 游戏框架
  1. 绘制图像:游戏的视觉效果对玩家的体验至关重要,通过不断地绘制图像,使得玩家能够看到元素在屏幕上以流畅的方式移动、交互和变化,使游戏更加生动和吸引人。
  2. 坐标计算:游戏中的元素(例如玩家角色、敌人、子弹等)通常需要移动、旋转、缩放或者进行其他形式的变换。通过每一帧进行坐标计算,你可以根据物体的当前状态、速度、方向等属性来确定下一帧的位置,从而实现流畅的动画效果和游戏物体之间的交互。
  3. 事件处理:事件处理是游戏和玩家之间的关键交互方式。这包括处理玩家的输入,如键盘按键、鼠标点击、触摸屏手势等。开发者需要编写代码来捕获这些事件,并根据它们触发游戏中的相应行为。例如,按下空格键可以触发飞机发射子弹的动作。事件处理也可以包括游戏内部事件,如定时器事件、碰撞事件等。
  4. 碰撞检测:在一些游戏中,物体之间的相互作用是游戏逻辑的一部分。例如,在一款射击游戏中,玩家的子弹必须检测是否与敌人或障碍物碰撞,以便计算伤害或触发相应的效果,这种交互性是游戏中重要的、核心的机制。

2.2 游戏主模块设计(负责人:)

作用:实现对所有模块的调用执行

import pygame
from Config import *
from GameMap import GameMap
from HeroPlane import HeroPlane
from EnemyManager import EnemyManager
import sys

class MainScene:

    def __init__(self):
        # 初始化 PyGame
        pygame.init()
        # 游戏暂停
        self.paused = False
        # 初始化窗口
        self.scene = pygame.display.set_mode([SCREEN_W, SCREEN_H])
        # 设置窗口标题
        pygame.display.set_caption('飞机大战 v1.0')
        # 初始化时钟
        self.clock = pygame.time.Clock()
        # 初始化元素
        self.init_elements()
        # 统计战斗数据
        self.defeat_count = 0  # 击中飞机数量
        self.damage_count = 0  # 被击中的次数
        self.impact_count = 0  # 被撞击的次数
        self.player_hp = 10  # 玩家hp

        # 背景音乐加载
        pygame.mixer.music.load('source/music/bg.wav')
        pygame.mixer.music.set_volume(VOLUME)
        pygame.mixer.music.play(-1)

    # 绘制战斗数据
    def draw_battle_data(self):
        # 加载一个字体
        font = pygame.font.Font('source/fonts/SimHei.ttf', 16)
        text = f'击毁数: {self.defeat_count} 被击中: {self.damage_count} 被撞击: {self.impact_count} 生命:{self.player_hp}'
        # 第一个参数: 渲染的文字
        # 第二个参数: 抗锯齿
        # 第三个参数: 颜色
        text = font.render(text, True, (255, 255, 255))
        # 将文字绘制到窗口上
        self.scene.blit(text, (100, 20))

    # 初始化场景元素
    def init_elements(self):
        # 初始化地图
        self.map = GameMap(self.scene)
        # 初始化英雄飞机
        self.hero = HeroPlane(self.scene)
        # 初始化敌机
        self.enemy = EnemyManager(self.scene)

    # 碰撞检测
    def detect_colision(self):

        # 英雄飞机子弹和敌机是否碰撞
        for bullet in self.hero.bullets.bullet_list:
            if not bullet.visible:
                continue
            for enemy in self.enemy.enemies:
                if not enemy.visible:
                    continue
                if pygame.Rect.colliderect(bullet.bbox, enemy.bbox):
                    bullet.set_unused()
                    # 播放爆炸效果
                    enemy.bomb.set_used(enemy.bbox[0], enemy.bbox[1])
                    enemy.set_unused()
                    self.defeat_count += 1

        # 英雄飞机子弹和敌机子弹是否碰撞
        for bullet in self.hero.bullets.bullet_list:
            if not bullet.visible:
                continue

            for enemy in self.enemy.enemies:
                if not enemy.bullet.visible:
                    continue
                if pygame.Rect.colliderect(bullet.bbox, enemy.bullet.bbox):
                    bullet.set_unused()
                    enemy.bullet.set_unused()

        # 英雄飞机和敌机是否发生相撞
        for enemy in self.enemy.enemies:
            if not enemy.visible:
                continue
            if pygame.Rect.colliderect(self.hero.bbox, enemy.bbox):
                # 播放爆炸效果
                enemy.bomb.set_used(enemy.bbox[0], enemy.bbox[1])
                self.hero.bomb.set_used(self.hero.bbox[0], self.hero.bbox[1])
                enemy.set_unused()
                self.impact_count += 1
                self.player_hp -= 1

        # 英雄飞机和敌机的子弹是否发生碰撞
        for enemy in self.enemy.enemies:
            if not enemy.bullet.visible:
                continue
            if pygame.Rect.colliderect(self.hero.bbox, enemy.bullet.bbox):
                self.hero.bomb.set_used(self.hero.bbox[0], self.hero.bbox[1])
                enemy.bullet.set_unused()
                self.damage_count += 1
                self.player_hp -= 1

    # 坐标计算
    def calc_position(self):
        # 地图位置计算
        self.map.calc_position()
        # 飞机子弹坐标计算
        self.hero.calc_position()
        # 敌机坐标计算
        self.enemy.calc_position()

    # 绘制图像
    def draw_elements(self):
        # 地图图像绘制
        self.map.draw_element()
        # 绘制飞机和子弹
        self.hero.draw_element()
        # 绘制敌机
        self.enemy.draw_element()
        # 绘制战斗数据
        self.draw_battle_data()

    # 事件处理
    def handle_events(self):

        events = pygame.event.get()
        for event in events:
            # 窗口关闭事件
            if event.type == pygame.QUIT:
                pygame.display.quit()
                sys.exit()
            # 暂停事件
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    self.paused = not self.paused
                elif event.key == pygame.K_p:
                    if self.game_over:
                        self.reset_game()
                        self.game_over = False

            # 处理敌机出发事件
            if event.type == EnemyManager.ENEMY_START_EVNET:
                self.enemy.set_out()

     

你可能感兴趣的:(python,游戏)