Python小游戏之 - 飞机大战 !
阅读原文时间:2023年07月09日阅读:2

用Python写的"飞机大战"小游戏

源代码如下:

# coding=utf-8
import random
import os
import pygame

用一个常量来存储屏幕的位置和大小,常量用全大写表示

SCREEN_RECT = pygame.Rect(0,0,480,600)

定义敌机事件定时器常量值

CREATE_ENEMY_EVENT = pygame.USEREVENT

定义发射子弹定时器常量值(由于USEREVENT这个常量值被敌机事件占用了,加1来改变数值)

HERO_FIRE_EVENT = pygame.USEREVENT + 1

飞机大战游戏精灵父类

class GameSprite(pygame.sprite.Sprite):
"""飞机大战游戏精灵父类"""
def __init__(self,image_name,speed=1):
# 调用父类的初始化方法
super().__init__()
# 定义对象的属性(分别是图像,位置,速度)
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed

def update(self):  
    # 在屏幕的垂直方向上移动  
    self.rect.y += self.speed

游戏背景精灵子类

class BackGround(GameSprite):
"""游戏背景精灵子类"""
def update(self):
# 调用父类的update方法
super().update()
if self.rect.y >= self.rect.height:
self.rect.y = -self.rect.height

敌机精灵子类

class Enemy(GameSprite):
"""敌机精灵子类"""
def __init__(self):
# 1.调用父类方法 , 创建敌机精灵 , 同时指定敌机图片
super().__init__("./picture/girl.png")
# 2.指定敌机的初始随机速度
self.speed = random.randint(1,5)
# 3.指定敌机的初始随机位置
self.rect.y = -self.rect.height
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0,max_x)

def update(self):  
    # 1.调用父类方法 , 保持垂直方向的飞行  
    super().update()  
    # 2.判断是否飞出屏幕 , 如果是 , 需要从精灵组删除敌机,释放掉内存  
    if self.rect.y >= SCREEN\_RECT.height:  
        self.kill()

def \_\_del\_\_(self):  
    pass

英雄飞机精灵子类

class Hero(GameSprite):
"""英雄飞机精灵子类"""
def __init__(self):
# 1.调用父类方法,定义image_name和初始速度参数
super().__init__("./picture/hero.png",0)
# 2.设置英雄的初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.y = SCREEN_RECT.height - self.rect.height
# 3.创建敌机精灵组
self.bullets = pygame.sprite.Group()

def update(self):  
    # 英雄在水平方向移动  
    self.rect.x += self.speed  
    # 控制英雄不能离开屏幕  
    if self.rect.x < 0:  
        self.rect.x = 0  
    elif self.rect.x > SCREEN\_RECT.width - self.rect.width:  
        self.rect.x = SCREEN\_RECT.width - self.rect.width

def fire(self):  
    # 创建子弹精灵  
    bullet = Bullet()  
    # 指定子弹精灵初始位置  
    bullet.rect.centerx = self.rect.centerx  
    bullet.rect.y = SCREEN\_RECT.height - self.rect.height - 50  
    # 将子弹添加到子弹精灵组  
    self.bullets.add(bullet)

子弹精灵子类

class Bullet(GameSprite):
"""子弹精灵子类"""
def __init__(self):
super().__init__("./picture/missile.png",-6)

def update(self):  
    super().update()  
    # 判断子弹是否飞出屏幕 , 及时删除子弹释放出内存空间  
    if self.rect.y < 0:  
        self.kill()

def \_\_del\_\_(self):  
    pass

飞机大战主游戏类

class PlaneGame(object):
"""飞机大战主游戏类"""
def __init__(self):
# 1.创建游戏窗口属性
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2.创建游戏的时钟属性
self.clock = pygame.time.Clock()
# 3.调用私有方法 , 创建精灵和精灵组
self.__create_sprites()
# 4.设置定时器事件 - 1s = 1000 ms
pygame.time.set_timer(CREATE_ENEMY_EVENT,700)
pygame.time.set_timer(HERO_FIRE_EVENT,500)

def \_\_create\_sprites(self):  
    """定义创建精灵和精灵组方法"""  
    # 创建背景精灵和精灵组  
    bg1 = BackGround("./picture/background.png")  
    bg2 = BackGround("./picture/background.png")  
    bg2.rect.y = -bg2.rect.height  
    self.back\_group = pygame.sprite.Group(bg1,bg2)  
    # 创建敌机精灵组  
    self.enemy\_group = pygame.sprite.Group()  
    # 创建英雄飞机的精灵和精灵组  
    self.hero = Hero()  
    self.hero\_group = pygame.sprite.Group(self.hero)

def start\_game(self):  
    while True:  
        # 1.设置刷新帧率  
        self.clock.tick(60)  
        # 2.事件监听  
        self.\_\_event\_handler()  
        # 3.碰撞检测  
        self.\_\_check\_collide()  
        # 4.更新/绘制精灵组  
        self.\_\_update\_sprites()  
        # 5.更新屏幕显示  
        pygame.display.update()

# 事件监听(监听定时器常量)  
def \_\_event\_handler(self):  
    for event in pygame.event.get():  
        # 判断是否退出游戏  
        if event.type == pygame.QUIT:  
            # 用类名.的方式来调用静态方法  
            PlaneGame.\_\_game\_over()  
        elif event.type == CREATE\_ENEMY\_EVENT:  
            # 创建敌机精灵对象  
            enemy = Enemy()  
            # 将敌机精灵添加到敌机精灵组  
            self.enemy\_group.add(enemy)  
        elif event.type == HERO\_FIRE\_EVENT:  
            self.hero.fire()  
    # 使用键盘提供的方法获取键盘按键 , 得到的是一个按键元组  
    keys\_pressed = pygame.key.get\_pressed()  
    if keys\_pressed\[pygame.K\_RIGHT\]:  
        self.hero.speed = 4  
    elif keys\_pressed\[pygame.K\_LEFT\]:  
        self.hero.speed = -4  
    else:  
        self.hero.speed = 0

# 碰撞检测  
def \_\_check\_collide(self):  
    # 子弹摧毁敌机  
    pygame.sprite.groupcollide(self.hero.bullets,self.enemy\_group,True,True)  
    # 敌机撞毁英雄飞机,返回的是碰撞的敌机列表  
    enemies\_list = pygame.sprite.spritecollide(self.hero,self.enemy\_group,True)  
    if len(enemies\_list) > 0:       # 列表有内容代表发生碰撞了  
        self.hero.kill()            # 释放掉内存  
        # 退出游戏  
        PlaneGame.\_\_game\_over()

# 更新/绘制精灵组  
def \_\_update\_sprites(self):  
    self.back\_group.update()  
    self.back\_group.draw(self.screen)

    self.enemy\_group.update()  
    self.enemy\_group.draw(self.screen)

    self.hero\_group.update()  
    self.hero\_group.draw(self.screen)

    self.hero.bullets.update()  
    self.hero.bullets.draw(self.screen)

@staticmethod  
def \_\_game\_over():  
    pygame.quit()  
    print("Game Over!")  
    print("\\n\\n游戏版本: 18.4.11\\n游戏名称: 飞机大战\\n游戏平台: windows\\n  开发者: ChenBin\\n")  
    # exit()  
    os.system("pause")

if __name__ == "__main__":
# 创建游戏对象
game = PlaneGame()
# 启动游戏
game.start_game()

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章