pygame-飞机大战(下·四)

在游戏内一共设计了四个关卡放在Battles文件夹下。

解释写在注释区。

帮助文档中关于关卡和其他信息的说明:

基本操作:
W/上——向上移动
S/下 ——向下移动
A/左 ——向左移动
D/右 ——向右移动
空格 ——    射击
  Q   ——  退出游戏
  E    ——  使用道具
  P    ——  打开/关闭商城 
  O   ——  打开/关闭本机颜色修改

单位介绍:
1.本机:
操作控制单位,初始生命值3,拥有初始武器
第一、二关卡碰撞进入复活计时,第三、四关卡拥有血条,
血条耗尽进入复活计时
可更换本机颜色(*)
2.普通敌机:敌对单位,第一、二关卡不发射子弹,第三关发射子弹
3.陨石:敌对单位,不可击毁(激光武器除外)
4.Bonus:友好单位,碰左右界反弹,击杀获得大量金币,无伤害
5.Boss:敌对单位,第二关一定条件出现,血量高,发射子弹并移动
6.敌机阵列:敌对单位,不发射子弹,无血条,全部击杀掉落随机道具
7.流星:敌对单位,随机出现,速度较快,撞击造成伤害
8.反弹球:敌对单位,随机出现,在屏幕反弹,撞击造成伤害
9.跟踪弹:敌对单位,随机出现,随本机移动而改变方向,撞击造成伤害
10.随机事件:中立单位,随机出现,击杀后产生对本机有利或不利的事件
可产生事件有:随机使用道具(减速/疾步/静止/清屏/无敌/加成)、
                      加血、减血、束缚、传送

武器介绍:
1.基本武器:发射上限受限,不可升级
2.霰弹武器:一次朝多个角度(3/5/7,)发射子弹,发射上限受限
3.激光武器:在充能完成后可释放持续一定时间的光波
4.榴弹武器:子弹爆炸时对范围(100/200/300)内敌方单位都会造成伤害

系统介绍:
1.关卡选择系统:通关之前关卡后在主页面进入游戏会出现本系统,
                         玩家可以选择已通关关卡进入
2.金币商城系统:玩家可使用金币在商城内消费
                       (强化属性/购买道具/购买武器)
3.武器强化系统:金币商城子系统,可使用金币对已拥有武器进行强化4

4.成就系统:当达成某项成就时右上角会弹出提示,并获得一定奖励,
                   详细内容可在主菜单页查看
5.信息系统:左下角会显示部分信息
6.本机颜色修改系统:按O或点击金币商城的按钮打开,可切换本机颜色

道具/事件介绍:
1.清屏:所有地方单位消失(金币/积分不会获得)
2.VIP:商城强化消耗降低20%(商城内购买直接生效)
3.永久加成卡:获得积分和金币永久加成(商城内购买直接生效)
4.超级加倍卡:一定时间内获得积分和金币高额临时加成
5.超级子弹:发射一颗持续时间的子弹,连续反弹,对敌方造成伤害
6.减速:一定时间内敌方单位速度降低
7.疾步:一定时间内本机移动速度加快
8.静止:一定时间内敌方单位不动
9.无敌:一定时间内本机避免伤害
10.加血:本机血量增加20
11.减血:本机血量减小20
12.束缚:一定时间内本机不可移动
13.恶魔:一定时间内移动方向颠倒
14.传送:本机被传送到随机位置

第一关: 出现单位:普通敌机、陨石、Bonus
             可使用道具:清屏、永久加倍卡、超级加倍卡、无敌
             可使用系统:所有
             特殊说明:达到一定积分通关

第二关: 出现单位:普通敌机、Boss、Boss子弹
             可使用道具:清屏、超级子弹
             可使用系统:金币商城、武器强化系统不可用
             特殊说明:击杀Boss通关

第三关: 出现单位:普通敌机、敌机阵列、敌机子弹
             可使用道具:静止、疾步、清屏、无敌、超级加倍卡
             可使用系统:所有
             特殊说明:榴弹武器禁用,普通敌机和本机拥有血条

第四关: 出现单位:敌机子弹、流星、反弹球、跟踪子弹、随机事件
             可使用道具:所有
             可使用系统:金币商城、武器强化系统不可用
             特殊说明:不可发射子弹,积分随时间增长而增加

