python实现飞机大战微信小游戏


Posted in Python onMarch 21, 2020

0、前言

我学一种语言,可以说学任何东西都喜欢自己动手实践,总感觉自己动手一遍,就可以理解的更透彻,学python也一样,自己动手写代码,但更喜欢做点小东西出来,一边玩一边学。下面我就展示一下我最近做的一个小游戏。

1、素材准备

首先我们先来预览一下游戏的最终运行界面

python实现飞机大战微信小游戏

根据游戏界面,我们可以清楚的知道必须要先准备游戏背景图片,飞机图片,子弹图片等等。这些素材我已经放到网上, 点我下载 ,里面包括了我的代码和图片素材。

2、代码部分

库依赖:

pygame

本游戏主要有两个py文件,主文件plan_main.py代码部分如下:

from plan_sprite import *


class PlanGame(object):
 """飞机大战主程序"""

 def __init__(self):
 print("游戏初始化")
 # 创建游戏窗口
 self.screen = pygame.display.set_mode(SCREEN_RECT.size)
 # 创建游戏时钟
 self.clock = pygame.time.Clock()
 # 调用私有方法,精灵和精灵组的创建
 self._create_sprite()
 # 设置定时器事件 - 1秒创建一个敌机
 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
 # 设置定时器事件 - 0.5秒创建一个子弹
 pygame.time.set_timer(HERO_FIRE, 100)

 def _create_sprite(self):
 # 创建背景精灵和精灵组
 bg1 = BackGround()
 bg2 = BackGround(True)
 self.back_group = pygame.sprite.Group(bg1, bg2)
 # 创建精灵组
 self.enemy_group = pygame.sprite.Group()
 # 创建英雄精灵和精灵组
 self.hero = Hero()
 self.hero_group = pygame.sprite.Group(self.hero)

 def start_game(self):
 print("游戏开始...")
 while True:
 # 设置刷新帧率
 self.clock.tick(FRAME_PER_SECOND)
 # 事件监听
 self._event_handler()
 # 碰撞检测
 self._check_collide()
 # 更新/绘制游戏精灵
 self._update_sprite()
 # 刷新屏幕
 pygame.display.update()

 def _event_handler(self):
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 PlanGame._game_over()
 elif event.type == CREATE_ENEMY_EVENT:
 # 创建敌机精灵
 enemy = Enemy()
 # 将创建的敌机精灵加到精灵组
 self.enemy_group.add(enemy)
 # 第一种按键监听方法
 # if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
 # self.hero.speed = 2
 # elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
 # self.hero.speed = -2
 # else:
 # self.hero.speed = 0
 # 第二种:使用键盘模块提供的方法获取按键元组
 keys_pressed = pygame.key.get_pressed()
 # 判断元组中的按键索引值
 if keys_pressed[pygame.K_RIGHT]:
  self.hero.speed = 2
 elif keys_pressed[pygame.K_LEFT]:
  self.hero.speed = -2
 else:
  self.hero.speed = 0
 # 飞机发射子子弹事件
 self.hero.fire()

 def _check_collide(self):
 pygame.sprite.groupcollide(self.enemy_group, self.hero.bullets, True, True)
 enemy_list = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
 if len(enemy_list):
 self.hero.kill()
 PlanGame._game_over()

 def _update_sprite(self):
 self.back_group.update()
 self.back_group.draw(self.screen)

 self.enemy_group.update()
 self.enemy_group.draw(self.screen)

 self.hero_group.update()
 self.hero_group.draw(self.screen)

 self.hero.bullets.update()
 self.hero.bullets.draw(self.screen)

 @staticmethod
 def _game_over():
 print("游戏结束")
 pygame.quit()
 exit()


if __name__ == '__main__':
 # 创建游戏对象
 game = PlanGame()
 # 启动游戏
 game.start_game()

下面是初始化飞机精灵文件,文件名plan_sprite.py,主要功能包括初始化飞机精灵类,敌机类,子弹类,设置背景类等,代码如下:

