• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
笼中鸟
stay hungry stay foolish
博客园    首页    新随笔    联系   管理    订阅  订阅
来自童晶老师的游戏开发课程作业-——飞机大战

此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11577

语言:python

作业要求:

游戏名称满分分值功能点提示
飞机大战 50 移动飞机、发射子弹、敌机移动、消灭敌机、被敌机撞击、存档读档

 

 

 

 

 

1.coding地址:https://e.coding.net/xucancan1/plane_war/plane_war.git ,  主运行文件:main.py

2.项目PSP

类型 任务 开始时间 结束时间 中断时间(min) delta时间
分析 分析各个部分之间的联系 2020.11.28 21:32 2020.11.29 00:23 0min 171min
编程 编写设计屏幕和英雄飞机类,实现英雄飞机能够左右移动 2020.11.30 21:28 2020.12.01 00:30 0min 182min
编程 编写英雄飞机的普通子弹和超级子弹 2020.12.01 21:30 2020.12.01 23:32 0min 122min
编程 编写各种敌机类 2020.12.02 21:30 2020.12.02  00:05 0min 155min
编程 编写英雄飞机击打敌机的函数 2020.12.03  21:22 2020.12.03  23:02 0min 100min
编程 编写设计游戏的计分和等级 2020.12.04  21:20 2020 .12.05  00:13  0min 173min
编程 调试 2020.12 .05  21:33 2020. 12.06  00:10 0min 157min
编程 编写显示最高分记录和英雄飞机的生命条数显示 2020.12.06   21:30 2020.12.07  00:12 0min 162min
编程 整体调试,和界面优化 2020.12.07   15:28 2020.12.07  22:10 32min 370min
写文档 写文档 2020.12.08 15:30 2020.12.08 16:23 0min 53min

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.项目WBS

 

 

4.主类的大概逻辑

 

 

 

5.主要关键技术

该项目引入了pygame这个包

主类main的代码:

import sys
import pygame
from settings import Settings
import game_functions as gf
from pygame.sprite import Group  #引入动作物的组
from alien import Alien
#导入ship类
from ship import Ship
from game_stats import Gamestats
from button import Button
from scoreboard import Scoreboard
from alien import Alien
import random as r

def run_game():
    pygame.init()
    #创建所有设置对象
    ai_settings =Settings()
    #创建存储游戏统计信息的实例,并创建记分牌
    stats =Gamestats(ai_settings)  #游戏的状态
    #创建屏幕实例
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_heigh))
    sb = Scoreboard(ai_settings, screen,stats)  #创建积分板的实例
    #创建play按钮实例
    play_button =Button(ai_settings,screen,"play")

    pygame.display.set_caption("alien invasion")

    #创建一个飞船
    ship =Ship(ai_settings,screen)
    bullets = Group()
    aliens = pygame.sprite.RenderUpdates()

    if stats.game_active:    #开始时只有游戏活动状态才能创建外星人军队
        gf.creat_fleet(ai_settings, screen, ship, aliens)


    while True:
            gf.check_event(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)
            if stats.game_active:  #判断飞船的命数是否用完了的标志
                gf.check_event(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)
                #按下键,飞船不停的移动
                ship.update()
                #子弹更新操作
                gf.update_bullets(ai_settings,screen, stats, sb, ship, aliens, bullets)
                #更新外星人的操作
                gf.update_aliens(ai_settings, stats, screen, sb, ship, aliens, bullets)
            #更新屏幕
            gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,play_button)
run_game()

 

英雄飞机类:

import pygame
from settings import Settings
from pygame.sprite import Sprite
class Ship (Sprite):
    def __init__(self, ai_settings,screen):
        super(Ship,self).__init__()
        #初始化飞船并设置初始化位置
        self.screen =screen
        #调用移动速度
        self.ai_settings = ai_settings
        #加载飞船图像并获取其外接矩形
        self.image =pygame.image.load("images/ship.png")
        self.rect =self.image.get_rect()
        self.screen_rect =screen.get_rect()  #获取屏幕的对象

        #将每艘飞船放在屏幕底部中央
        self.rect.centerx =self.screen_rect.centerx
        self.rect.centery = self.screen_rect.centery
        self.rect.bottom = self.screen_rect.bottom
        #存储飞船的外形方框的中心
        self.centerx = float(self.rect.centerx)
        self.centery = float(self.rect.centery)
        #移动标志
        self.moveing_right = False  #加一个变量,控制飞船右移
        self.moveing_left = False   #加一个变量,控制左移
        self.moveing_up = False
        self.moveing_down = False

    #飞船移动
    def update(self):
        if (self.moveing_right and self.rect.centerx <self.screen_rect.right): #判断一下是否跃出右边界,按住右键键,向右移动
            self.centerx += self.ai_settings.ship_speed_factor
        if(self.moveing_left and self.rect.centerx >0): #判断一下是否跃出左边界,按住左键键,向左移动
            self.centerx -= self.ai_settings.ship_speed_factor
        if self.moveing_up and self.rect.top > self.screen_rect.top:
            self.centery -= self.ai_settings.ship_speed_factor
        if self.moveing_down and self.rect.bottom < self.screen_rect.bottom:
            self.centery += self.ai_settings.ship_speed_factor
        # 根据self.centrx更新rect对象centerx
        self.rect.centerx = self.centerx
        self.rect.centery = self.centery

    #如果被撞了一次,就初始化飞船的置于中间
    def center_ship(self):
        """让飞船在屏幕上居中"""
        self.centerx = self.screen_rect.centerx
        self.rect.centery = self.screen_rect.centery
        self.rect.bottom = self.screen_rect.bottom

    def blitme(self):
        #在屏幕上指定位置绘制飞船
        self.screen.blit(self.image,self.rect)

 

