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友情链接检查方法
Jul 08 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
Jan 16 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Python识别html主要文本框过程解析
Feb 18 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
jquery选择器使用详解
2014/04/08 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
优秀中职教师事迹材料
2014/08/26 职场文书
党小组意见范文
2015/06/08 职场文书
老人与海读书笔记
2015/06/26 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
Python基础之hashlib模块详解
2021/05/06 Python