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跳出循环语句continue与break的区别
Aug 25 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
Python中Django框架利用url来控制登录的方法
Jul 25 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
python实现二叉查找树实例代码
Feb 08 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Numpy数组的广播机制的实现
Nov 03 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 Python
如何用python实现一个HTTP连接池
Jan 14 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
Python中格式化format()方法详解
2017/04/01 Python
Python编程argparse入门浅析
2018/02/07 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
工程部主管岗位职责
2013/11/17 职场文书
小学教师事迹材料
2014/01/13 职场文书
银行类自荐信
2014/02/04 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
银行服务感言
2014/03/01 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
顶岗实习计划书
2015/01/16 职场文书
优秀党员个人总结
2015/02/14 职场文书
暂停营业通知
2015/04/25 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
Python图像处理之图像拼接
2021/04/28 Python