概述:最近看了点算法,为了对其有深刻的体会,利用周末时间撸了一个简易版的三消游戏,采用JS+Canvas实现,没有使用额外的游戏引擎,对于初学者来说,也比较容易入门的。下面是小游戏效果展示:

效果展示#

这还是一个比较初级的版本,大家有什么想法欢迎点评;

界面设计:

第一步开始游戏界面设计:

思路如下:

先在项目下新建一个js/runtime/background.js,来渲染不同阶段的背景(具体代码见github)

同时创建一个js/runtime/music.js来存放游戏各个阶段所需要的背景音乐(具体代码见github)

同时在背景图片上绘制开始游戏,并且进入游戏区域;

代码如下:step1() {

ctx.clearRect(0, 0, canvas.width, canvas.height) //清楚上一局动画

this.bg.render(ctx);// 背景渲染

this.login.render(ctx);//开始游戏 渲染

this.touchHandler = this.touchEventHandler.bind(this) //开始游戏点击事件

canvas.addEventListener('touchstart', this.touchHandler)

}

touchEventHandler(e) {

e.preventDefault()

let x = e.touches[0].clientX

let y = e.touches[0].clientY

let area = this.login.btnArea //开始游戏可点区域

if ( x >= area.startX

&& x <= area.endX

&& y >= area.startY

&& y <= area.endY  ) {

this.secenceChange() //进入游戏主题区域

}

}

效果如下:

点击开始游戏,进入消除页面,先绘制消除界面secenceChange() {

canvas.removeEventListener('touchstart',this.touchHandler) //移除上一局事件

this.up = this.update.bind(this)

this.bgupdate()

this.aniId = window.requestAnimationFrame(this.up,canvas)

this.music.secen2()

}

update() {

this.enemyGenerate();//随机生成小动物

this.initEvent();//为画布初始化事件

this.gameinfo.renderImage(ctx,this.score.num)//记录分数和关卡

}

效果如下:

