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中global与nonlocal比较
Nov 21 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
python xml解析实例详解
Nov 14 Python
Python处理菜单消息操作示例【基于win32ui模块】
May 09 Python
Python中的Numpy矩阵操作
Aug 12 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
Django model select的多种用法详解
Jul 16 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
Python Flask异步发送邮件实现方法解析
Aug 01 Python
python实现感知机模型的示例
Sep 30 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
php结合飞信 免费天气预报短信
2009/05/07 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
PHP与以太坊交互详解
2018/08/24 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
Javascript 之封装(Package)
2018/09/14 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
python pandas生成时间列表
2019/06/29 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
Python 防止死锁的方法
2020/07/29 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
九年级家长会邀请函
2014/01/15 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
搞笑创意广告语
2014/03/17 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android