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使用xauth方式登录饭否网然后发消息
Apr 11 Python
python简单读取大文件的方法
Jul 01 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
python颜色随机生成器的实例代码
Jan 10 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
超级详细实用的pycharm常用快捷键
May 12 Python
Python利用zhdate模块实现农历日期处理
Mar 31 Python
Python列表的索引与切片
Apr 07 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中模拟POST传递数据的两种方法分享
2011/09/16 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
python计算auc指标实例
2017/07/13 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
2014年纪检部工作总结
2014/11/12 职场文书
期末复习计划
2015/01/19 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python