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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
Python中functools模块的常用函数解析
Jun 30 Python
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
Python实现注册登录系统
Aug 08 Python
定制FileField中的上传文件名称实例
Aug 23 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
python list转置和前后反转的例子
Aug 26 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
python自定义函数def的应用详解
Jun 03 Python
python中复数的共轭复数知识点总结
Dec 06 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
python判断完全平方数的方法
2018/11/13 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
python中os包的用法
2020/06/01 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
4s店机修工岗位职责
2013/12/20 职场文书
村长贪污检举信
2014/04/04 职场文书
家长会学生演讲稿
2014/04/26 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
打架检讨书范文
2015/01/27 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