python3实现简单飞机大战


Posted in Python onNovember 29, 2020

本文实例为大家分享了python3实现简单飞机大战的具体代码,供大家参考,具体内容如下

游戏分为两个部分:1.主程序 2.游戏工具

主程序实现:游戏循环,事件监听,图形绘制,位置更新,碰撞检测

游戏工具:封装背景精灵,子弹精灵,英雄精灵,敌机精灵

开发环境:pycharm 2018,python3 ,pygame

效果图:

python3实现简单飞机大战

目录结构:

python3实现简单飞机大战

代码:

plane_main.py

# coding=utf8
"""
游戏主程序
"""
# 系统模块
import random
# 第三方模块
import pygame
# 自定义模块
from plane_sprites import * # 导入模块中所有成员
 
 
class PlaneGame(object):
 """
 游戏主程序
 """
 
 def __init__(self):
 """
 游戏初始化
 """
 # 1.创建游戏窗口
 self.screen = pygame.display.set_mode(SCREEN_RECT.size)
 # 2.创建游戏时钟
 self.clock = pygame.time.Clock()
 # 3.创建精灵和精灵组
 self.__create_sprites()
 # 4.设置定时器事件创建敌机
 pygame.time.set_timer(CREATE_ENEMY_EVENT, 100)
 # 5.发射子弹的定时器
 pygame.time.set_timer(HERO_FIRE_EVENT, 500)
 
 def __create_sprites(self):
 """
 创建游戏精灵
 :return:
 """
 # 1.创建背景精灵和精灵组
 bg1 = Backgroud()
 bg2 = Backgroud(True)
 self.back_group = pygame.sprite.Group(bg1, bg2)
 
 # 2.创建英雄精灵
 self.hero = Hero()
 self.hero_group = pygame.sprite.Group(self.hero)
 
 # 3.创建敌机精灵组
 self.enemy_group = pygame.sprite.Group()
 
 def start_game(self):
 """
 开始游戏循环
 :return:
 """
 print("开始游戏")
 while True:
  # 1.设置游戏屏幕的刷新频率
  self.clock.tick(FRAME_PRE_SEC)
  # 2.游戏事件监听
  self.__event_handler()
  # 3.精灵碰撞检测
  self.check_collide()
  # 4.更新和绘制精灵组
  self.update_sprites()
  # 5.更新显示图像
  pygame.display.update()
 
 def __event_handler(self):
 """
 事件监听处理
 :return:
 """
 for event in pygame.event.get():
  # 判断是否退出游戏
  if event.type == pygame.QUIT:
  PlaneGame.__game_over()
  elif event.type == CREATE_ENEMY_EVENT:
  print("敌机出场")
  # 1.创建敌机精灵
  enemy = Enemy()
  # 2.将敌机精灵添加到精灵组
  self.enemy_group.add(enemy)
  elif event.type == pygame.KEYDOWN:
  keys_pressed = pygame.key.get_pressed()
  if keys_pressed[pygame.K_RIGHT]:
   self.hero.speed = 1
  elif keys_pressed[pygame.K_LEFT]:
   self.hero.speed = -1
  else:
   self.hero.speed = 0
  elif event.type == pygame.KEYUP:
  # 1.按键抬起不在移动
  self.hero.speed = 0
 
  elif event.type == HERO_FIRE_EVENT:
  # 英雄发射子弹
  self.hero.fire()
  else:
  print(event.type)
 
 def check_collide(self):
 """
 精灵碰撞检测
 :return:
 """
 # 1.子弹摧毁敌机
 pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
 
 # 2.敌机撞毁英雄
 """
 enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
 if len(enemies) > 0:
  self.hero.kill()
  PlaneGame.__game_over()
 """
 
 def update_sprites(self):
 """
 更新精灵的位置
 :return:
 """
 # 更新位置
 self.back_group.update()
 self.hero_group.update()
 self.enemy_group.update()
 self.hero.bullets.update()
 # 绘制图形到屏幕
 self.back_group.draw(self.screen)
 self.hero_group.draw(self.screen)
 self.enemy_group.draw(self.screen)
 self.hero.bullets.draw(self.screen)
 
 @staticmethod
 def __game_over():
 """
 游戏结束的处理
 :return:
 """
 pygame.quit()
 exit()
 
 
if __name__ == "__main__": # 模块内置属性__name__默认为"__main__",主要为了方便测试
 # 1.创建游戏对象
 game = PlaneGame()
 # 2.开始游戏
 game.start_game()

plane_sprites.py

# coding=utf8
"""
游戏精灵
"""
# 系统模块
import random
# 第三方模块
import pygame
# 自定义模块
from plane_sprites import * # 导入模块中所有成员
 
# 游戏常量 ,python中没有意义上的常量,一般字母全部大写就是认为是常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700) # 游戏屏幕大小设定
FRAME_PRE_SEC = 60 # 设置游戏屏幕的刷新频率
# 游戏图片的路径
BACKGROUND_IMAGE_NAME = "./images/background.png"
HERO_IMAGE_NAME = "./images/hero.png"
ENEMY_IMAGE_NAME = "./images/enemy.png"
BULLET_IMAGE_NAME = "./images/bullet.png"
 
