2018-03-23

python-pygame-飞机大战

通过面向对象对数据处理
打飞机游戏 游戏面板,我方飞机
游戏面板:
属性:高度,宽度,背景(场景)
方法;加载游戏资源
我方飞机:
属性:x,y坐标,背景图片,游戏面板
方法:显示,移动,开火
程序启动:
程序创建面板对象,调用加载游戏资源
开发:
定义对象,从启动开始,逐步完善
互相调用:完成整个流程

效果视频链接

https://pan.baidu.com/s/1dQ40HxcUUAr-LzQlq7UZPw

代码模块

# 引入需要的模块
import pygame
from pygameimport locals
import time
import random
# 添加混音器
pygame.init()
pygame.mixer.init()
black =255, 255, 255
pygame.init()
# 定义一个我方飞机
class Hero(object):
def __init__(self, screen_plane):
self.grade =0  # 分数
      self.blood =4  # 中弹次数
      self.x =180
      self.y =670
      self.image = pygame.image.load("./images/img_plane_boss.png")
self.screen = screen_plane
self.Bullet_list = []# 飞机发射子弹列表
  # 显示飞机的方法
  def display(self):
self.screen.blit(self.image, (self.x, self.y))
# 显示子弹
      # 遍历子弹列表
      for bin self.Bullet_list:
b.display()
b.move()
# 如果子弹超过限制边界,系统将自动删除该子弹
        if b.overflow():
self.Bullet_list.remove(b)
# 定义一个水平移动的方法
  def move(self, speed):
self.x += speed
# 飞机边界处理
      if self.x <= -20:
self.x = -20
      elif self.x >=392:
self.x =392
  # 定义一个水平移动的方法
  def up_down(self, speed):
self.y += speed
# 飞机边界处理
      if self.y >=770:
self.y =770
      elif self.y <= -20:
self.y = -20
  # 发射子弹的方法
  def fire(self):
# 每次只能发射六发子弹
      if len(self.Bullet_list) <=5:
# 子弹的发射位置
        b = Bullet(self.x +25, self.y, self.screen)
# 在列表中添加一枚子弹
        self.Bullet_list.append(b)
# 定义敌方飞机
class Enemy(object):
"""
  敌方飞机类型"""
  def __init__(self, x, y, image, screen_plane, speed, width, height, blood):
self.x = x
self.y = y
self.image = pygame.image.load(image)
self.screen = screen_plane
self.speed = speed
self.width = width
self.height = height
self.blood = blood# 血量
      self.bullet_list2 = []#敌方飞机发射子弹列表
  # 显示敌方飞机的方法
  def display(self):
self.screen.blit(self.image, (self.x, self.y))
#显示敌方飞机子弹
      for ain self.bullet_list2:
a.display()
a.move2()
# 定义一个水平移动的方法
  def up_down(self, speed):
if speed !=0:
self.speed = speed
self.y +=self.speed
#敌方飞机发射子弹的方法
  # def efire(self):
#  a = Bullet(self.x, self.y, self.screen)
  #  self.bullet_list2.append(a)  #将子弹对象添加到敌方飞机列表属性中
class Boom(object):
def __init__(self, enemy):
self.enemy = enemy# 飞机
      self.blood = enemy.blood
self.width = enemy.width
# 敌机爆炸
  def boom(self):
# 小飞机
      if self.enemy.width ==44:
self.enemy.blood -=1
        if self.enemy.blood ==0:
print("第一次击中小飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy1.1.png")
# 中飞机
      elif self.enemy.width ==80:
self.enemy.blood -=1
        if self.enemy.blood ==1:
print("第一次击中中飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enem2.1.png")
elif self.enemy.blood ==0:
print("第二次击中中飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enem2.2.png")
#双体飞机
      elif self.enemy.width ==137:
self.enemy.blood -=1
        if self.enemy.blood ==2:
print("第一次击中中飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy3.1.png")
elif self.enemy.blood ==1:
print("第二次击中中飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy3.2.png")
elif self.enemy.blood ==0:
print("第二次击中中飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy3.3.png")
# 大飞机
      elif self.enemy.width ==180:
self.enemy.blood -=1
        if self.enemy.blood ==3:
