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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容