飞机大战

‘’’
飞机大战-多排子弹(下面全部都是代码)

‘’’
import pygame
import sys
import random

分别记录游戏窗口的高与宽

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

v1.6完善我方飞机

class PlaneHero():
# 属性
def init(self, x, y):
# 图片
self.image = pygame.image.load(图片素材路径)
# 移动速度
self.speed = 20
# 根据飞机的图片获取所在的区域
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
# 状态
self.live = True
# 记录飞机的移动方向
self.direction = ‘u’
# 记录飞机的图片索引
self.image_index = 1

# v1.7完善飞机移动
# v1.8 增加移动过程中的边界控制
def move(self):
    key_list = pygame.key.get_pressed()
    # 如果上方向键就被按下
    if key_list[pygame.K_UP]:
        # v1.8增加判断
        if self.rect.y > 0:
            self.rect.y -= self.speed
    elif key_list[pygame.K_DOWN]:
        if self.rect.y < SCREEN_HEIGHT - 100:
            self.rect.y += self.speed
    elif key_list[pygame.K_LEFT]:
        if self.rect.x > 0:
            self.rect.x -= self.speed
    elif key_list[pygame.K_RIGHT]:
        if self.rect.x < SCREEN_WIDTH - 100:
            self.rect.x += self.speed

# 展示我方飞机
def display_plane_hero(self):
    if self.image_index == 1:
        self.image = pygame.image.load(r'F:\老师发的文件\系统班1\day02\plane_img\hero1.png')
        self.image_index += 1
    else:
        self.image = pygame.image.load(r'F:\老师发的文件\系统班1\day02\plane_img\hero2.png')
        self.image_index = 1
    # 将飞机图片加载到窗口中
    Game.window.blit(self.image, self.rect)

    # v2.3新增我方是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断我方是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self, plane_enemy):
            # 修改我方状态
            # self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

v2.5 爆炸效果

class Bomb:
def init(self,rect):
self.rect = rect
# 存储组成爆炸效果的所有图片
self.image_list = [
pygame.image.load(r’F:\图片素材路径\plane_img\enemy0_down1.png’),
pygame.image.load(r’F:\图片素材路径\plane_img\enemy0_down2.png’),
pygame.image.load(r’F:\图片素材路径\plane_img\enemy0_down3.png’),
pygame.image.load(r’F:\图片素材路径\plane_img\enemy0_down4.png’)
]
# 记录图片索引值
self.image_index = 0
# 根据索引值取图片
self.image = self.image_list[self.image_index]
# 爆炸效果是否应该存在
self.live = True
# 展示爆炸效果
def display_bomb(self):
if self.image_index < len(self.image_list):
self.image = self.image_list[self.image_index]
self.image_index += 1
else:
self.live = False
self.image_index = 0
Game.window.blit(self.image,self.rect)

敌方飞机

class PlaneEnemy():
# 属性
def init(self, x, y):
# 图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\enemy0.png’)
# 状态
self.live = True
# 移动速度
self.speed = 30
# 区域
self.rect = self.image.get_rect()
# 坐标
self.rect.x = x
self.rect.y = y

# 行为
def move(self):
    if self.rect.y < SCREEN_HEIGHT:
        self.rect.y += self.speed
    else:
        self.live = False

# 将敌机加载到窗口中
def display_plane_enemy(self):
    Game.window.blit(self.image, self.rect)

pass

子弹类

class Bullet1():
def init(self, plane):
# 子弹图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\bullet.png’)
# 子弹的区域
self.rect = self.image.get_rect()
# 子弹的具体位子
self.rect.x = plane.rect.x
self.rect.y = plane.rect.y - 30
# 子弹的速度
self.speed = 30
# 记录子弹的状态
self.live = True

# 子弹的移动
def move(self):
    if self.rect.y > 0:
        self.rect.y -= self.speed
    else:
        self.live = False

# 将子弹加入到窗口中
def display_bullet(self):
    Game.window.blit(self.image, self.rect)



# v2.3新增子弹是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断子弹是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self,plane_enemy):
            # 修改子弹状态
            self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

pass

class Bullet2():
def init(self, plane):
# 子弹图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\bullet.png’)
# 子弹的区域
self.rect = self.image.get_rect()
# 子弹的具体位子
self.rect.x = plane.rect.x + 20
self.rect.y = plane.rect.y - 30
# 子弹的速度
self.speed = 30
# 记录子弹的状态
self.live = True

