python飞机大战游戏实例讲解


Posted in Python onDecember 04, 2020

记得刚学python那会,作过一个飞机大战小项目,这个项目非常经典,可以帮助初学者提高动手能力,今天把它分享出来。

一、项目介绍

先放几张图片

python飞机大战游戏实例讲解

python飞机大战游戏实例讲解

python飞机大战游戏实例讲解

python飞机大战游戏实例讲解

二、项目实现

1.首先安装库

pip install pygame

2.主要python代码

import pygame

from pygame.locals import *
import random
#https://blog.csdn.net/qq_36079986/article/details/110395731
class HeroPlane(object):# 创建一个飞机的英雄类
 def __init__(self,screen_temp): # 始化方法
 self.x = 200
 self.y = 500
 self.image = pygame.image.load('./img/hero1.png')
 self.screen = screen_temp# 因为在display方法中使用到了screen方法# 但是在类中没有 也不能调用 # 所以说 以传参的方法传递到类中
 self.bullet_list = []
 def display(self):# 创建一个展现飞机的方法
 herp_x1, herp_y1, herp_x2, herp_y2, herp_x3, herp_y3 = -100, -100, -100, -100, -100, -100
 self.screen.blit(self.image,(self.x, self.y))
 for bullet in self.bullet_list:###遍历子弹类对象,赋值给bullet
  herp_x1, herp_y1, herp_x2, herp_y2, herp_x3, herp_y3 = bullet.display()###### bullet对象调用display方法, 显示子弹
  bullet.move()
  if self.bullet_list[0].y < 0:
  del self.bullet_list[0]
 return herp_x1, herp_y1, herp_x2, herp_y2, herp_x3, herp_y3
 def move_left(self):
 self.x -= 50
 def move_right(self):
 self.x += 50
 def move_up(self):
 self.y -= 50
 def move_down(self):
 self.y += 50
 def fire(self):
 print(len(self.bullet_list),'个子弹##########################################')
 self.bullet_list.append(HeroBullet(self.screen,self.x, self.y))
class HeroBullet(object):
 def __init__(self,screen_temp,x_temp,y_temp):
 self.x = x_temp
 self.y = y_temp
 self.image = pygame.image.load('./img/bullet.png')
 self.screen = screen_temp
 def display(self):
 self.screen.blit(self.image,(self.x - 22, self.y-22))
 self.screen.blit(self.image, (self.x + 39, self.y-22))
 self.screen.blit(self.image, (self.x + 100, self.y-22))
 return self.x - 22, self.y - 22, self.x + 39, self.y - 22, self.x + 100, self.y - 22
 def move(self):
 self.y -= 1
class EnemyPlane(object):
 def __init__(self,screen_temp):
 self.ra = random.randint(0,2)
 self.x = random.randint(0,400)
 self.y = 0
 self.image = pygame.image.load('./img/enemy1.png')
 if 0<=self.x<=540:
  if self.ra == 0:
  self.flag = "left"
  elif self.ra == 1:
  self.flag = "right"
  else:
  self.flag = 'middle'
 self.screen.blit(self.image, (self.x, self.y))
 if self.x < 0:
  self.flag = "left"
 elif self.x > 450:
  self.flag = 'right'
 if self.flag == "left":
  self.x += 2
 elif self.flag == 'right':
  self.x -= 2
 self.y += 0.1
 if (random.randint(0,50) == 1):
  self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))
  # print(len(self.bullet_list),'颗敌方子弹')
 for bullet in self.bullet_list:
  bullet.display()
  if bullet.y > 700:
  del bullet
class EnemyBullet(object):
 def __init__(self,screen_temp,x,y):
 self.x = x + 30
 self.y = y + 90
 self.image = pygame.image.load('./img/bullet-1.gif')
 self.y+= 10
def key_control(hero_temp):
 for event in pygame.event.get(): # 判断输入类型
 if event.type == QUIT:#判断是否是点击了退出按钮
  print("exit")
  exit()
 elif event.type == KEYDOWN:#判断是否是按下了键# 如果是键盘事件(键盘按下事件)
  if event.key == K_a or event.key == K_LEFT:
  hero_temp.move_left()
  elif event.key == K_d or event.key == K_RIGHT:
  hero_temp.move_right()
  elif event.key == K_w or event.key == K_UP:
  hero_temp.move_up()
  elif event.key == K_s or event.key == K_DOWN:
  hero_temp.move_down()
  elif event.key == K_SPACE:#检测按键是否是空格键
  hero_temp.fire()