print("第一次击中大飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy4.1.png")
elif self.enemy.blood ==2:
print("第二次击中大飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy4.2.png")
elif self.enemy.blood ==1:
print("第三次击中大飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy4.3.png")
elif self.enemy.blood ==0:
print("第四次击中大飞机")
self.enemy.image = pygame.image.load("./images/img_plane_enemy4.4.png")
# 辅助显示
class Logo(object):
def __init__(self, screen):
self.screen = screen
# 飞机血量
  def blood(self, hero):
print(hero.blood)
image0 = pygame.image.load("./images/blood0.png")
image4 = pygame.image.load("./images/img_me4.png")
image3 = pygame.image.load("./images/img_me3.png")
image2 = pygame.image.load("./images/img_me2.png")
image1 = pygame.image.load("./images/img_me1.png")
if hero.blood ==0:
self.screen.blit(image0, (0, 0))
elif hero.blood ==4:
self.screen.blit(image4, (0, 0))
elif hero.blood ==3:
self.screen.blit(image3, (0, 0))
elif hero.blood >=2:
self.screen.blit(image2, (0, 0))
elif hero.blood ==1:
self.screen.blit(image1, (0, 0))
########################定义敌方飞机兵工厂#############################
class EnemyFactory(object):
"""
  敌机生产地"""
  def __init__(self, screen_plane, ):
self.screen = screen_plane
self.enemy_list = []# 创建一个敌机生产保存列表
  # 生产飞机
  def product(self):
# 定义一个随机数
      i = random.randint(1, 100000)
# 当随机数小于1500
      if i <=1500:
# 创建小型飞机
        rand_x = random.randrange(0, 386)
self.__product(rand_x, -44, "./images/img_plane_enemy4.png", 2.5, 44, 30, 1)
# 当随机数大于等于50000小于等于50800
      elif (i >=50000)and (i <=50800):
# 创建中型飞机
        rand_x = random.randrange(0, 250)
self.__product(rand_x, -60, "./images/img_plane_enem.png", 2, 80, 60, 2)
# 当随机数大于70000小于等于70600
      elif (i >=70000)and (i <=70600):
# 创建双体飞机
        rand_x = random.randrange(0, 293)
self.__product(rand_x, -50, "./images/img_plane_enemy6.png", 1.8, 137, 50, 3)
# 随机数大于等于99950
      elif i >=99950:
# 创建大型飞机
        rand_x = random.randrange(0, 350)
self.__product(rand_x, -80, "./images/img_plane_enemy5.png", 1.2, 180, 140, 4)
# 敌方飞机创建方法
  def __product(self, x, y, image, speed, width, height, blood):
enemy = Enemy(x, y, image, self.screen, speed, width, height, blood)
self.enemy_list.append(enemy)
# 显示飞机
  def display(self):
for ein self.enemy_list:
# 显示所有飞机
        e.display()
# 飞机移动
        e.up_down(0)
# 定义一个子弹对象
class Bullet(object):
def __init__(self, x, y, screen_plane):
self.x = x
self.y = y
self.image = pygame.image.load("./images/bullet_1.png")
self.screen = screen_plane
# 显示子弹
  def display(self):
self.screen.blit(self.image, (self.x, self.y))
# 子弹的发射速度
  def move(self):
self.y -=6
  # 子弹的发射速度
  def move1(self):
self.y +=6
  # 判断子弹的边界
  def overflow(self):
if self.y <=0:
return True
      else:
return False
  # 定义一个水平移动的方法
  def up_down(self, speed):
self.y += speed
# 定义一个游戏面板
class GamePanel(object):
# 初始化数据
  def __init__(self):
self.width =430
      self.height =800
      self.image = pygame.image.load("./images/img_bg_level_5.jpg")
self.blood =None
      self.hero =None
      self.enemyf =None
      self.enemy =None
      self.logo =None
      self.screen =None
      self.n =0
      self.my_font =None
  # 启动游戏
  def start(self):
# 创建游戏面板对象
      self.screen = pygame.display.set_mode((self.width, self.height), 0, 32)
pygame.display.set_caption("飞机大战")
# 创建飞机对象
      self.hero = Hero(self.screen)
self.logo = Logo(self.screen)
# 创建敌方飞机工厂对象
      self.enemyf = EnemyFactory(self.screen)
# 开始游戏
      self.__key_control(self.screen, self.hero, self.enemyf,)
