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 相关文章推荐
django中的setting最佳配置小结
Nov 21 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
django为Form生成的label标签添加class方式
May 20 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
win10下python3.8的PIL库安装过程
Jun 08 Python
Django用内置方法实现简单搜索功能的方法
Dec 18 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
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
Pyqt5自适应布局实例
2019/12/13 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
员工规章制度范本
2015/08/07 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
mysql sql常用语句大全
2022/06/21 MySQL