前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JavaScript消除游戏实现思路讲解

JavaScript消除游戏实现思路讲解

作者头像
用户1608022
发布于 2018-04-11 06:32:24
发布于 2018-04-11 06:32:24
1.2K0
举报

之前讲解过一款JavaScript贪食蛇游戏详细的设计与实现,但是以那种方式进行描述 , 整篇文章会显得复杂冗长,除非深入细致的阅读和思考,否则文中内容并不容易理解。这次换一种方式讲解一款JavaScript消除游戏的设计,文章只描述游戏的实现思路,不涉及代码的细节, 具体的实现细节, 读者可以通过文末链接下载代码样例进行深入探究。

简单的消除游戏的实现并不涉及复杂的算法, 使用常规的前端编程思路即可实现游戏。 核心思路概括描述就是:「操纵一个对象数组,将数组的变化映射到html游戏界面上」

[[1,2,3,4,5,6]

[6,3,3,1,2,3]

[6,1,3,1,6,5]

[1,2,1,3,4,4]

[1,1,6,6,6,6]

[5,6,3,2,1,1]]

游戏的数据结构类似于上面示例中的二维数组, 其中标红的数组项便是符合消除要求的。示例中的结构经过简化,真实的游戏结构中每一个数组项并不是纯数字, 而是一个对象, 对象结构如下

此结构表示消除游戏每一格中的元素

id为元素的唯一标识符

num表示元素的种类, 如果是一个水果消除游戏,那么每个值代表一种水果

moveCount表示当符合消除规则的元素组被移除后,剩余的元素填充到被消除元素位置上时需要移动的单位数。

isNew表示元素是否是新生成的,游戏过程中每次被消除掉多少元素, 同样需要生成新的相同数量的元素

接下来描述游戏的逻辑操作,逻辑操作的接口如下

initBoard方法用来初始化表示游戏数据结构的二维数组, 数组中的项是前面描述的Grid对象, 对象中的num字段是随机生成的,代表不同类型的元素。当游戏开始或者当前游戏状态已没有可消除的元素而需要重新生成局面时,就会调用这个方法。

testContinuable方法用来测试游戏中两个元素互相之间交换位置后是否出现了满足消除要求的情况, 此方法不改变游戏的数据结构, 纯粹进行判断和测试。 当我们游戏时交换元素位置, 便会调用这个方法进行测试, 交换位置后是否满足消除需求。

continuable方法用来判断整个游戏局面中接下来是否出现了满足消除要求的情况, 换句话说, 它用来判断当前局面是否是死局。

remove方法用来移除满足消除要求的元素

fillGameBoard方法的作用是当移除满足消除需求的元素以后, 对游戏数据结构中剩余元素的状态进行修改。 如计算元素对象的moveCount值,因为当有元素被消除后 ,在被消除元素坐标上方的元素需要下移, 填充被消除元素的位置, 这个moveCount值就是用来表示元素到新的位置上需要移动几格。另外, 这个方法还需要生成与被消除元素相同个数的新元素,并把新元素的isNew属性设置为true, 这个属性在游戏界面的生成中需要用到,当被消除的元素的html元素被移掉后,游戏UI程序需要根据isNew属性判断是否生成新的html。

getFirstEmptyPos方法获得游戏结构中第一个空的位置, 当调用remove方法后, 被消除的元素的位置为被置为null, 此方法便是获取这些null所在的位置。

getPos方法便是根据游戏数组结构中元素的id来获得元素的位置

swapGrid方法用来交换两个元素的位置。

这些方法是实现游戏的基础, 游戏界面以外的部份都被封装在这些操作当中。 接下来我们讲解整个程序的执行过程, 流程如下

  1. 渲染界面前, 首先要做的就是调用initBoard方法把数据结构初始化好, 设置结构中每个元素的moveCount字段的值, 这个值 跟动画效果的播放密切相关, 每一个元素往下落到自己所在的位置的跨度就由这个值决定。
  2. 界面程序根据游戏数组结构生成相应的html
  3. 根据游戏结构中每个元素的moveCount值播放动画, 初始化消除游戏的第一屏, 并为游戏的UI交互绑定事件。
  4. 检查第一屏中是否有满足消除要求的元素, 如果有则调用removefillGameBoard自动执行消除,并播放过消除前到消除后的过渡动画。 完成这个操作后再一次检查是否有满足消除要求的元素, 如果有则再次重复上面这个过程,直到没有符合消除要求的元素为止。 如果没有,则表示已游戏准备就绪,用户可进行游戏。 在这里有一种例外的情况,当在游戏就绪的情况下,当前的局面却是个死局, 那么游戏的第一屏将注销掉, 程序自动初始化第二屏。
  5. 最后是游戏的操作过程。消除游戏操作本质上只是不断的交换结构中元素的位置, 并检查位置在交换后是否满足可消除的状态, 如果满足要求只需要调用remove方法和fillGameBoard方法消除符合要求的元素并改变元素的状态和生成新的元素项, 然后再播放过渡动画,这些动作组合在一起便是一个完整的游戏操作过程。