import random
import pygame

# 定义常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
FRAME_PER_SECOND = 60
# 创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
HERO_FIRE = pygame.USEREVENT + 1 # 英雄发射子弹事件


class GameSprite(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):
 self.rect.y += self.speed


class BackGround(GameSprite):
 """游戏背景对象"""

 def __init__(self, is_alt=False):
 super().__init__("./images/background.png")
 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 Enemy(GameSprite):
 def __init__(self):
 # 调用父类的方法,创建敌机精灵,同时指定敌机图片
 super().__init__("./images/enemy1.png")
 # 指定敌机的随机速度
 self.speed = random.randint(1, 3)
 # 指定敌机的初始位置
 self.rect.bottom = 0
 max_x = SCREEN_RECT.width - self.rect.width
 self.rect.x = random.randint(1, max_x)

 def update(self):
 # 调用父类方法,保持垂直飞行
 super().update()
 # 判断是否飞出屏幕,若是,则从精灵组中删除敌机精灵
 if self.rect.y >= SCREEN_RECT.height:
 self.kill()

 def __del__(self):
 # print("敌机挂了 %s",self.rect)
 pass


class Hero(GameSprite):
 """飞机精灵"""

 def __init__(self):
 # 调用父类方法,设置image_name
 super().__init__("./images/me1.png", 0)
 # 设置飞机初始位置
 self.rect.centerx = SCREEN_RECT.centerx # 设置飞机初始位置居中
 self.rect.bottom = SCREEN_RECT.bottom - 20 # 初始化飞机位置为距底部向上少20
 # 创建子弹精灵组
 self.bullets = pygame.sprite.Group()

 def update(self):
 # 飞机水平移动
 self.rect.x += self.speed
 if self.rect.left < 0: # 防止飞机从左边边界移出
 self.rect.left = 0
 elif self.rect.right > SCREEN_RECT.right: # 同理,防止飞机从右边移出边界
 self.rect.right = SCREEN_RECT.right

 def fire(self):
 # 创建子弹精灵
 bullet = Bullet()
 # 设置子弟位置
 bullet.rect.bottom = self.rect.y - 20
 bullet.rect.centerx = self.rect.centerx
 # 将精灵添加到精灵组
 self.bullets.add(bullet)


class Bullet(GameSprite):
 """子弹精灵"""

 def __init__(self):
 super().__init__("./images/bullet1.png", -2) # 初始化子弹,-2为子弹移动速度

 def update(self):
 # 调用父类方法,子弹垂直飞行
 super().update()
 if self.rect.bottom < 0:
 self.kill()

3、小结

游戏界面就如开头图片所示,这个是比较简单的小游戏,代码难度不大,主要是才接触python,闲时可以写着玩,练一下手而已。

如果有什么问题,欢迎留言讨论。

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

Python 相关文章推荐
Python实现一个简单的MySQL类
Jan 07 Python
Python中标准模块importlib详解
Apr 16 Python
Python 多进程和数据传递的理解
Oct 09 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
Python中logging日志库实例详解
Feb 19 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python实现微信小程序自动回复
Sep 10 #Python
python中map的基本用法示例
Sep 10 #Python
python2 与 pyhton3的输入语句写法小结
Sep 10 #Python
django DRF图片路径问题的解决方法
Sep 10 #Python
详解python中Numpy的属性与创建矩阵
Sep 10 #Python
tensorflow使用神经网络实现mnist分类
Sep 08 #Python
Python unittest单元测试框架总结
Sep 08 #Python
You might like
destoon官方标签大全
2014/06/20 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
Python实现上下班抢个顺风单脚本
2018/02/07 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python插件机制实现详解
2020/05/04 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
置业顾问岗位职责
2014/03/02 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
承诺书格式范文
2014/06/03 职场文书
扬尘污染防治方案
2014/06/15 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
公司欠款证明
2015/06/24 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
MongoDB使用场景总结
2022/02/24 MongoDB
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python