python版飞机大战代码分享


Posted in Python onNovember 20, 2018

利用pygame实现了简易版飞机大战。源代码如下:

# -*- coding:utf-8 -*-
import pygame
import sys
from pygame.locals import *
from pygame.font import *
import time
import random

class Hero(object):
 #玩家 英雄类
 def __init__(self, screen_temp):
 self.x = 210
 self.y = 700
 self.life = 21
 # self.life = 100
 self.image = pygame.image.load("./feiji/hero1.png")
 self.screen = screen_temp
 self.bullet_list = []#用来存储子弹对象的引用
 #爆炸效果用的如下属性
 self.hit = False #表示是否要爆炸
 self.bomb_list = [] #用来存储爆炸时需要的图片
 self.__create_images() #调用这个方法向bomb_list中添加图片
 self.image_num = 0 #用来记录while True的次数,当次数达到一定值时才显示一张爆炸的图,然后清空,,当这个次数再次达到时,再显示下一个爆炸效果的图片
 self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号

 def __create_images(self):
 #添加爆炸图片
 self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n1.png"))
 self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n2.png"))
 self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n3.png"))
 self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n4.png"))

 def display(self):
 #显示玩家的飞机
 #如果被击中,就显示爆炸效果,否则显示普通的飞机效果
 if self.hit == True:
  self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))#(self.x, self.y)是指当前英雄的位置
  #blit方法 (一个对象,左上角位置)
  self.image_num += 1
  print(self.image_num)
  if self.image_num == 7:
  self.image_num = 0
  self.image_index += 1
  print(self.image_index) #这里子弹打住英雄时没有被清除掉,所以打一下,就死了
  if self.image_index > 3:
  time.sleep(1)
  exit()#调用exit让游戏退出
  #self.image_index = 0
 else:
  if self.x< 0: #控制英雄,不让它跑出界面
  self.x = 0
  elif self.x > 382:
  self.x = 382
  if self.y < 0:
  self.y = 0
  elif self.y > 750:
  self.y = 750
  self.screen.blit(self.image,(self.x, self.y))#z这里是只要没有被打中,就一直是刚开始的样子

 #不管玩家飞机是否被击中,都要显示发射出去的子弹
 for bullet in self.bullet_list:
  bullet.display()
  bullet.move()

 def move(self, move_x,move_y):
 self.x += move_x
 self.y += move_y

 def fire(self):
 #通过创建一个子弹对象,完成发射子弹
 bullet = Bullet(self.screen, self.x, self.y)#创建一个子弹对象
 self.bullet_list.append(bullet)

 def bomb(self):
 self.hit = True

 def judge(self):
 global life
 if life <= 0:
  self.bomb()

class Bullet(object):
 #玩家子弹类
 def __init__(self, screen_temp, x_temp, y_temp):
 self.x = x_temp + 40
 self.y = y_temp - 20
 self.image = pygame.image.load("./feiji/bullet.png")
 self.screen = screen_temp

 def display(self):
 self.screen.blit(self.image, (self.x, self.y))

 def move(self):
 self.y -= 10

class Bullet_Enemy(object):
 #敌机子弹类
 def __init__(self, screen_temp, x_temp, y_temp):
 self.x = x_temp + 25
 self.y = y_temp + 30
 self.image = pygame.image.load("./feiji/bullet1.png")
 self.screen = screen_temp

 def display(self):
 self.screen.blit(self.image,(self.x,self.y))

 def move(self, hero):
 self.y += 10
 global life
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
 #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
  life -= 10
  #self.bullet_list.remove()
  print("---judge_enemy---")
  return True
  if life<=0:
  hero.bomb()
 return False

class Bullet_Boss(object):
 #boss子弹类1
 def __init__(self, screen_temp, x_temp, y_temp):
 self.x = x_temp + 80
 self.y = y_temp + 230
 self.image = pygame.image.load("./feiji/bullet2.png")
 self.screen = screen_temp

 def display(self):
 self.screen.blit(self.image, (self.x, self.y))

 def move(self, hero):
 self.y += 6
 self.x += 2
 global life
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
 #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
  life -= 20
  #self.bullet_list.remove()
  print("---judge_boss---")
  return True
  if life<=0:
  hero.bomb()
 return False

class Bullet_Boss1(object):
 #boss子弹类2
 def __init__(self, screen_temp, x_temp, y_temp):
 self.x = x_temp + 80
 self.y = y_temp + 230
 self.image = pygame.image.load("./feiji/bullet2.png")
 self.screen = screen_temp

 def display(self):
 self.screen.blit(self.image, (self.x, self.y))

 def move(self, hero):
 self.y += 6
 self.x -= 2
 global life
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
 #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
  life -= 20
  #self.bullet_list.remove()
  print("---judge_boss---")
  return True
  if life<=0:
  hero.bomb()
 return False

