Vue实现开心消消乐游戏算法


Posted in Javascript onOctober 22, 2019

之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来。后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来。

效果展示#

先在这里放一个最终实现的效果,还是一个比较初级的版本,大家有什么想法欢迎评论哦

Vue实现开心消消乐游戏算法

游戏规则:

初始时会给玩家十分的初始分,每拖动一次就减一分,每消除一个方块就加一分,直到最后分数为0游戏结束

任意两个方块都可以拖动

界面设计#

页面的布局比较简单,格子的数据是一个二维数组的形式,说到这里大家应该已经明白界面是怎么做的了。

<div
 v-for="(item, index) in squareData"
 :key="index"
 class="row">
 <div
  v-for="(_item, _index) in item"
  :key="_index"
  class="square"
  :class="_item"
  @mousedown="dragStart(index, _index)"
  @mouseup="dragEnd">
  {{_item}}
 </div>
</div>

大家应该注意到了 :class="_item" 的写法,动态命名class,使得其每个种类的方块的颜色都不同,最后可以按照同色消除的玩法就行操作。

.square.A{
 background-color: #8D98CA;
}
.square.S{
 background-color: #A9A2F6;
}
/*其余操作相同*/

同时在玩家点击方块的时候方块会左右摆动以表示选中了此方块,还可以提升游戏的灵动性。关于HTML动画的实现方式有很多,在这里我们使用CSS animation进行操作,代码如下:

@keyframes jitter {
 from, 50%, to {
  transform: rotate(0deg);
 }
 10%, 30% {
  transform: rotate(10deg);
 }
 20% {
  transform: rotate(20deg);
 }
 60%, 80% {
  transform: rotate(-10deg);
 }
 70% {
  transform: rotate(-20deg);
 }
}
/* 只要是用户点击不动,动画就不会停止 */
.square:active{
 animation-name: jitter;
 animation-duration: 0.5s;
 animation-iteration-count: infinite;
}

核心算法#

消除算法

上面提到我之前是做过一道题是判断一个二维数组中有没有可消的元素,有的话是多少个。

在这里我们可以这样想,最开始遍历一整个二维数组,每次定义一个 X0 , X1 , Y0, Y1, 然后每次计算其上下左右连续相同方块的位置,在这个过程中要注意边界问题,然后我们记录下这四个变量,只要 |X0-X1+1|>=3 或者 |Y0-Y1+1|>=3,我们就可以将这个方块的坐标加入到 del数组中。

遍历完一整个二维数组之后,我们就可以将 del数组中对应坐标位置的方块内容变为 '0', 由于我们没有对 0 定义样式,所以在没有执行下落算法之前变为 0 的方块为白色。

下落算法

在我们将相应的方块白色之后,其上面的方块应该下落,在这里我的思想是这个样子的。

按照列遍历二维数组,定义一个指针 t,指向上次不为 0 的方块位置,一旦遇到方块不为 0 的格子就将其与t所指的方块就行交换,一次类推,示意图如下:

Vue实现开心消消乐游戏算法

这样的话我们就可以把为空的上移到最顶层,并且不打乱顺序,然后我们在随机填充顶部的空方块就可以了。做完填充之后我们要再做一次消除算法,直到del数组的长度为空为止,这个道理大家应该都能想得到。

代码如下

clear(): void {
 const m: number = 10;
 const n: number = 10;
 while (true) {
  const del: any[] = [];
  for (let i: number = 0; i < m; i++) {
   for (let j: number = 0; j < n; j++) {
    if (this.squareData[i][j] === '0') {
     continue;
    }
    let x0: number = i;
    let x1: number = i;
    let y0: number = j;
    let y1: number = j;
    while (x0 >= 0 && x0 > i - 3 && this.squareData[x0][j] === this.squareData[i][j]) {
     --x0;
    }
    while (x1 < m && x1 < i + 3 && this.squareData[x1][j] === this.squareData[i][j]) {
     ++x1;
    }
    while (y0 >= 0 && y0 > j - 3 && this.squareData[i][y0] === this.squareData[i][j]) {
     --y0;
    }
    while (y1 < n && y1 < j + 3 && this.squareData[i][y1] === this.squareData[i][j]) {
     ++y1;
    }
    if (x1 - x0 > 3 || y1 - y0 > 3) {
     del.push([i, j]);
    }
   }
  }
  if (del.length === 0) {
   break;
  }
  this.score += del.length;
  for (const square of del) {
   this.$set(this.squareData[square[0]], square[1], '0');
  }
  for (let j: number = 0; j < n; ++j) {
   let t: number = m - 1;
   for (let i: number = m - 1; i >= 0; --i) {
    if (this.squareData[i][j] !== '0') {
     [this.squareData[t][j], this.squareData[i][j]] = [this.squareData[i][j], this.squareData[t][j]];
     t -= 1;
    }
   }
  }
 }
},

游戏结束#

分数为 0 的时候游戏结束,此时在执行一遍初始化函数,重新生成一个开心消消乐格子,将分数初始化为10.

if (this.score <= 0) {
  if (confirm('分数用光了哦~~')) {
   this.init();
  } else {
   this.init();
  }
 }

项目源代码#

目前项目是在github上托管,欢迎PR!点此跳转

总结

以上所述是小编给大家介绍的Vue实现开心消消乐算法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript 动态生成方法的例子
Jul 22 Javascript
Chrome Form多次提交表单问题的解决方法
May 09 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
JavaScript数组去重算法实例小结
May 07 Javascript
webpack手动配置React开发环境的步骤
Jul 02 Javascript
Angular5集成eventbus的示例代码
Jul 19 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
在vue里使用codemirror遇到的问题
Nov 01 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
JS使用H5实现图片预览功能
Sep 30 Javascript
vue2路由基本用法实例分析
Mar 06 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 #Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 #Javascript
微信小程序开发之转发分享功能
Oct 22 #Javascript
微信小程序转发事件实现解析
Oct 22 #Javascript
小程序点击图片实现png转jpg
Oct 22 #Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
Oct 22 #Javascript
微信小程序实现左侧滑动导航栏
Apr 08 #Javascript
You might like
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
Python callable()函数用法实例分析
2018/03/17 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
python中如何写类
2020/06/29 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
自我鉴定200字
2013/10/28 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
差生评语大全
2014/05/04 职场文书
财政局长个人总结
2015/03/04 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
MySQL读取JSON转换的方式
2022/03/18 MySQL
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