Python基础常用的 飞机大战 案例详解

飞机大战是Python基础期常用的案例,主要涉及了pygame模块,面向对象,逻辑循环知识点的运用

实现效果:
Python基础常用的 飞机大战 案例详解_第1张图片

对象模块命名为“jingling.py”

import pygame    #引入图形模板模块
import random    #引入随机数模块
SCREEN_RECT = pygame.rect.Rect(0,0,500,800)   #建立一个500*800像素的窗口作为游戏界面窗口

class GameSprite(pygame.sprite.Sprite):         #定义一个图形属性类,继承pygame里面原有的Sprite模块

    def __init__(self, image, speed=1):      #定义一个图片信息属性,一个速度属性
      
        super().__init__()                              # 2.调用父类的初始化方法
      
        self.image = pygame.image.load(image)     # 3.获取图片对象信息
      
        self.rect = self.image.get_rect()                    # 4.获取图片的矩形对象常量(坐标,宽高等信息)
        self.speed = speed

  
    def update(self, *args):                      # 复写父类的update 方法
       
        self.rect.y += self.speed                 # 更改精灵y轴的值

        if self.rect.y>=(SCREEN_RECT.height+10):            #设置超出边界10像素点的图形销毁,释放内存
            self.kill()                                                                  #销毁

class Background(GameSprite):                                      #继承建一个游戏背景
    def update(self, *args):
        super().update()                                                       #继承父类update方法
        if self.rect.y>=SCREEN_RECT.height:                    #更改方法里当前对象需要修改的信息(设置一个背景循环)
            self.rect.y =-self.rect.height

class Enemy(GameSprite):                                      #建一个敌机类
    def __init__(self):
        super().__init__('img/222.jpg')                          #继承父类,传入一张图片建立敌机信息
        self.speed=random.randint(2,4)                       #让后面调用时每一个新键的对象   随机获得速度

        self.rect.bottom=0                                           #模型底部坐标赋值为  0
        max_x=SCREEN_RECT.width - self.rect.width       
        self.rect.x=random.randint(0,max_x)                #使敌机对象能从游戏框的不同位置随机建立

    # def update(self, *args):                                     #上面销毁出框敌机 也可单独复写此内容单独销毁
    #     #调用父类的update方法让敌机保持移动
    #     super().update()
class Hero(GameSprite):                                     #建立英雄机类框架
    def __init__(self):
        super().__init__('img/enemy2_fly_1.png',speed=0)   #传入英雄机图片信息
    
        self.rect.bottom=SCREEN_RECT.height-50      #让英雄机建立在想要的坐标
        self.rect.centerx=SCREEN_RECT.centerx         #让英雄机建立在中心
        self.bullet_group=pygame.sprite.Group()          #建立英雄机子弹组

    def update(self, *args):                                          #复写英雄机update函数
        self.rect.x += self.speed
        if self.rect.x<=0:                                                   #限制英雄机不超出游戏框
            self.rect.x=0
        elif self.rect.right>=SCREEN_RECT.width:
            self.rect.right=SCREEN_RECT.width
    def fire(self):                                                        #建立子弹发射函数
        print('发射子弹')
        bullet=Bullet()                                                    #建立子弹对象
        
        bullet.rect.centerx=self.rect.centerx               #定义子弹的中心线,让子弹跟飞机走
        bullet.rect.bottom=self.rect.y+50                    #让子弹建立的位置吃入英雄机50像素
        self.bullet_group.add(bullet)                           #将每个建立的子弹对象加入   子弹组

class Bullet(GameSprite):                                     #建立子弹类
    def __init__(self):
        super().__init__('img/own4.png',speed=-3)

逻辑部分,及主程序命名为“aa”’

import pygame   
from jingling_diji import *                                                 #加载上面我们做好的模块
SCREEN_RECT = pygame.rect.Rect(0,0,500,800)      #录下屏幕信息

class PlaneGame(object):                                              #建一个类,方便后面 对象函数间 的属性调用

    def __init__(self):
        self.screen=pygame.display.set_mode(SCREEN_RECT.size)    #显示游戏界面屏幕
        self.clock = pygame.time.Clock()                                                  #创建一个时钟对象
        self.create_sprites()                                                                       #放在init里是为了运行时初始化运行一下
        pygame.time.set_timer(pygame.USEREVENT,1000)#1000毫秒触发一次定时器,执行一次自定义事件
        pygame.time.set_timer(pygame.USEREVENT+1,500)  #500毫秒触发
    def create_sprites(self):
        
        bg = Background('img/123.jpg')                                       #1.创建背景精灵
        bg1=Background('img/123.jpg')                                       #1.创建两个同样背景可循环播放
        bg1.rect.y=-bg1.rect.height                                             #定义下背景二的生成位置
       
        self.bg_group= pygame.sprite.Group(bg,bg1)                   #2.加入背景组    后面一些变化 就可以同时作用了

        self.emeny_grounp=pygame.sprite.Group()                 #创建敌机组

        self.hero=Hero()
        self.hero_group=pygame.sprite.Group(self.hero)         #创建添加英雄机对象

    @staticmethod                                                                 #设静态方法方便结束程序
    def game_over():
        pygame.quit()                                                                 #类里的退出函数
        exit()

    def check_collide(self):                                                   #碰撞销毁
        pygame.sprite.groupcollide(self.hero.bullet_group,self.emeny_grounp,True,True)   #两组里的对象接触互相都销毁
        ret=pygame.sprite.spritecollide(self.hero,self.emeny_grounp,True)      #英雄机    碰撞敌机组里的任何一个对象,对象销毁。英雄机不能销毁          返回的结果是True    赋值给ret
        if ret:
            print('game over')                            #游戏结束
            self.game_over()


    def catch_event(self):                          #游戏框里的捕捉函数   '''捕获监听事件'''
     
        event_list=pygame.event.get()        #捕获鼠标位置 到信息,生成列表
        for event in event_list:                  
        		if event.type == pygame.QUIT:               #判断捕获的信息情况   如果是退出按钮
                PlaneGame.game_over()                       #游戏结束

            elif event.type==pygame.USEREVENT:      #init  里的时间触发
                print('敌机出场了')
                #创建敌机
                enemy=Enemy()
                self.emeny_grounp.add(enemy)                #将敌机添加到敌机组
            elif event.type==pygame.USEREVENT+1:        #init里的第二个触发
                self.hero.fire()                                               #发射函数
        pressed_tup=pygame.key.get_pressed()            #捕捉到的键盘输入
        # print(pressed_tup)
        if pressed_tup[pygame.K_LEFT]:                   #捕捉到的如果是左键
            print('向左')
            self.hero.speed=-2                                        #改变变化量的值
    
        elif pressed_tup[pygame.K_RIGHT]:
            print('向右')
            self.hero.speed = 2
        else:
            self.hero.speed=0                                           #设置不按键时,停止移动
    def update_sprites(self):
        '''运行创建更新图像精灵组'''
        self.bg_group.update()
        self.bg_group.draw(self.screen)

        self.emeny_grounp.update()
        self.emeny_grounp.draw(self.screen)

        self.hero_group.update()
        self.hero_group.draw(self.screen)

        self.hero.bullet_group.update()
        self.hero.bullet_group.draw(self.screen)
    def start(self):                                                       #开始函数
        while True:                                                        #游戏运行画面变化的过程就是   循环创建不同坐标图形的循环刷新
            self.clock.tick(60)
            self.check_collide()
            self.catch_event()
            self.update_sprites()
            pygame.display.update()

if __name__ == '__main__':
    game = PlaneGame()
    game.start()

ok,结束

你可能感兴趣的:(Python基础)