class Bullet_Boss2(object):
 #boss子弹类3
 def __init__(self, screen_temp, x_temp, y_temp):
 self.x = x_temp + 80
 self.y = y_temp + 230
 self.image = pygame.image.load("./feiji/bullet2.png")
 self.screen = screen_temp

 def display(self):
 self.screen.blit(self.image, (self.x, self.y))

 def move(self, hero):
 self.y += 6
 global life
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
 #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):
  life -= 20 
  #self.bullet_list.remove()
  print("---judge_boss---")
  return True
  if life<=0:
  hero.bomb()
 return False

class Base(object):
 #基类 类似于抽象类
 def __init__(self, screen_temp, x, y, image_name):
 self.x = x
 self.y = y 
 self.screen = screen_temp
 self.image = pygame.image.load(image_name)
 self.alive = True

 def display(self):
 if self.alive == True:
  self.screen.blit(self.image, (self.x, self.y))

 def move(self):
 self.y += 5

class bomb_bullet(Base):
 #炸弹类
 def __init__(self, screen_temp):
 Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb.png")

 def judge(self, hero):
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
  self.alive = False
  hero.bomb()

 if self.y >= 850:
  #self.alive = False
  self.y = 0
  self.x = random.randint(45, 400)
  #print("bomb.y = %d"%self.y)

class supply(Base):
 #补给类
 def __init__(self, screen_temp):
 Base.__init__(self, screen_temp, random.randint(45, 400), -300, "./feiji/bomb-1.gif")

 def judge(self, hero):
 global life
 if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
  self.alive = False
  life += 10

 if self.y >= 1500:
  self.y = 0
  self.x = random.randint(45, 400)
  self.alive = True

class clear_bullet(Base):
 def __init__(self, screen_temp):
 Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb-2.gif")
 self.alive = False

 def judge(self, hero, enemies):
 global q
 q += 1
 #self.move()
 if q == 20:
  #self.move()
  self.alive = True
  q = 0
  if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100):
  self.alive = False
  for enemy in enemies:
   enemy.hit == True


class EnemyPlane(object):
 #敌机类
 def __init__(self, screen_temp):
 self.x = random.randint(15, 480)
 self.y = 0
 self.image = pygame.image.load("./feiji/enemy0.png")
 self.screen = screen_temp
 self.bullet_list = []#用来存储子弹对象的引用
 #self.direction = "right"#用来设置这个飞机默认的移动方向
 self.hit = False
 self.bomb_list = []
 self.__create_images()
 self.image_num = 0
 self.image_index = 0
 #利用产生的随机数,随机确定飞机初始移动方向
 self.k = random.randint(1, 20)
 if self.k <= 10:
  self.direction = "right"
 elif self.k > 10:
  self.direction = "left"

 def display(self, hero):
 #显示敌人的飞机
 if not self.hit:
  self.screen.blit(self.image, (self.x,self.y))
 else:
  self.screen.blit(self.bomb_list[self.image_index], (self.x,self.y))
  self.image_num += 1
  if self.image_num == 3 and self.image_index < 3:
  self.image_num = 0
  self.image_index += 1
  #print(self.image_index)
  # if self.image_index > 2:
  # time.sleep(0.1)

 for bullet in self.bullet_list:
  bullet.display()
  if(bullet.move(hero)):
  self.bullet_list.remove(bullet)

 def move(self):
 #利用随机数来控制飞机移动距离,以及移动范围
 d1 = random.uniform(1,3)
 d2 = random.uniform(0.2,3)
 p1 = random.uniform(50,100)
 p2 = random.uniform(-200,0)
 if self.direction == "right":
  self.x += d1
 elif self.direction == "left":
  self.x -= d1

 if self.x > 480 - p1:
  #480 - 50
  self.direction="left"
 elif self.x < p2:
  self.direction = "right"
 self.y += d2

 def bomb(self):
 self.hit = True

 def __create_images(self):
 self.bomb_list.append(pygame.image.load("./feiji/enemy0_down1.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy0_down2.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy0_down3.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy0_down4.png"))

 def fire(self):
 #利用随机数来控制敌机的开火,1/80的概率
 s = random.randint(0,800)
 bullet1 = Bullet_Enemy(self.screen, self.x, self.y)
 if s < 10:
  self.bullet_list.append(bullet1)

