Python起步之基础知识初步应用(飞机大战)



#飞机大战

import pygame
import pygame.locals as GAME_GLOBALS
import pygame.event as GAME_EVENTS
import time
import random

#飞机类
class Baseplane(object):
    def __init__(self,x,y,load,speed,name):
        planeImageFile = load  #读取图片存储位置
        self.speed = speed
        self.image = pygame.image.load(planeImageFile).convert()
        self.X = x
        self.Y = y
        self.name = name
        self.bullt = []
        
        self.hit = False #表示是否要爆炸
        self.bomb_list = [] #用来存储爆炸时需要的图片
        self.crate_images() #调用这个方法向bomb_list中添加图片
        self.image_num = 0#用来记录while True的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,,当这个次数再次达到时,再显示下一个爆炸效果的图片
        self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号
        self.endImage = pygame.image.load('./飞机大战材料/bomb.png').convert()
    #添加爆炸图片
    def crate_images(self):
       pass
    def display(self,screen,Baseplane):
        """显示玩家的飞机"""
        #如果被击中,就显示爆炸效果,否则显示普通的飞机效果
        if self.hit == True:
            screen.blit(self.bomb_list[self.image_index], (self.X, self.Y))
            self.image_num+=1
            if self.image_num == 7:
                self.image_num=0
                self.image_index +=1
            if self.image_index>3:
                screen.blit(self.endImage,(145, 230))
                time.sleep(1)
                exit()#调用exit让游戏退出
                #self.image_index = 0
        else:
            screen.blit(self.image,(self.X, self.Y))
         # 不管玩家飞机是否被击中,都要显示发射出去的子弹
        for bullet in self.bullt:
            bullet.draw(screen)
            if bullet.boom_judge(screen,Baseplane):
                self.bullt.remove(bullet)
    #绘制飞机,并且绘制出对应的子弹
    def draw(self,screen,Baseplane):
        screen.blit(self.image,(self.X,self.Y))
        for bullts in self.bullt:
            bullts.draw(screen)
            if bullts.boom_judge(screen,Baseplane):
                self.bullt.remove(bullts)
            if bullts.judge(self.name):#判断飞机释放的子弹是否越界
                self.bullt.remove(bullts)
    #绘制飞机移动方法
    def move(self,dirction):
        pass
    def bomb(self):
        self.hit = True        
        
#玩家飞机类
class plane(Baseplane):
    def __init__(self,x,y,load,speed,name):
        super().__init__(x,y,load,speed,name)
        self.buttle = []#设置子弹个数
        
    def crate_images(self):
        self.bomb_list.append(pygame.image.load("./飞机大战材料/hero_blowup_n1.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/hero_blowup_n2.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/hero_blowup_n3.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/hero_blowup_n4.png"))
    #飞机移动    
    def move(self,dirction):
        if dirction =='LEFT' and self.X >= -50:
            self.X = self.X - self.speed
        elif dirction =='RIGHT' and self.X <= 360:
            self.X = self.X + self.speed
        elif dirction == 'SPACE':
            print('---------FIRE BOOOM--------')
            self.bullt.append(playerShell(self.X+43,self.Y-18,'./飞机大战材料/bullet-3.gif',int(51),int(39)))
            
    
    

#敌机类
class enemy_plane(Baseplane):
    def __init__(self,x,y,load,speed,name):
        super().__init__(x,y,load,speed,name,)
        self.dirction = 'R'
    def crate_images(self):
        self.bomb_list.append(pygame.image.load("./飞机大战材料/enemy0_down1.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/enemy0_down2.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/enemy0_down3.png"))
        self.bomb_list.append(pygame.image.load("./飞机大战材料/enemy0_down4.png"))   
    def move(self):
        if self.dirction == 'R':
            self.X = self.X + self.speed
            if self.X >= 320:
                self.dirction = 'L'
        elif self.dirction == 'L':
            self.X = self.X - self.speed
            if self.X <= -45:
                self.dirction = 'R'
        randomNum = random.randint(1,100)
        if randomNum in [50]:
            self.bullt.append(enemyShell(self.X+25,self.Y+39,'./飞机大战材料/bullet-1.gif',int(100),int(124)))

#子弹类     
class shells(object):
    def __init__(self,x,y,shell_File,sizex,sizey):
        shell_File = shell_File
        self.image = pygame.image.load(shell_File).convert()
        self.X = x
        self.Y = y
        self.boomimage = []
        self.sizeX = sizex
        self.sizeY = sizey
    def draw_blit(self,screen):
        screen.blit(self.image,(self.X,self.Y))
    def judge(self,flag):
        if flag == 'player':
            if self.Y  < 0:
                return True
            else:
                return False
        elif flag == 'enemy':
            if self.Y > 480:
                return True
            else:
                return False
    #判断是否炸毁:
    def boom_judge(self,screen,Baseplane):
        if (Baseplane.X<self.X) and (Baseplane.X+self.sizeX>self.X) and (Baseplane.Y<self.Y)and(Baseplane.Y+self.sizeY>self.Y):
            Baseplane.bomb()
            return True
    
class playerShell(shells):
    def __init__(self,x,y,shell_File,sizex,sizey):
        super().__init__(x,y,shell_File,sizex,sizey)
        self.boomimage =['./飞机大战材料/enemy0_down1.png','./飞机大战材料/enemy0_down2.png','./飞机大战材料/enemy0_down3.png','./飞机大战材料/enemy0_down4.png'] 
    def draw(self,screen):
        self.Y = self.Y-1
        self.draw_blit(screen)
        
    
class enemyShell(shells):
    def __init__(self,x,y,shell_File,sizex,sizey):
        super().__init__(x,y,shell_File,sizex,sizey)
        self.boomimage = ['./飞机大战材料/hero_blowup_n1.png','./飞机大战材料/hero_blowup_n2.png','./飞机大战材料/hero_blowup_n3.png','./飞机大战材料/hero_blowup_n4.png']
    def draw(self,screen):
        self.Y = self.Y+1
        self.draw_blit(screen)
        
def main():    
    screen = pygame.display.set_mode((320,480),0,32)
    bgimageFile = './飞机大战材料/timg.png'
    background = pygame.image.load(bgimageFile).convert()
    
    #创建玩家飞机对象
    plane_load = './飞机大战材料/hero.gif'
    player = plane(30,400,plane_load,int(8),'player')
    #创建敌机对象和运动行为
    enemy_load = './飞机大战材料/enemy-1.gif'
    enemy = enemy_plane(0,40,enemy_load,int(2),'enemy')
    
    #更新界面
    while True:
        screen.blit(background,(0,0))
        #读取键盘扫描数据
        for event in GAME_EVENTS.get():
            if event.type == GAME_GLOBALS.QUIT:
                print('QUIT!')
                exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a or event.key == pygame.K_LEFT:
                    print('LEFT!')
                    player.move('LEFT')
                elif event.key == pygame.K_d or event.key == pygame.K_RIGHT:
                    print('RIGHT!')
                    player.move('RIGHT')
                elif event.key == pygame.K_SPACE:
                    print('SPACE!')
                    player.move('SPACE')

        enemy.move()            
#        enemy.draw(screen,player)
#        player.draw(screen,enemy)
        enemy.display(screen,player)
        player.display(screen,enemy)
        pygame.display.update()
        #控制CPU的运行,避免因为死死循环造成CPU占用率过高
        time.sleep(0.01)
    
        
if __name__ == '__main__':
    main() 




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值