第一关:

Battle1.py:

import pygame
import random
import math
import datetime
import re
import copy
from Codes.Kinds.Bullets import Bullet
from Codes.Kinds.Bullet_Shotgun import Bullet_Shotgun
from Codes.Kinds.Bullet_Light import Bullet_Light
from Codes.Kinds.Bullet_Boom import Bullet_Boom
from Codes.Kinds.Aliens import Alien
from Codes.Kinds.Stone import Stone
from Codes.Kinds.Bonus import Bonus
from pygame.sprite import Group
from Codes.Base.Animation import Animation
from Codes.Base.GameSettings import GSeI
from Codes.Logic.GameStates import GStI
from Codes.Base.Screen import SI
from Codes.Common.DrawBase import DrawOn,DCI


class Battle1(pygame.sprite.Sprite,DrawOn):
    def _init_(self):
        super(Battle1,self).__init__()
        super(Battle1,self).definePriority(9)
    def init(self):#初始化战场元素
        GSeI.init()
        self.priority=9
        self.screen=SI.screen
        self.host.position_reset()#本机位置重置
        self.bullets = Group()#四个精灵组分别存放本机子弹/敌机/石头/bonus
        self.aliens = Group()
        self.stone=Group()
        self.bonus=Group()
        self.score=0#积分-排行榜
        self.gold=0#金币--升级/购买
        self.time=0 #游戏计时按钮   
        self.kill_fly=0 #记录场击杀
        self.kill_bonus=0
        self.kill_stone=0
        self.acc=0#为1时候到下一关
        self.framerate = pygame.time.Clock()
        self.framerate.tick(30)
        self.group =pygame.sprite.Group()#用来存放动画类
        self.animation = Animation(self.screen)#初始化实例化并读取动画,以后用到直接复制即可,免重复读取浪费时间
        self.animation_stone = Animation(self.screen)
        self.animation_bonus = Animation(self.screen)
        self.animation_range=[Animation(self.screen,90),Animation(self.screen,90),Animation(self.screen,90)]
        self.animation.load("images/explode/explode.png", 100, 100, 12)
        self.animation_stone.load("images/collapse/collapse.png", 200, 120, 8)  
        self.animation_bonus.load("images/star/bonus.png", 80, 80, 8)
        temp=0
        for a_r in self.animation_range:
            a_r.load("images/range/range_boom_"+str(50*temp+100)+".png",100*temp+200,100*temp+200,10)
            temp=temp+1
        self.draw_text('第一章:布罗列斯会战')
        
    def pip(self):
        pass
    
    def setHost(self, element):#设置操纵对象
        self.host = element
        
        
    def update_animation(self):#更新group里的动画
        ticks = pygame.time.get_ticks()
        self.group.update(ticks)
        new_group=pygame.sprite.Group()
        for animation in self.group:
            if animation.life<animation.end:
                new_group.add(animation)
        self.group=new_group
        self.group.draw(self.screen)
        pygame.display.update()


    def clear_aliens(self):#地方目标全部清除
        for alien in self.aliens:
            new_animation=copy.copy(self.animation)
            new_animation.position(alien.rect.center[0]-25,alien.rect.center[1]-25)
            new_animation.life=1
            self.group.add(new_animation)
            alien.kill() 
        for alien in self.stone:
            new_animation=copy.copy(self.animation_stone)
            new_animation.position(alien.rect.center[0]-100,alien.rect.center[1]-50)
            new_animation.life=1
            self.group.add(new_animation)
            alien.kill() 
        
    def hit(self):#如果已经发射出的未碰撞/自杀的子弹小于子弹上限 继续装填子弹
        if GSeI.weapon==0:#普通子弹
            if len(self.bullets) < GSeI.bullets_allowed:
                new_bullet = Bullet()
                new_bullet.init(self.host,90,1)
                self.bullets.add(new_bullet)
                
        elif GSeI.weapon==2:#霰弹
            if len(self.bullets) <=GSeI.bullets_allowed-3:
                self.num=GSeI.shotgun_rank*2+1
                if self.num==3:
                    self.theta=[60,90,120]
                elif self.num==5:
                    self.theta=[60,75,90,105,120]
                else:
                    self.theta=[60,70,80,90,100,110,120]
                for i in range(self.num):
                    if len(self.bullets) < GSeI.bullets_allowed:
                        new_bullet = Bullet_Shotgun()
                        new_bullet.init(self.host,self.theta[i])
                        self.bullets.add(new_bullet)
                        
        elif GSeI.weapon==1:#激光枪
            if GStI.shotgun_active==False and GSeI.charge_left==0:#如果当前武器未打开,并且剩余充能时间为0(充能完成),打开武器
                GStI.shotgun_active=True
                new_bullet = Bullet_Light()
                new_bullet.init(self.host)
                
                self.bullets.add(new_bullet)
        elif GSeI.weapon==3:#榴弹
            if len(self.bullets) < GSeI.bullets_allowed:
                new_bullet = Bullet_Boom()
                new_bullet.init(self.host)
                self.bullets.add(new_bullet)
                
    def draw(self):
        self.update_animation() 
        
    def preDraw(self):
        DCI.add(self) 
        
    def update_achi(self):
        if self.gold>=10000:
            self.show_achi(4,'富可敌国')
        if self.score>=100000:
            self.show_achi(3,'混分巨兽')
        if GSeI.buy.count(1)==4:
            self.show_achi(13,'武器大师')
        if GSeI.gold_get>=10000000:
            self.show_achi(10,'打工皇帝')
        if GSeI.gold_consume>=1000000:
            self.show_achi(11,'挥金如土')
        if self.kill_bonus>=10:
            self.show_achi(2,'天选之子')
        if self.kill_stone>=10:
            self.show_achi(1,'石挡碎石')
        if self.kill_fly>=100:
            self.show_achi(0,'杀身成仁')
        if GSeI.kill_fly>=10000:
            self.show_achi(5,'杀敌如麻')
        
    def update(self, delta):#刷新
        self.preDraw()
        if self.acc==1:
            return
        self.time+=delta
        self.update_achi()
        self.update_bullets(delta)#更新子弹位置
        self.check_Bullet()#检查子弹是否超出范围
        self.update_aliens(delta)#更新地方位置
        #特殊时间计算
        if GSeI.weapon==1:#激光枪
            if GStI.shotgun_active==True:
                GSeI.left_time-=delta#剩余释放时间
                if GSeI.left_time<0:#进入充能
                    for bullet in self.bullets.sprites():#子弹杀死
                        bullet.kill()
                    GSeI.left_time=0#
                    GSeI.charge_left=GSeI.charge_time#初始化
                    GStI.shotgun_active=False
            else:
                GSeI.charge_left-=delta
                if GSeI.charge_left<0:
                    GSeI.left_time=GSeI.max_time
                    GSeI.charge_left=0
        if  GStI.wudi==True:   #武器状态
            GSeI.wudi_left-=delta
            if GSeI.wudi_left<0:
                GSeI.wudi_left=0
                GStI.wudi=False
        if  GStI.tac==True:    #积分加倍
            GSeI.tac_left-=delta
            if GSeI.tac_left<0:
                GSeI.tac_left=0
                GStI.tac=False
        #通关
        if self.score>5000:
            if self.time<300:
                self.show_achi(14,'速战速决')
            GSeI.pass_clear[1]=1
            GSeI.weapon=0
            self.acc=1
            self.draw_text('第二章:月面夺还作战')
            #进入下一关

    def check_Bullet(self):#超过屏幕的子弹移除/自杀
        if GSeI.weapon!=1:
            for bullet in self.bullets.copy():
                if bullet.rect.bottom <= 0:
                    bullet.kill()
    
    def create_alien(self):#生成一个外星人
        alien = Alien()
        self.aliens.add(alien)
        
    def create_stone(self):
        s=Stone()
        self.stone.add(s)  
        self.draw_text('产生陨石')
        
    def create_bonus(self):
        b=Bonus()
        self.bonus.add(b)
        self.draw_text('产生Bonus')
        
    def update_aliens(self, delta):#更新敌方单位位置并检测与本机碰撞
        self.check_fleet_edges()#检查是否到两边
        self.aliens.update(delta)
        self.stone.update(delta)
        self.bonus.update(delta)
        if pygame.sprite.spritecollide(self.host,self.stone,False,pygame.sprite.collide_mask)\
        or pygame.sprite.spritecollide(self.host,self.aliens,False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值