class EnemyPlanes(EnemyPlane):
 #敌机群类 继承自EnemyPlane类 
 def __init__(self, screen_temp):
 EnemyPlane.__init__(self, screen_temp)
 self.num = 0
 self.enemy_list = [] #用列表存储产生的多架敌机
 self.screen = screen_temp

 def add_enemy(self, num): 
 #产生多架敌机的函数
 self.num = num
 for i in range(num):
  enemy = EnemyPlane(self.screen)
  self.enemy_list.append(enemy)

 def display(self, hero):
 for i in range(self.num):
  self.enemy_list[i].display(hero)

 def move(self):
 for i in range(self.num): 
  self.enemy_list[i].move()

 def fire(self):
 #s = random.randint(0,1000)
 for i in range(self.num):
  self.enemy_list[i].fire()

class Boss(EnemyPlane):
 #boss敌机类 继承自EnemyPlane类
 def __init__(self,screen_temp):
 EnemyPlane.__init__(self,screen_temp)
 self.x = 150
 self.y = 0
 self.bomb_list = []
 self.__create_images()
 self.image = pygame.image.load("./feiji/enemy2.png")
 self.screen = screen_temp
 self.bullet_list = []

 def __create_images(self):
 #self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down1.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down2.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down3.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down4.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down5.png"))
 self.bomb_list.append(pygame.image.load("./feiji/enemy2_down6.png"))

 def display(self, hero):
 #显示敌人的飞机
 global g
 #print(g)
 self.screen.blit(self.bomb_list[g], (self.x,self.y))
 for bullet in self.bullet_list:
  bullet.display()
  if(bullet.move(hero)):
  self.bullet_list.remove(bullet)

 def move(self):
 d1 = 0
 self.y += 0

 def fire(self):
 global s
 s += 1
 bullet1 = Bullet_Boss(self.screen, self.x, self.y)
 bullet2 = Bullet_Boss1(self.screen, self.x, self.y)
 bullet3 = Bullet_Boss2(self.screen, self.x, self.y)
 if s == 20:
  s = 0 
  self.bullet_list.append(bullet1)
  self.bullet_list.append(bullet2)
  self.bullet_list.append(bullet3)

def judge1(hero,enemy):
 #判断敌机的炸毁
 for bullet1 in hero.bullet_list:
 if bullet1.y in range(int(enemy.y),int(enemy.y + 30)) and bullet1.x in range(int(enemy.x-10),int(enemy.x + 50)):
  hero.bullet_list.remove(bullet1)
  enemy.bomb()
 if bullet1.y < 0 or bullet1.x < 0 or bullet1.x > 480: #删除越界的玩家子弹
  hero.bullet_list.remove(bullet1) 

def judge3(hero,boss):
 #判断boss的炸毁
 global goal, g, goal0
 for bullet3 in hero.bullet_list:
 if bullet3.y in range(int(boss.y), int(boss.y + 60)) and bullet3.x in range(int(boss.x), int(boss.x + 100)):
  hero.bullet_list.remove(bullet3)
  g += 1
  boss.image = boss.bomb_list[g]
  print("g = %d"%g)
  if g >= 6:
  boss.y, g, goal = 0, 0, 0
  boss.bomb()
  goal0 += 10 

def clear_enemy(enemies):
 #清除敌机群类中被炸毁的敌机
 global goal, goal0
 for enemy in enemies.enemy_list:
 if enemy.hit == True and enemy.image_index == 3:
  enemies.enemy_list.remove(enemy)
  enemies.num -= 1
  goal += 1
  goal0 += 5
  print("goal = %d"%goal)
 if enemy.y >= 850:
  enemies.enemy_list.remove(enemy)
  enemies.num -= 1

def judge_num(enemies):
 #判断频幕上敌人的数量,如果为零,继续添加敌人
 n = random.randint(1,5)
 if len(enemies.enemy_list) == 0:
 enemies.add_enemy(n)

def show_text(screen_temp):
 #在屏幕上显示文字
 text = "GOAL:" + str(goal0) + "Life:" + str(life) 
 font_size = 50
 pos = (0,0)
 color = (0,255,0)
 cur_font = pygame.font.SysFont("宋体",font_size)
 text_fmt = cur_font.render(text, 1, color)
 screen_temp.blit(text_fmt, pos)

def creat_bomb(screen_temp):
 bomb = bomb_bullet(screen_temp)
 bomb_list = []
 bomb_list.apend(bomb)

#定义的全局变量
goal = 0 #玩家得分
goal0 = 0
g = 0 #击中boss的次数
life = 100#生命值
s = 0 #判断大boss是否发射子弹
q = 0