# 子弹的移动
def move(self):
    if self.rect.y > 0:
        self.rect.y -= self.speed
    else:
        self.live = False

# 将子弹加入到窗口中
def display_bullet(self):
    Game.window.blit(self.image, self.rect)



# v2.3新增子弹是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断子弹是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self,plane_enemy):
            # 修改子弹状态
            self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

pass

class Bullet3():
def init(self, plane):
# 子弹图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\bullet.png’)
# 子弹的区域
self.rect = self.image.get_rect()
# 子弹的具体位子
self.rect.x = plane.rect.x + 40
self.rect.y = plane.rect.y - 30
# 子弹的速度
self.speed = 30
# 记录子弹的状态
self.live = True

# 子弹的移动
def move(self):
    if self.rect.y > 0:
        self.rect.y -= self.speed
    else:
        self.live = False

# 将子弹加入到窗口中
def display_bullet(self):
    Game.window.blit(self.image, self.rect)



# v2.3新增子弹是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断子弹是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self,plane_enemy):
            # 修改子弹状态
            self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

pass

class Bullet4():
def init(self, plane):
# 子弹图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\bullet.png’)
# 子弹的区域
self.rect = self.image.get_rect()
# 子弹的具体位子
self.rect.x = plane.rect.x + 60
self.rect.y = plane.rect.y - 30
# 子弹的速度
self.speed = 30
# 记录子弹的状态
self.live = True

# 子弹的移动
def move(self):
    if self.rect.y > 0:
        self.rect.y -= self.speed
    else:
        self.live = False

# 将子弹加入到窗口中
def display_bullet(self):
    Game.window.blit(self.image, self.rect)



# v2.3新增子弹是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断子弹是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self,plane_enemy):
            # 修改子弹状态
            self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

pass

class Bullet5():
def init(self, plane):
# 子弹图片
self.image = pygame.image.load(r’F:\图片素材路径\plane_img\bullet.png’)
# 子弹的区域
self.rect = self.image.get_rect()
# 子弹的具体位子
self.rect.x = plane.rect.x + 80
self.rect.y = plane.rect.y - 30
# 子弹的速度
self.speed = 30
# 记录子弹的状态
self.live = True

# 子弹的移动
def move(self):
    if self.rect.y > 0:
        self.rect.y -= self.speed
    else:
        self.live = False

# 将子弹加入到窗口中
def display_bullet(self):
    Game.window.blit(self.image, self.rect)



# v2.3新增子弹是否打中敌机
def hit_plane_enemy(self):
    # 遍历所有敌机,看是否与子弹碰撞
    for plane_enemy in Game.plane_enemy_list:
        # 判断子弹是否与敌机碰撞,如果碰撞,返回一个True,否则得到一个False
        if pygame.sprite.collide_rect(self,plane_enemy):
            # 修改子弹状态
            self.live = False
            # 修改敌机状态
            plane_enemy.live = False
            Game.score += 1
            # v2.5 创建爆炸效果对象,存储到列表中
            bomb = Bomb(plane_enemy.rect)
            Game.bomb_list.append(bomb)

pass

游戏类

class Game():
# v1.3 新增存储主窗口的变量
window = None # 类属性,全局唯一
# v1.6 新增我方飞机属性
plane_hero = None
# v1.9新增存储我方子弹的列表
bullet_hero_list = []

# v2.1 存储所有敌方飞机的列表
plane_enemy_list = []
# v2.4 记录当前游戏得分
score = 0
# v2.5 存储所有爆炸效果的列表
bomb_list = []
# v1.3 创建主窗口的函数
def init_window(self):
    # v1.3给主窗口赋值
    Game.window = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# v1.4初始化游戏背景
def init_bg_image(self):
    # 将背景图片加载到窗口中
    # 根据绝对路径加载
    image = pygame.image.load(r'F:\老师发的文件\系统班1\day02\plane_img\bg.png')
    Game.window.blit(image, (0, 0))

# 2.4 加载游戏得分的文字
def load_score(self):
    # 初始化文字模块
    pygame.font.init()
    # 指定字体名,字号,是否加粗
    font = pygame.font.SysFont('kaiti',20,True)
    # 用指定的字体执行当前的内容
    sf = font.render(f'当前积分:{Game.score}',True,(225,0,0))
    # 将绘制好的内容加入到窗口中
    Game.window.blit(sf,(640,20))

