小游戏2048 实现思路及代码(vue)

相信大家都玩过一款经典的小游戏2048,下面我分享一下我实现这款小游戏思路(可能有更好的方法,欢迎大家留言)

数字的表示与更新

  • 用一个长度为16的一维数组来表示数字矩阵,索引表示位置,值表示数字大小。
    例如:在这里插入图片描述

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

代码(vue)

<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: {
   
			
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值