def main():
 #主函数执行
 #获取事件,比如按键等
 bb = False
 move_x = 0
 move_y = 0
 pygame.init()
 screen = pygame.display.set_mode((480,852),0,32)
 #     210,400
 background = pygame.image.load("./feiji/background.png")
 pygame.display.set_caption("飞机大战")
 atlas = pygame.image.load("./feiji/New Atlas.png")
 #创建玩家飞机
 hero = Hero(screen)
 #创建敌机群
 enemis = EnemyPlanes(screen)
 enemis.add_enemy(5)
 #创建boss对象
 boss = Boss(screen)
 #创建炸弹对象
 bomb = bomb_bullet(screen)
 #创建补给对象
 supply0 = supply(screen)
 clear = clear_bullet(screen)
 left_key, right_key, up_key, down_key, done = 0, 0, 0, 0, 0
 # mark = 0#用来判断boss发射子弹
 while True:
 if done:
  if done % 8 == 0:
  done = 1
  hero.fire()
  else:
  done += 1
 for event in pygame.event.get():
  #判断是否是点击了退出按钮
  if event.type == QUIT:
  print("exit")
  exit()
  #判断是否是按下了键
  if event.type == KEYDOWN :
  #down
  #检测按键是否是a或者left

  if event.key == K_a or event.key == K_LEFT:
   #print('left')
   move_x = -5
   left_key += 1 

  #检测按键是否是d或者right
  elif event.key == K_d or event.key == K_RIGHT:
   #print('right')
   move_x = 5
   right_key += 1

  elif event.key == K_w or event.key == K_UP:
   move_y = -5
   up_key += 1

  elif event.key == K_s or event.key == K_DOWN:
   move_y = 5
   down_key += 1

  #检测按键是否是空格键
  elif event.key == K_SPACE:
   #print('space')
   hero.fire()
   done = 1
   #enemis.fire()

  elif event.key == K_b:
   print('b')
   hero.bomb()

  if event.type == KEYUP:
  if event.key == K_a or event.key == K_LEFT:
   left_key -= 1
   if right_key == 0:
   move_x = 0
   else:
   move_x = 5

  if event.key == K_d or event.key == K_RIGHT:
   right_key -= 1
   if left_key == 0:
   move_x = 0
   else:
   move_x = -5

  if event.key == K_w or event.key == K_UP:
   up_key -= 1
   if down_key == 0:
   move_y = 0
   else:
   move_y = 5 

  if event.key == K_s or event.key == K_DOWN:
   down_key -= 1
   if up_key == 0:
   move_y = 0
   else:
   move_y = -5

  if event.key == K_SPACE:
   done = 0 

 screen.blit(background, (0, 0))
 hero.move(move_x, move_y)
 hero.display()
 hero.judge()
 enemis.display(hero)
 enemis.move()
 enemis.fire()
 bomb.display()
 bomb.judge(hero)
 bomb.move()
 supply0.display()
 supply0.judge(hero)
 supply0.move()
 #clear.display()
 #clear.judge(hero, enemis)
 #clear.move()
 for i in range(enemis.num):
  judge1(hero, enemis.enemy_list[i])
  #enemis.enemy_list[i].judge(hero)
 clear_enemy(enemis)
 judge_num(enemis)
 show_text(screen)
 if goal >= 15:
  boss.display(hero)
  boss.move()
  # mark+=1
  # if mark==8:
  boss.fire()
  # mark = 0
  #boss.judge
  judge3(hero, boss)
 pygame.display.update()

if __name__ == "__main__":
 main()

方法是利用面向对象的思想,写了基本的敌机类、英雄类、武器类等,利用继承关系产生多架敌机。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 深入理解yield
Sep 06 Python
利用ctypes提高Python的执行速度
Sep 09 Python
有趣的python小程序分享
Dec 05 Python
Python字典遍历操作实例小结
Mar 05 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
Django中FilePathField字段的用法
May 21 Python
Python3实现建造者模式的示例代码
Jun 28 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
pygame实现雷电游戏雏形开发
Nov 20 #Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 #Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 #Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 #Python
一文带你了解Python中的字符串是什么
Nov 20 #Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 #Python
pygame游戏之旅 python和pygame安装教程
Nov 20 #Python
You might like
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
layui表格数据复选框回显设置方法
2019/09/13 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
文明餐桌行动实施方案
2014/02/19 职场文书
公司寄语大全
2014/04/10 职场文书
在职员工证明书
2014/09/19 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
人民的好儿女观后感
2015/06/18 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android