‘’’
飞机大战-多排子弹(下面全部都是代码)
‘’’
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()