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中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Python正则表达式使用范例分享
Dec 04 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
python集合的新增元素方法整理
Dec 07 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
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
[jQuery] 事件和动画详解
2019/03/05 jQuery
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
python Crypto模块的安装与使用方法
2017/12/21 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python英语单词测试小程序代码实例
2019/09/09 Python
python unichr函数知识点总结
2020/12/16 Python
《唯一的听众》教学反思
2014/02/20 职场文书
施工员岗位职责
2014/03/16 职场文书
读书小明星事迹材料
2014/05/03 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
英文升职感谢信
2015/01/23 职场文书
部队个人年终总结
2015/03/02 职场文书
会计专业求职信范文
2015/03/19 职场文书
费城故事观后感
2015/06/10 职场文书
化工厂员工工作总结
2015/10/15 职场文书
新学期开学寄语2016
2015/12/04 职场文书
施工安全协议书
2016/03/22 职场文书
送给客户微信问候语!
2019/07/04 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js