当前位置:   article > 正文

小游戏2048 实现思路及代码(vue)_2048小游戏代码的每步解析

2048小游戏代码的每步解析

相信大家都玩过一款经典的小游戏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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/191974
推荐阅读
相关标签
  

闽ICP备14008679号