import pygame
import time
import random
from pygame.locals import *
size = width, height = 480, 800
i = 0
# 提取父类
class Plane(object):
def __init__(self, screen_temp, x, y, image_path):
# 位置
self.x = x # 200 0
self.y = y # 650 0
# 屏幕对象
self.screen = screen_temp
# 飞机图片对象
self.image_plane = pygame.image.load(image_path)
# 准备一个存放子弹的列表
self.bullet_list = []
def display(self):
self.screen.blit(self.image_plane, (self.x, self.y))
# 空列表 要删除的子弹
remove_bullet_list = []
# 遍历子弹
for bullet in self.bullet_list:
bullet.display()
bullet.move()
# 判断子弹是否越界
if bullet.check():
# self.bullet_list.remove(bullet)
remove_bullet_list.append(bullet)
# 移除
for remove_bullet in remove_bullet_list:
self.bullet_list.remove(remove_bullet)
# 定义一个我方飞机类
class MyPlane(Plane):
def __init__(self, screen_temp):
super().__init__(screen_temp, 200, 650, "./feiji/plane.png")
# 飞机移动
def move_left(self):
self.x -= 5
def move_right(self):
self.x += 5
def move_up(self):
self.y -= 5
def move_down(self):
self.y += 5
# 重写display
def display(self, enemy):
self.enemy = enemy
super().display()
for bullet in self.bullet_list:
flag = bullet.check_shoot(self.enemy)
if flag:
# 根据flag改变敌机isbomb
self.enemy.isbomb = flag
break
# 定义开火发射动作
def fire(self):
bullet = Bullet(self.screen, self.x, self.y)
self.bullet_list.append(bullet)
# 定义一个敌机类
class EnemyPlane(Plane):
def __init__(self, screen_temp):
super().__init__(screen_temp, 0, 0, "./feiji/enemy3.png")
self.direction = "right"
self.bomb_image_list = [] # 存放爆炸的图片对象列表
self.__get_bomb_image()
self.image_length = len(self.bomb_image_list)
self.isbomb = False # 初始情况下没有爆炸
self.image_num = 0 # 表示显示过的
self.image_index = 0 # 要显示的图片的下标
# 加载爆炸图片
def __get_bomb_image(self):
for i in range(1, 7):
image_path = "./planeboom/Plane_Boom_0" + str(i) + ".png"
self.bomb_image_list.append(pygame.image.load(image_path))
# 重写display
def display(self):
# 添加自己的需求
if self.isbomb:
# 显示爆炸图片
bomb_image = self.bomb_image_list[self.image_index]
self.screen.blit(bomb_image, (self.x, self.y))
self.image_num += 1
# 让每张图片多呆一会儿
if self.image_num == (self.image_length + 1):
self.image_num = 0
self.image_index += 1
if self.image_index > (self.image_length - 1):
self.image_index = 5
time.sleep(1)
exit()
else:
# 仍然显示飞机
super().display()
# 敌机移动
def move(self):
# self.x += 5
# # 判断self.x的值
# if self.x > (480 - 56):
# self.x -= 5
# 控制移动
if self.direction == "right":
self.x += 5
elif self.direction == "left":
self.x -= 5
# 控制方向
if self.x > (480 - 56):
self.direction = "left"
elif self.x < 0:
self.direction = "right"
# 开火 发射子弹
def fire(self):
random_number = random.randint(1, 50)
if random_number == 8 or random_number == 50:
self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))
# bullet类 fire() bullet对象 ----》飞机的display() ---》遍历子弹列表 :子弹显示,子弹动起来
# 定义子弹的父类
class BaseBullet(object):
def __init__(self, screen_temp, x, y, bullet_path):
self.x = x
self.y = y
self.screen = screen_temp
self.image_bullet = pygame.image.load(bullet_path)
def display(self):
self.screen.blit(self.image_bullet, (self.x, self.y))
# 添加子弹类
class Bullet(BaseBullet):
# 指定子弹的位置和子弹的图片对象
def __init__(self, screen_temp, x, y):
super().__init__(screen_temp, x + 21, y - 25, "./feiji/HeroBullet1.png")
def move(self):
self.y -= 3
def check(self):
if self.y < -25:
return True
else:
return False
# 是否击中敌机
def check_shoot(self, enemy):
if self.x > enemy.x and self.x < enemy.x + 50:
if self.y > enemy.y and self.y < enemy.y + 31:
print("击中目标飞机")
return True
return False
# 敌机子弹
class EnemyBullet(BaseBullet):
# 指定子弹的位置和子弹的图片对象
def __init__(self, screen_temp, x, y):
super().__init__(screen_temp, x + 23, y + 31, "./feiji/EnemyBullet1.png")
# 敌机子弹的移动
def move(self):
self.y += 3
# 判断越界
def check(self):
if self.y > 800:
return True
else:
return False
# 控制键盘操作的函数
def key_control(hero_temp, enemy_temp): # hero_temp就是飞机对象
# 添加键盘事件
for event in pygame.event.get():
# 判断事件是什么事件
if event.type == QUIT:
print("exit退出")
exit() # 退出系统
if event.type == KEYDOWN:
if event.key == K_LEFT or event.key == K_a:
# x轴的变化
hero_temp.move_left()
print("left")
if event.key == K_RIGHT or event.key == K_d:
# x轴的变化
hero_temp.move_right()
print("right")
if event.key == K_UP or event.key == K_w:
# y轴的变化
hero_temp.move_up()
print("up")
if event.key == K_DOWN or event.key == K_s:
# y轴的变化
hero_temp.move_down()
print("down")
if event.key == K_SPACE:
print("space")
hero_temp.fire()
if event.key == K_b:
print("爆炸啦!")
enemy_temp.isbomb = True
# 入口
def main():
pygame.init()
# 设置键盘重复键
pygame.key.set_repeat(True)
# 背景音乐
pygame.mixer.init()
# 设置音量
pygame.mixer.music.set_volume(100)
pygame.mixer.music.load("./bgmusic/bgm_zhandou1.mp3")
# 循环播放多少次
pygame.mixer.music.play(1)
# 1.创建窗口
screen = pygame.display.set_mode(size, 0, 32)
# 2.创建背景图片
background = pygame.image.load("./feiji/m0.jpg")
# 通过面向对象创建飞机对象
hero_plane = MyPlane(screen) # 执行的就是__init__()
enemy_plane = EnemyPlane(screen) # 创建敌机对象
while True:
# 添加背景图片
screen.blit(background, (0, 0))
# 显示飞机
hero_plane.display(enemy_plane)
# 显示敌机
enemy_plane.display()
if not enemy_plane.isbomb:
enemy_plane.move() # 调用敌机移动方法
# 敌机开火
# global i
# if i % 40 == 0:
enemy_plane.fire()
# i += 1
pygame.display.update()
key_control(hero_plane, enemy_plane)
# 休息一会儿
time.sleep(0.01)
if __name__ == "__main__":
main()
Python版飞机大战
最新推荐文章于 2022-07-03 08:13:03 发布