def main():
 screen = pygame.display.set_mode((480, 650), 0, 32) # 使用screen资源来创建背景# 返回值是一个资源
 pygame.display.set_caption("aircraft game") # 设置窗口标题
 background = pygame.image.load('./img/background.png')## ./ 当前路径 ../ 上一级路径 / 根目录
 hero = HeroPlane(screen)
 enemy_list = []
 j = 0
 while True:
 screen.blit(background, (0, 0)) # 资源中的blit方法能够加载游戏的画面
 herp_x1, herp_y1, herp_x2, herp_y2, herp_x3, herp_y3 = hero.display() #####刷新
 if len(enemy_list) <= 10:
  enemy_list.append(EnemyPlane(screen))
 if enemy_list[0].y >= 700:
  del enemy_list[0]
 for enemy_each in enemy_list :
  # enemy_each.fire()
  enemy_each.move()
  enemy_each.display()
  # print(len(enemy_list), '个敌机')
  if (enemy_each.x <= herp_x1 -10 <= enemy_each.x + 80 and enemy_each.y -10<= herp_y1<= enemy_each.y + 90) or (enemy_each.x -10 <= herp_x2<= enemy_each.x + 80 and enemy_each.y -10<= herp_y2<= enemy_each.y + 90) or (enemy_each.x-10 <= herp_x3<= enemy_each.x + 80 and enemy_each.y -10<= herp_y3<= enemy_each.y + 90):
  enemy_list.remove(enemy_each)
  # print(len(enemy_list), '个敌机')
  print('jizhon')
 # print(hero.x,type(hero.x))
 if j % 100 == 5:
  print(len(enemy_list),'个敌机')
 pygame.display.update() ### 加载游戏
 key_control(hero)# 调用键盘事件函数
 j += 1
 # print(herp_x1, herp_y1, herp_x2, herp_y2, herp_x3, herp_y3)
if __name__ == '__main__':
 main()

三、说明:代码功能都在注释里面,我就不做过多解释了;与本项目有关的图片数据我传到资源里面了,大家可以免费下载,我把代码和数据都打包到一起了,大家下载下来导入库就可以直接一些了。

实例补充

import pygame
 
class MyPlane(pygame.sprite.Sprite):
 def __init__(self,bg_size):
 pygame.sprite.Sprite.__init__(self)
 
 self.image1 = pygame.image.load(r'E:\learn pygame\image\me1.png').convert_alpha()
 self.image2 = pygame.image.load(r'E:\learn pygame\image\me2.png').convert_alpha()
 self.image3 = pygame.image.load(r'E:\learn pygame\image\me_protect.png').convert_alpha()
 self.destroy_images = []
 self.destroy_images.extend([\
 pygame.image.load(r'E:\learn pygame\image\me_destroy_1.png').convert_alpha(), \
 pygame.image.load(r'E:\learn pygame\image\me_destroy_2.png').convert_alpha(), \
 pygame.image.load(r'E:\learn pygame\image\me_destroy_3.png').convert_alpha(), \
 pygame.image.load(r'E:\learn pygame\image\me_destroy_4.png').convert_alpha() \
 ])
 self.rect = self.image1.get_rect()
 self.width,self.height = bg_size[0],bg_size[1]
 self.rect.left,self.rect.top = (self.width - self.rect.width) // 2,self.height - self.rect.height - 60
 self.speed = 10
 self.active = True
 self.invincible = False
 self.mask = pygame.mask.from_surface(self.image1)
 
 def moveUp(self):
 if self.rect.top > 0:
 self.rect.top -= self.speed
 else:
 self.rect.top = 0
 
 def moveDown(self):
 if self.rect.bottom < self.height - 30:
 self.rect.top += self.speed
 else:
 self.rect.bottom = self.height - 30
 
 def moveLeft(self):
 if self.rect.left > 0:
 self.rect.left -= self.speed
 else:
 self.rect.left = 0
 
 def moveRight(self):
 if self.rect.right < self.width:
 self.rect.left += self.speed
 else:
 self.rect.right = self.width
 
 def reset(self):
 self.rect.left,self.rect.top = (self.width - self.rect.width) // 2,self.height - self.rect.height - 30
 self.active = True 
 self.invincible = True

到此这篇关于python飞机大战游戏实例讲解的文章就介绍到这了,更多相关飞机大战游戏python小项目内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python处理csv数据的方法
Mar 11 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
python如何对实例属性进行类型检查
Mar 20 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python tkinter label 更新方法
Oct 11 Python
Python语言进阶知识点总结
May 28 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Django CBV类的用法详解
Jul 26 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 #Python
python中字符串的编码与解码详析
Dec 03 #Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 #Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 #Python
python3代码输出嵌套式对象实例详解
Dec 03 #Python
python3代码中实现加法重载的实例
Dec 03 #Python
python判断all函数输出结果是否为true的方法
Dec 03 #Python
You might like
一个多文件上传的例子(原创)
2006/10/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
文员个人的求职信范文
2013/09/26 职场文书
项目总经理岗位职责
2014/02/14 职场文书
行政内勤岗位职责
2014/04/07 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
计划生育证明书写要求
2014/09/17 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python