触摸小动物使其发生位移,核心代码如下:(具体见github地址)touchHanderMove(e) {

e.preventDefault()

let x = e.touches[0].clientX-ceilX

let y = e.touches[0].clientY-ceilY

this.endCoordinates = [x, y];

//点击 交换区域

if(x>0&&y>0&&x

核心算法

消除算法:

我采用了动态规划的思想,在双重遍历的时候判断相同就给一个match标记,在消除的时候就判断match是否大于0,

大于0就表示该小动物可以消除,然后再用canvas清空方格;

先判断是否有重复元素:使用isReapet函数

游戏下落算法:

在我们将相应的方块白色之后,其上面的方块应该下落,在这里我的思想是:下落我采用的是从下到上,从左到右的思想,将重复的小动物跟上面未重复的小动物进行位置交换,按照列遍历二维数组,定义一个变量temp,指向为0 的小动物的位置,一旦遇到晓东为为 0 的格子就将其与temp所指的小动物进行交换,一次类推这样的话我们就可以把为空的上移到最顶层,并且不打乱顺序,然后我们在随机填充顶部的空方块就可以了。做完填充之后我们要再做一次消除算法;

down() {

for(let x =numberY-1;x>-1;x--) {

for(let y=0 ; y-1;k--) {

if(this.boxData[y][k].match==0) {

let temp = this.boxData[y][k];

this.boxData[y][k] = this.boxData[y][x]

this.boxData[y][x] = temp;

break;

}

}

}

}

this.downgame();

}

点击重玩,重新生成小动物

在交换和小动物下落的时候再加入音乐素材,后续就是绘制动画了;然后一个低配的消消乐就完成了;

然后再申请一个小游戏账号把代码上传后续其他人就可以进行体验了;

游戏性能优化

一款好的游戏,离不开性能优化,我从以下几点来为改游戏做了优化;

1:离屏 Canvas

在点击开始游戏,进入玩区后,需要反复的擦除和重绘,为了动画的流畅,我使用离屏 Canvas进行绘制的,像网格背景、背景图、关卡等。,并且使用了 小游戏封装的requestAnimationFrame函数来绘制动画,在小游戏 首次调用创建的是显示在屏幕上的画布,之后调用创建的都是离屏画布。初始化时将静态场景绘制完备,需要时直接拷贝离屏Canvas的图像即可。Canvas 绘制本身就是不断的更新帧从而达到动画的效果,通过使用离屏 Canvas,就大大减少了一些静态内容在上屏Canvas的绘制,从而提升了绘制性能使动画流畅。

2:内存优化

玩家在游戏过程中拖动小动物的移动其实就是不断更新坐标信息,然后不断的清空画布再重新绘制,可以想象,这个绘制是非常频繁的,按照普通的做法就需要不断去创建多个新的对象。针对游戏中需要频繁更新的对象,我使用对象池的方法进行优化,对象池维护一个装着空闲对象的池子,如果需要对象的时候,不是直接new,而是从对象池中取出,如果对象池中没有空闲对象,则新建一个空闲对象,就像官方demo实现的对象池类那样;

3:垃圾回收

小游戏中,JavaScript 中的每一个 Canvas 或 Image 对象都会有一个客户端层的实际纹理储存,实际纹理储存中存放着 Canvas、Image 的真实纹理,通常会占用相当一部分内存。

每个客户端实际纹理储存的回收时机依赖于 JavaScript 中的 Canvas、Image 对象回收。在 JavaScript 的 Canvas、Image 对象被回收之前,客户端对应的实际纹理储存不会被回收。通过调用 wx.triggerGC() 方法,可以加快触发 JavaScriptCore Garbage Collection(垃圾回收),从而触发 JavaScript 中没有引用的 Canvas、Image 回收,释放对应的实际纹理储存。

但 GC 具体触发时机还要取决于 JavaScriptCore 自身机制,并不能保证调用 wx.triggerGC() 能马上触发回收,本游戏在点击游戏开始或重玩都会触发一下,及时回收内存垃圾,以保证拥有良好的游戏体验。

兼容测试:

我让我身边的小伙伴们玩了一下,目前在ios或者安卓上基本上都是ok的

结语:

本文章讲述有点简单,详情见https://github.com/xfbaby/game.git,在游戏的优化上还有写需要改进,后续还会持续为大家分享,希望能对小游戏感兴趣的鞋童们有所帮助;

消消乐 游戏算法html,小游戏版消消乐相关推荐

  1. [小游戏资源] 微信小游戏开发资源目录

    一.官方微信小游戏教程 小游戏简易教程 小游戏API大全 小游戏开发工具 小游戏应用商店 二.微信小游戏精品源码 [小游戏源码] 微信小游戏空中射击源码 [小游戏源码] 微信小游戏星途Demo源码 [ ...

  2. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  3. 怎么开发联机小游戏_微信小游戏创意大赛火热进行中,小游戏联机对战引擎免费用...

    腾讯云为小游戏开发者升级工具箱 小游戏联机对战引擎免费用 由微信小游戏举办的"微信小游戏创意大赛"正在火热进行中.12月23日,腾讯云宣布,除了给创意大赛的参赛者提供基础云资源,还 ...

  4. 在线小游戏,在线小游戏大全,网页在线小游戏大全

    在线小游戏推荐,本在线小游戏来源于中国最知名的在线小游戏网站--爱游戏网:http://www.iiyouxi.com 在线小游戏,小游戏,在线游戏,网页游戏,网页小游戏 区养成网页游戏:http:/ ...

  5. 解决QQ小游戏、微信小游戏 getLaunchOptionsSync()获取的数据为旧数据

    解决QQ小游戏.微信小游戏 getLaunchOptionsSync()获取旧数据的问题 维尼与你同在 @13805064305 原因 一般这个问题不是首次登录出现的,而是第二次从别的游戏跳过来,后台 ...

  6. html微信小游戏,白鹭HTML5游戏转微信小游戏问题集锦,你关心的都在这里

    原标题:白鹭HTML5游戏转微信小游戏问题集锦,你关心的都在这里 首先,再次强调一些微信小游戏的基础技术限制: * 不允许操作 DOM.BOM.如果必须改成小游戏相应的 API 调用方式,目前引擎会自 ...

  7. QQ小游戏、微信小游戏获取ip地址,并通过ip得到所在地区

    QQ小游戏.微信小游戏获取用户的ip地址,并通过ip得到所在地区 问题解决了就点赞,还有疑问就留言或是私我,臭弟弟 记得要把合法域名加进去,或者编译的时候不校验合法域名等,不然会报错 如果是后端屏蔽, ...

  8. C语言实现小游戏——模拟微信小游戏《最强飞刀手》

    C语言实现小游戏--模拟微信小游戏<最强飞刀手> 曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限. 这个下游戏界面简陋,把旋转的西瓜做成了平的接盘:实现的功能有:接盘的移动 ...

  9. flash编程可以用c语言,C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件...

    C语言写的小游戏和FLASH小游戏有何区别呢-c语言编程手机软件 (2010-12-05 17:12:08) 标签: 杂谈 分类: 随笔 同题有大大的区分c语言写游戏可以直接挪用体系api举行编著,合 ...

最新文章

  1. fastText中常见问题汇总
  2. orange软件_Orange和戴尔技术公司合作 联合测试和开发5G和商业模式
  3. Hadoop之HDFS常用Shell命令
  4. 【Envi风暴】Envi插件大全:多波段拆分工具的巧妙使用
  5. python 安装html,python安装glob
  6. servlet-cookie实现向客户端写cookie信息
  7. apache php mysql环境搭建_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
  8. java知识总结-25
  9. Windows Azure 云服务角色架构
  10. linux红帽子7.5,Red Hat Enterprise Linux 7.5正式发布,功能增强
  11. 小写字母转大写字母并输出ASCLL值
  12. 2023年天津农学院专升本停招专业的备考建议?
  13. Pycharm——4 元组和 5 字典
  14. 计算机化系统验证管理 360,欧盟发布2018版《计算机化系统验证指南》
  15. 压敏电阻原理、参数、选型
  16. php判断是否是微信浏览器,php判断是否为微信浏览器浏览简单示例
  17. Linux解决No such file or dirctory方法
  18. 2021计算机技术考研非全日制,2021考研考非全日制还是全日制?盘点你不懂的非全日制深层含义~...
  19. PSS E 3.0(大型电力系统仿真计算软件).rar
  20. 支付宝借呗跟花呗有什么区别?

热门文章

  1. 有理函数内插法和外推法算法实现
  2. 华中科技大学计算机学院考研大纲,2017年华中科技大学834计算机专业基础综合考研大纲...
  3. python爬取淘宝商品页面信息
  4. 关于document.selection和TextRange对象的介绍
  5. AJDK 8.0.0 Release Notes
  6. sql在线练习网站(http://sqlzoo.cn)答案解析
  7. 微信视频号又升级,直播功能终于火力全开
  8. 企业微信的聊天机器人来了,免费下载(Python版)
  9. 《财与你相遇--最触动人心的情感理财故事》
  10. 【题解】LuoGu4422:Deda