# 创建定时器
CREATE_ENEMY_EVENT = pygame.USEREVENT
HERO_FIRE_EVENT = pygame.USEREVENT + 1
 
 
class GameSprites(pygame.sprite.Sprite):
 """
 飞机大战游戏精灵基类
 """
 
 def __init__(self, image_name, speed=1):
 # 调用父类的初始化方法
 super().__init__()
 # 加载图片到内存
 self.image = pygame.image.load(image_name)
 # 获取图像的初始位置
 self.rect = self.image.get_rect()
 self.speed = speed
 
 def update(self, *args):
 # 垂直方向向下移动
 self.rect.y += self.speed
 
 
class Backgroud(GameSprites):
 """
 游戏背景精灵
 """
 
 def __init__(self, is_alt=False):
 # 1.调用父类创建精灵
 super().__init__(BACKGROUND_IMAGE_NAME)
 # 2.判断是否在屏幕上方
 if is_alt:
  self.rect.y = -self.rect.height
 
 def update(self):
 # 1.调用父类的实现
 super().update()
 # 2.判断背景是否飞出屏幕,如果是将背景设置到屏幕上方
 if self.rect.y >= SCREEN_RECT.height:
  self.rect.y = -self.rect.height
 
 
class Hero(GameSprites):
 """
 游戏英雄精灵
 """
 
 def __init__(self):
 # 1.调用父类设置图像和速度
 super().__init__(HERO_IMAGE_NAME, 0)
 
 # 2.设置英雄的初始位置
 self.rect.centerx = SCREEN_RECT.centerx
 self.rect.bottom = SCREEN_RECT.bottom - 120
 
 # 3.创建子弹精灵组
 self.bullets = pygame.sprite.Group()
 
 def update(self):
 # 1.英雄在水平方向移动
 self.rect.x += self.speed
 
 # 2.控制英雄不飞出屏幕
 if self.rect.x < 0:
  self.rect.x = 0
 elif self.rect.right > SCREEN_RECT.right:
  self.rect.right = SCREEN_RECT.right
 
 def fire(self):
 for i in (0, 1, 2):
  # 1.创建子弹精灵
  bullet = Bullet()
  # 2.设置精灵位置
  bullet.rect.bottom = self.rect.y - 20 * i
  bullet.rect.centerx = self.rect.centerx
  # 3.添加到精灵组
  self.bullets.add(bullet)
 
 
class Enemy(GameSprites):
 """
 敌机精灵
 """
 
 def __init__(self):
 super().__init__(ENEMY_IMAGE_NAME)
 # 1.指定敌机的初始速度
 self.speed = random.randint(1, 3)
 # 2.指定敌机的随机位置
 self.rect.bottom = 0
 max_x = SCREEN_RECT.width - self.rect.width
 self.rect.x = random.randint(0, max_x)
 
 def update(self):
 # 1. 调用父类方法,保持垂直飞行
 super().update()
 # 2.判断是否飞出屏幕,如果是则从精灵组中删除敌机
 if self.rect.y >= SCREEN_RECT.height:
  # 自动销毁,调用__del()__内置方法
  self.kill()
 
 def __del__(self):
 print("敌机消失 %s" % self.rect)
 
 
class Bullet(GameSprites):
 """
 子弹精灵
 """
 
 def __init__(self):
 super().__init__(BULLET_IMAGE_NAME, -2)
 self.bullets = pygame.sprite.Group()
 
 def update(self):
 super().update()
 if self.rect.bottom < 0:
  self.kill()

background.png    480*700

python3实现简单飞机大战

bullet.png 10*20

python3实现简单飞机大战

enemy.png 80*85

python3实现简单飞机大战

hero.png 120*125

python3实现简单飞机大战

游戏图形,为随意作画,仅供参考。

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

Python 相关文章推荐
Python的设计模式编程入门指南
Apr 02 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
tensorflow实现简单的卷积神经网络
May 24 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
Pandas读取csv时如何设置列名
Jun 02 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
python从Oracle读取数据生成图表
Oct 14 Python
浅谈Python基础之列表那些事儿
May 11 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 #Python
python3实现飞机大战
Nov 29 #Python
python之pygame模块实现飞机大战完整代码
Nov 29 #Python
Python使用Pygame绘制时钟
Nov 29 #Python
详解pandas赋值失败问题解决
Nov 29 #Python
python 获取剪切板内容的两种方法
Nov 28 #Python
快速创建python 虚拟环境
Nov 28 #Python
You might like
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
JS重载实现方法分析
2016/12/16 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python清理子进程机制剖析
2017/11/23 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python autoescape标签用法解析
2020/01/17 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
个人整改措施书面材料
2014/10/24 职场文书
三八妇女节致辞
2015/07/31 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python