# 2.5 加载所有爆炸效果的动画
def load_bomb(self):
    for b in Game.bomb_list:
        if b.live:
            b.display_bomb()
        else:
            Game.bomb_list.remove(b)

# v1.5新增事件处理的函数
def deal_event(self):
    # 获取所有事件,所有事件放到列表中
    all_event_list = pygame.event.get()
    # 遍历事件,进行判断,看到底是鼠标事件还是键盘事件
    for event in all_event_list:
        if event.type == pygame.QUIT:
            # 直接结束程序
            print('程序结束')
            sys.exit()
        elif event.type == pygame.KEYDOWN:  # 判断是否是键盘事件
            # v1.9 如果是按的空格按键,产生一个子弹
            if event.key == pygame.K_SPACE:
                # 创建一个子弹,装进列表中
                a = Bullet1(Game.plane_hero)
                Game.bullet_hero_list.append(a)
                b = Bullet2(Game.plane_hero)
                Game.bullet_hero_list.append(b)
                c = Bullet3(Game.plane_hero)
                Game.bullet_hero_list.append(c)
                d = Bullet4(Game.plane_hero)
                Game.bullet_hero_list.append(d)
                e = Bullet5(Game.plane_hero)
                Game.bullet_hero_list.append(e)
                print('当前列表中一共有子弹', len(Game.bullet_hero_list))
            print('按下按键')
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print('按下鼠标')

# 初始化我方飞机
def init_plane_hero(self):
    Game.plane_hero = PlaneHero(350, 350)

# 将飞机加载到窗口中
def load_plane_hero(self):
    # 增加消灭敌机函数
    Game.plane_hero.hit_plane_enemy()

    # 使用飞机的展示飞机函数
    Game.plane_hero.display_plane_hero()

# 初始化敌方飞机
def init_plane_enemy(self):
    for i in range(1, 11):
        # 创建敌机
        plane_enemy = PlaneEnemy(random.randint(50, 150) * i, random.randint(-50, -10) * i)
        # 将敌机加载到窗口中
        Game.plane_enemy_list.append(plane_enemy)

# v2.1 将敌机加载到窗口中
def load_plane_enemy(self):
    for plane_enemy in Game.plane_enemy_list:
        # v2.2新增移动
        if plane_enemy.live:
            plane_enemy.display_plane_enemy()
            plane_enemy.move()
        else:
            Game.plane_enemy_list.remove(plane_enemy)
    print('当前列表中有敌机', len(Game.plane_enemy_list))

# v1.9新增我方子弹的函数
def load_bullet_hero(self):
    # for i in range(1,5):
    for b in Game.bullet_hero_list:

        # 如果子弹活着,加载子弹
        if b.live:
            # 使用子弹调用加载子弹的函数
            b.display_bullet()
            # 调用子弹的移动函数
            b.move()
            # 调用子弹是否打中敌机函数
            b.hit_plane_enemy()
        else:
            # 否则,删除子弹
            Game.bullet_hero_list.remove(b)

# 开始游戏
def start_game(self):
    pygame.display.init()
    # v1.3调用初始化窗口函数
    self.init_window()
    pygame.display.set_caption('飞机大战v2.2')

    # v1.6调用飞机初始化方法
    self.init_plane_hero()
    i = 0
    while True:
        # v 2.2新增无限加载敌机
        i += 1
        if i == 20:
            self.init_plane_enemy()
            i = 0
        # v1.7 修改加载背景的位置
        # 调用背景图片函数
        self.init_bg_image()
        # 2.4加载得分文字
        self.load_score()
        # v1.5调用事件处理函数
        self.deal_event()
        # v1.6调用加载飞机函数
        self.load_plane_hero()
        # v1.7调用飞机的移动函数
        if Game.plane_hero.live:
            Game.plane_hero.move()
        # v1.9 调用加载子弹的函数
        self.load_bullet_hero()
        # v 2.1 调用加载敌机的方法
        self.load_plane_enemy()
        # v2.5 调用爆炸效果的方法
        self.load_bomb()
        # 窗口刷新
        pygame.display.update()

# 游戏结束
def game_over(self):
    pass

调用开始游戏函数(方法)

Game().start_game()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值