以上便是整个消除游戏大致的实现思路, 具体的细节, 还需要一行一行的啃完样例所有代码才能理解。附上样例代码的下载地址

http://pan.baidu.com/s/1bo7IrHd

游戏是针对PC端浏览器设计, 执行消除的交互操作需要使用鼠标点击两个相邻的格子,因此,并不是很人性化, 但这个示例是为了实现消除功能而开发的, 更关注的是代码的逻辑, 所以没有交互操作上下功夫, 如果有同学觉得不好玩, 那也在情理之中。

最后,阅读完这篇文章和样例中的代码后的同学, 如果能自己徒手实现一下, 相信对于前端水平会有一定程度上的提高, 毕竟实现游戏比实现其它前端效果难度相对要高。 如果有兴趣, 请务必尝试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 带你撸出一手好代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript贪食蛇游戏制作详解
之前闲时开发过一个简单的网页版贪食蛇游戏程序,现在把程序的实现思路写下来,供有兴趣同学参考阅读。 代码的实现比较简单,整个程序由三个类,一组常量和一些游戏逻辑以外的初始化和控制代码组成,总共400多
用户1608022
2018/04/11
1.2K0
JavaScript贪食蛇游戏制作详解
JavaScript实现Fly Bird小游戏
游戏界面中有三样元素,分别是“小鸟”,“障碍”,和“计分器”,我们依次来创建相应的对象。
疯狂的技术宅
2019/03/28
1.4K0
JavaScript实现Fly Bird小游戏
如何打造一款三消类游戏
Shopee Candy 是一款面向多地区市场的三消类休闲 H5 游戏,用户可以在游戏中获得 Shopee Coins、商家购物券等优惠奖励,既可以增强用户粘性,激励用户消费,也可以为商家引流。同时,分享领奖、好友排行榜等机制增强了游戏的社交性,起到了为平台拉新的作用。此外,H5 游戏简单、轻量、高适配的特性与 Shopee 用户的使用习惯非常契合,可以即点即玩,参与门槛低的同时兼顾了趣味性。
Shopee技术团队
2022/01/06
1.7K0
如何打造一款三消类游戏
汉诺塔自动解题动画中的iOS开发技巧
1、将盘子全部移动到塔C 2、每次只能移动一个圆盘; 3、大盘不能叠在小盘上面。
Cloudox
2022/01/07
3960
汉诺塔自动解题动画中的iOS开发技巧
使用JavaScript实现一个俄罗斯方块
使用JavaScript实现一个俄罗斯方块 清明假期期间,闲的无聊,就做了一个小游戏玩玩,目前游戏逻辑上暂未发现bug,只不过样子稍微丑了一些-.- 项目地址:https:
贾顺名
2018/04/12
9840
使用JavaScript实现一个俄罗斯方块
用 PyGame 入门专业游戏开发(四)
根据游戏逻辑,麻将被选中后,是可以再点击桌面上的空位,进行移动的。要实现麻将的移动,需要有以下几点功能需要实现:
韩伟
2023/12/12
2650
用 PyGame 入门专业游戏开发(四)
前端都要了解的2D游戏化互动入门基础
现在越来越多的公司和APP开始使用游戏化的方式去做产品了,所谓游戏化,是指在非游戏环境中将游戏的思维和游戏的机制进行整合运用,以引导用户互动和使用的方法。支付宝里面的蚂蚁庄园、蚂蚁森林,通过游戏和公益的结合实现用户的留存和活跃。淘宝支付宝的芭芭农场、京东的东东果园、拼多多的多多果园、美团的小美果园...无一不是通过游戏化的方式去提升用户留存的方案。
ConardLi
2021/09/29
1.7K0
前端都要了解的2D游戏化互动入门基础
二维矩阵节点的链式消除和自动补齐!消消乐类游戏可参考!
点击选中开始节点,按住拖动到相邻的节点,相邻节点添加至选择链中,沿着链往回拖,将会取消之前选择的节点,松开手指以后,选择的节点将会消失,空节点上方的节点将会自动掉落,上方自动随机生成新的数字方块掉落,如上面效果图所示。
一枚小工
2020/05/09
8610
利用函数和数组实践一个扫雷小游戏!(start from scratch)
不知道大家有没有玩过扫雷,这可是中学时期信息课没网但又可以快乐的好东西(手动狗头),但是如果电脑上没有安装扫雷,又怎么能让美好的信息课白白流逝呢(不是没有)
用户11039545
2024/03/28
1480
利用函数和数组实践一个扫雷小游戏!(start from scratch)
JavaScript 解构的5个有趣用法
在本文中,除了基本用法之外,我还将会介绍在 JavaScript 中 5 种有趣的解构用法。
疯狂的技术宅
2019/10/22
9240
JavaScript 编程精解 中文第三版 十六、项目:平台游戏
我最初对电脑的痴迷,就像许多小孩一样,与电脑游戏有关。我沉迷在那个计算机所模拟出的小小世界中,我可以操纵这个世界,我同时也沉迷在那些尚未展开的故事之中。但我沉迷其中并不是因为游戏实际描述的故事,而是因为我可以充分发挥我的想象力,去构思故事的发展。
ApacheCN_飞龙
2022/12/01
1.8K0
JavaScript 编程精解 中文第三版 十六、项目:平台游戏
国庆节前端技术栈充实计划(4):用H5撸一个贪吃蛇游戏
第一种是笔者小时候在掌上游戏机最先体验到的(不小心暴露了年龄),具体玩法是蛇吃完一定数量的食物后就通关,通关后速度会加快;第二种是诺基亚在1997年在其自家手机上安装的游戏,它的玩法是吃到没食物为止。笔者要实现的就是第二种玩法。
疯狂的技术宅
2019/03/27
7810
国庆节前端技术栈充实计划(4):用H5撸一个贪吃蛇游戏
JavaScript(五)
这一篇,我们讲讲 JavaScript 引用类型中的 Object、Array 和 Date。 在 ECMAScript 中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管 ECMAScript 从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。 对象是某个特定引用类型的实例,新对象是使用 new 操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,其目的是创建新对象。如下:
1ess
2021/10/29
9120
前端动效讲解与实战
本文将从各个角度来对动画整个体系进行分类,并且介绍各种前端动画的实现方法,最后我们将总结在实际开发中的各个场景的动画选择方案。
2020labs小助手
2022/09/26
2.7K0
保姆级别的扫雷游戏
扫雷过程中,布置的雷和排查出的雷的信息都需要储存,所以我们需要一定的数据结构来存储这些信息。
用户11328191
2024/10/23
1020
保姆级别的扫雷游戏
laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
下面将介绍联网版贪吃蛇大作战的客户端代码,本项目用 laya 引擎开发,typescript 作为开发语言,具体的技术选型及项目准备可参考 上一篇文章
siri
2022/11/18
1.6K1
laya游戏开发之贪吃蛇大作战(二)—— 贪吃蛇客户端
怒肝 JavaScript 数据结构 — 数组篇(二)
上一篇我们认识了数据结构中的数组,并且总结了 JavaScript 中数组的基本操作,包括初始化数组,添加,修改,删除数组项等,还总结了 JavaScript 内置的数组操作函数。
杨成功
2022/09/22
1K0
也说棋类游戏
之前自己编写过一点关于棋类游戏的代码,所以对于这类游戏的大致构成也算是有一些肤浅的认识,前一阵子突然想到应该将这些个零散知识好好总结一番,以算作为自己学习的一点交代。可恨这不总结还好,一总结才发现自己以前自认为通晓的知识原来还是一知半解,更是发现了一堆自己先前遗漏的知识,唉,真可谓学海无涯啊......不过本着学习“八成”原则(这是我前阵子看过的一本书中的观点,感觉还是颇为心有戚戚的,意思大抵是学习过程中不要太过求全求通,慢慢学下去自会变全变通,书名曰《超级学习法》,是本老书了,作者是一名日本的教授,具体姓氏已经不记得了,有兴趣的朋友可以Google看看),自己还是就着多有纰漏的知识储备总结了起来,并且还煞有其事的编写了一些代码,本想借着这篇博文写一写自己总结来的看法,但后来想想与其自己肤浅的在这搬运知识,还不如将自己在学习过程中参考的一些文献介绍给大家,毕竟这原版终归要胜过盗版啊 :)
用户2615200
2018/08/02
8160
用 PyGame 入门专业游戏开发(二)
上一篇介绍了一个游戏运行的最基本结构,本篇开始根据一个具体的游戏,做一个游戏关卡。下面要做的是一个叫“推麻将”的桌面玩法。现在介绍一下这个玩法的具体内容:
韩伟
2023/12/04
3720
用 PyGame 入门专业游戏开发(二)
用 PyGame 入门专业游戏开发(三)
根据游戏规则,两张相同图案的麻将,如果互相之间没有其他麻将牌被直线阻隔(中间的距离可以无限),可以通过先后点击选择这两张麻将,消除这两张牌。
韩伟
2023/12/12
2030
用 PyGame 入门专业游戏开发(三)
相关推荐
JavaScript贪食蛇游戏制作详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文