敌机类:

import pygame
from pygame.sprite import Sprite
import random
from settings import *

class Alien(Sprite):
    #表示外星人
    def __init__(self,ai_settings,screen):
        #初始化外星人的大小和位置
        super(Alien , self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings
        #加载外星人图像,创建一个该图像的外接矩形
        self.image = pygame.image.load("./images/enemy/enemy0.png")
        self.rect = self.image.get_rect()
        #初始化外星人的位置,使他出现在屏幕左上角位置
        self.rect.x =self.rect.width
        self.rect.y =self.rect.height
        self.plane_type = 0
        self.speed = 2
        self.interval=1000
        #储存外星人的位置
        self.x =float(self.rect.x)

    def set_plane_type(self, type=1):
        """ 设置飞机类型

            type  0~6,目前的定义,可以添加

            type 不同,图像,飞行速度不同
        """
        self.plane_type = type
        if self.plane_type == 0:
            self.image = pygame.image.load("./images/enemy/enemy0.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 0.5
            # 子弹间隔
            self.interval = 1000

        elif self.plane_type == 1:
            self.image = pygame.image.load("./images/enemy/enemy1.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 0.5
            # 子弹间隔
            self.interval = 1500
        elif self.plane_type == 2:
            self.image = pygame.image.load("./images/enemy/enemy2.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 0.5
            self.interval = 2000
        elif self.plane_type == 3:
            self.image = pygame.image.load("./images/enemy/enemy3.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 1
            self.interval = 1500
        elif self.plane_type == 4:
            self.image = pygame.image.load("./images/enemy/enemy4.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            self.speed = 0.5
            self.interval = 1500
        elif self.plane_type == 5:
            self.image = pygame.image.load("./images/enemy/enemy5.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 1
            self.interval = 1500
        elif self.plane_type == 6:
            self.image = pygame.image.load("./images/enemy/enemy6.png")
            # 飞机矩形
            self.rect = self.image.get_rect()
            # 飞机速度
            self.speed = 1
            self.interval = 1500

        # 默认
        else:
            self.image = pygame.image.load("./images/enemy/enemy0.png")
            # 飞机矩形
            self.rect = self.image.get_rect()

            self.speed = 0.5
            # 子弹间隔
            self.interval = 1000

    # 设置飞机位置
    def set_pos(self, x, y):
        self.rect.x = x
        self.rect.y = y
    #表示让外星人动起来
    def update(self):
        self.rect.x += self.ai_settings.fleet_line_speed
        self.rect.y += self.speed+self.ai_settings.alien_speed_factor
        if not self.rect.colliderect(self.screen.get_rect()):
            self.kill()

    def set_motion_type(self, type=0):
        """
        飞机的飞行类型
             type 0
        """
        self.motion_type = type

    #绘制外星人
    def blitme(self):
        self.screen.blit(self.image,self.rect)

  

游戏计分和等级以及英雄机的显示类:

import pygame.font
from pygame.sprite import Group
from ship import Ship

class Scoreboard():
    #显示得分信息的类
    def __init__(self,ai_settings,screen,stats):
        #初始化得分涉及的属性
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings =ai_settings
        self.stats = stats

        #显示得分信息时使用的字体设置
        self.text_color =(255, 255, 255)
        self.font =pygame.font.SysFont('arial',40)

        #准备初始得分图像
        self.prep_score()
        #最高得分
        self.prep_high_score()
        #关卡等级
        self.prep_level()
        #飞船的命数
        self.prep_ships()

    #显示余下多少飞船
    def prep_ships(self):
        self.ships =Group()  #飞船命数形成组
        for ship_number in range(self.stats.ships_left):
            ship =Ship(self.ai_settings,self.screen)
            ship.rect.x =1070 +ship_number*ship.rect.width
            ship.rect.y =10
            self.ships.add(ship)

    #将等级转化成图像
    def prep_level(self):
        level_image_str ="Level:"+str(self.stats.level)
        self.level_image =self.font.render(level_image_str, True, self.text_color,self.ai_settings.bg_color)
        self.level_rect =self.level_image.get_rect()
        self.level_rect.left =self.screen_rect.left
        self.level_rect.top =self.score_rect.bottom+15

    #将最高得分转化成图像
    def prep_high_score(self):
        high_score =self.stats.high_score
        high_score_str ="High score:"+str(high_score)
        self.high_score_image =self.font.render(high_score_str,True,self.text_color,self.ai_settings.bg_color)

        #将最高得分放在屏幕中间
        self.high_score_rect =self.high_score_image.get_rect()
        self.high_score_rect.centerx =self.screen_rect.centerx
        self.high_score_rect.top = 10

    #将得分转化成一副渲染的图像
    def prep_score(self):
        score_str ="Score: "+str(self.stats.score)  #将得分变成字符串,然后变成图像
        self.score_image =self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color)

        #将得分放在屏幕右上角
        self.score_rect =self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right -20
        self.screen_rect.top =10   #与屏幕上端的距离

    #在屏幕显示得分
    def show_score(self):
        self.screen.blit(self.score_image,self.screen_rect)
        self.screen.blit(self.high_score_image, self.high_score_rect)
        self.screen.blit(self.level_image, self.level_rect)
        #绘制飞船
        self.ships.draw(self.screen)

 

6.完成效果图:

 

posted on 2020-12-08 21:17  xucancan  阅读(298)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3