赞
踩
相信大家都玩过一款经典的小游戏2048,下面我分享一下我实现这款小游戏思路(可能有更好的方法,欢迎大家留言)
numbers = [4, 2, 4, 4, 0, 0, 2, 2, 0, 0, 0, 2, 4, 0, 0, 0]
值为零的数字隐藏。
每一次滑动后重新对numbers赋一次值。
假如进行一次上滑,效果是这样的(这里先不添加新数字):
我们可以看到:两个相同的数字相撞时,这两个数字相加。要怎么实现呢?
先把长度为16的数组按顺序拆分为4个长度为4的数组并合并组成一个二维数组。
numbers = [4, 2, 4, 4, 0, 0, 2, 2, 0, 0, 0, 2, 4, 0, 0, 0]
arr = [[4, 2, 4, 4],[0, 0, 2, 2], [0, 0, 0, 2], [4, 0, 0, 0]]
这样的话,arr的每一元素就表示数字矩阵的每一行(从上到下)。
过程大致如下:
上述过程重复三次:
额。。。和结果不太一样。arr的正确结果应该是:
[8, 2, 4, 4]
[0, 0, 2, 4]
[0, 0, 0, 0]
[0, 0, 0, 0]
这是因为同一列的数字只能相加一次,所以
定义一个数组added,在数字相加的时候记录该数字的列数并存到added里,每次数字相加前检查added里面有没有该数字列数,如果有,就不相加了。(上述例子中added = [3])
最后把二维数组arr转为一维数组赋值给numbers,这样就完成了一次数字矩阵的更新了。
到这里一次上滑动作就完成了。
有了上滑的思路,其他方向滑动只是大同小异。
我们只需要改变二维数组arr向一位数组numbers取数字的顺序就行了。
所以滑动的行为可以封装成一个函数,根据参数判断是哪一个方向即可。
function move(direction){
…
}
在游戏开始的时候和一次滑动动作后,向为0的数字中随机选一个变为2
<template> <div class="play"> <div class="content" @touchstart="start" @touchend="end"> <div class="item" v-for="(item,index) in numbers" :key='index'> <div :class="item===0?numberZeroClass:'number'" :style="itemStyles[Math.log2(item)]">{ { item}}</div> </div> </div> </div> </template> <script> export default { name:'play', data() { return { numbers: [], numberZeroClass: 'number numberZero', // 格子为零将数字隐藏 itemStyles:'color:#000; background:', // 根据数字大小设置颜色 startX: '', //开始触摸的x坐标 startY: '', //开始触摸的y坐标 } }, created() { this.numbers = [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] this.itemStyles = [ 'color:#000; background:#FFF3EE', 'color:#000; background:#FFDAC8', 'color:#000; background:#FFBD9D', 'color:#000; background:#FF9D6F', 'color:#000; background:#FF5809', 'color:#000; background:#FF8040', 'color:#fff; background:#F75000', 'color:#fff; background:#BB3D00', 'color:#fff; background:#842B00', 'color:#fff; background:#424200', 'color:#fff; background:#000079', 'color:#fff; background:#2F0000', ] // this.fristNumber() }, methods: {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。