def set_font(self, font):
text_image =self.my_font.render(font, True, black)
self.screen.blit(text_image, (380, 0))
# pygam.display.update()
  # 己方子弹碰撞敌机检测函数
  def shoot(self):
# 遍历敌方飞机列表
      for enemyin self.enemyf.enemy_list:
# 遍历所有子弹列表
        for bulletin self.hero.Bullet_list:
# 碰撞检测
            if ((bullet.x >= enemy.x)and (bullet.x <= enemy.x + enemy.width)) \
and ((bullet.y >= enemy.y)and (bullet.y <= enemy.y + enemy.height)):
# 碰撞成功
              print("击落一架敌机")
# 删除击中敌机的子弹
              self.hero.Bullet_list.remove(bullet)
self.enemy = Boom(enemy)
self.enemy.boom()
# 删除被击中的飞机
              if enemy.blood ==0:
if enemy.width ==44:
self.enemyf.enemy_list.remove(enemy)
self.hero.grade +=1
                    self.n +=1
                  elif enemy.width ==80:
self.enemyf.enemy_list.remove(enemy)
self.hero.grade +=2
                    self.n +=2
                  elif enemy.width ==137:
self.enemyf.enemy_list.remove(enemy)
self.hero.grade +=3
                    self.n +=3
                  elif enemy.width ==180:
self.enemyf.enemy_list.remove(enemy)
self.hero.grade +=4
                    self.n +=4
              # 刷新界面
              time.sleep(0.01)
# 将加载的数据,渲染到图形界面中
              pygame.display.update()
# 添加爆炸音乐
              pygame.mixer.music.load("./music/enemy1_down.mp3")
pygame.mixer.music.play()
# 己方飞机与敌机碰撞
  def shoot_1(self):
# 遍历敌方飞机列表
      for enemyin self.enemyf.enemy_list:
# 碰撞检测
        if (enemy.x + enemy.width >=self.hero.x)and (enemy.x <= (self.hero.x +58)) \
and (enemy.y + enemy.height >=self.hero.y):
# 碰撞处理
            print("与敌机相撞")
self.enemyf.enemy_list.remove(enemy)
self.hero.blood -=1
            print("血量判断")
self.logo.blood(self.hero)
# 定义一个函数,用于键盘控制
  def __key_control(self, screen_plane, hero_plane, enemf_plane):
# 展示游戏界面
      # 添加背景音乐
      pygame.mixer.music.load("./music/7790.mp3 ")
pygame.mixer.music.play(-1)
while True:
# 将图片添加到游戏区域中
        screen_plane.blit(self.image, (0, 0))
# 显示飞机
        hero_plane.display()
self.logo.blood(hero_plane)
self.my_font = pygame.font.Font(None, 50)
# 生产并显示敌方飞机
        enemf_plane.product()
enemf_plane.display()
# 碰撞检测
        self.shoot()
self.shoot_1()
if self.hero.blood ==0:
print("游戏结束")
break
        # 显示爆炸
        # 添加一个循环,监控用户对键盘的操作
        for ein pygame.event.get():
if e.type == locals.KEYDOWN:# 用户按下了按键
              if e.key == locals.K_aor e.key == locals.K_LEFT:
print("<<
hero_plane.move(-10)
elif e.key == locals.K_dor e.key == locals.K_RIGHT:
print(">>>right>>>")
hero_plane.move(+10)
elif e.key == locals.K_wor e.key == locals.K_UP:
print(">>>up>>>")
hero_plane.up_down(-10)
elif e.key == locals.K_sor e.key == locals.K_DOWN:
print(">>>down>>>")
hero_plane.up_down(+10)
# 空格键发射子弹
              elif e.key == locals.K_SPACE:
print("---space---")
# 我方飞机开火
                  # enemy_plane.efire()
                  hero_plane.fire()
# 添加我放飞机开火背景音乐
                  pygame.mixer.music.load("./music/bullet.wav ")
pygame.mixer.music.play()
elif e.type == locals.QUIT:
exit()# 用户选择退出选项
        # 刷新界面
        time.sleep(0.01)
# 将加载的数据,渲染到图形界面中
        self.set_font(str(self.n))
pygame.display.update()
# 启动游戏
if __name__ =="__main__":
# 创建一个游戏面板
  gp = GamePanel()
# 开始游戏
  gp.start()

你可能感兴趣的:(2018-03-23)