js实现2048小游戏二维数组更新算法

2048小游戏是当下比较流行的益智游戏了,而它最关键的模块莫过于当手指滑过或鼠标按下后如何确定更新的值。

首先该游戏可以看作一个4*4的二维数组的更新游戏,玩家通过控制数组内元素的合并来不断产生更大的数字,当方向确定时,每一行或每一列的计算方式实际上是一样的,例如,当我确定方向为向左时,每一行的计算方式都是一样的,这样,我们就可以将二维数组的计算简化为一维数组的计算了,然后通过循环计算其他行即可。

而一维数组中主要就是寻找相邻的两个非空值进行合并,相关函数可表示如下:

// 一维数组合并相邻非空项
    function mergeArrayElement(arr) {
        var newArr = []
        var index = -1 // index为-1表示未找到一个非空值
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                if (index != -1) {
                    if (arr[index] == arr[i]) {
                        newArr.push(arr[index] * 2)
                        index = -1
                    } else {
                        newArr.push(arr[index])
                        index = i
                    }
                } else {
                    index = i
                }
            }
        }
        if (index != -1) newArr.push(arr[index])
        // 如果新数组长度不足4,补0
        while (newArr.length < 4) {
            newArr.push(0)
        }
        return newArr
    }

其他方向也都大同小异,稍微对数组加工一下即可获取到更新后的二维数组值,这里贴出完整代码供参考

var arr = [

[1, 1, 2, 2],

[1, 2, 2, 2],

[1, 0, 0, 2],

[1, 2, 2, 4],

]

console.log(get2048NewArray(arr, ))

console.log(get2048NewArray(arr, ‘left‘))   // [ [ 2, 4, 0, 0 ], [ 1, 4, 2, 0 ], [ 1, 2, 0, 0 ], [ 1, 4, 4, 0 ] ]

console.log(get2048NewArray(arr, ‘right‘))  // [ [ 0, 0, 2, 4 ], [ 0, 1, 2, 4 ], [ 0, 0, 1, 2 ], [ 0, 1, 4, 4 ] ]

console.log(get2048NewArray(arr, ‘up‘))     // [ [ 2, 2, 0, 0 ], [ 1, 4, 0, 0 ], [ 4, 2, 0, 0 ], [ 4, 2, 4, 0 ] ]

console.log(get2048NewArray(arr, ‘down‘))   // [ [ 0, 0, 2, 2 ], [ 0, 0, 1, 4 ], [ 0, 0, 2, 4 ], [ 0, 2, 4, 4 ] ]

function get2048NewArray(arr, direction) {

var arrT = arrayTransposition(arr)

var newArr = []

switch (direction) {

// 向上

case ‘up‘:

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arrT[i])

}

break

// 向下

case ‘down‘:

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arrT[i].reverse()).reverse()

}

break

// 向右

case ‘right‘:

for (var i = 0; i < 4; i++) {

// 为了不影响原数组,slice复制一下

newArr[i] = mergeArrayElement(arr[i].slice().reverse()).reverse()

}

break

case ‘left‘:

default:

// 向左

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arr[i])

}

}

return newArr

// 一维数组合并相邻非空项

function mergeArrayElement(arr) {

var newArr = []

var index = -1 // index为-1表示未找到一个非空值

for (var i = 0; i < arr.length; i++) {

if (arr[i] != 0) {

if (index != -1) {

if (arr[index] == arr[i]) {

newArr.push(arr[index] * 2)

index = -1

} else {

newArr.push(arr[index])

index = i

}

} else {

index = i

}

}

}

if (index != -1) newArr.push(arr[index])

// 如果新数组长度不足4,补0

while (newArr.length < 4) {

newArr.push(0)

}

return newArr

}

// 二维数组转置

function arrayTransposition(arr) {

var newArr = [

[],

[],

[],

[]

]

for (var i = 0; i < arr.length; i++) {

for (var j = 0; j < arr[0].length; j++) {

newArr[i][j] = arr[j][i]

}

// console.log(newArr[0][0])

}

return newArr

}

}

var arr = [

[1, 1, 2, 2],

[1, 2, 2, 2],

[1, 0, 0, 2],

[1, 2, 2, 4],

]

console.log(get2048NewArray(arr, ))

console.log(get2048NewArray(arr, ‘left‘))   // [ [ 2, 4, 0, 0 ], [ 1, 4, 2, 0 ], [ 1, 2, 0, 0 ], [ 1, 4, 4, 0 ] ]

console.log(get2048NewArray(arr, ‘right‘))  // [ [ 0, 0, 2, 4 ], [ 0, 1, 2, 4 ], [ 0, 0, 1, 2 ], [ 0, 1, 4, 4 ] ]

console.log(get2048NewArray(arr, ‘up‘))     // [ [ 2, 2, 0, 0 ], [ 1, 4, 0, 0 ], [ 4, 2, 0, 0 ], [ 4, 2, 4, 0 ] ]

console.log(get2048NewArray(arr, ‘down‘))   // [ [ 0, 0, 2, 2 ], [ 0, 0, 1, 4 ], [ 0, 0, 2, 4 ], [ 0, 2, 4, 4 ] ]

function get2048NewArray(arr, direction) {

var arrT = arrayTransposition(arr)

var newArr = []

switch (direction) {

// 向上

case ‘up‘:

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arrT[i])

}

break

// 向下

case ‘down‘:

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arrT[i].reverse()).reverse()

}

break

// 向右

case ‘right‘:

for (var i = 0; i < 4; i++) {

// 为了不影响原数组,slice复制一下

newArr[i] = mergeArrayElement(arr[i].slice().reverse()).reverse()

}

break

case ‘left‘:

default:

// 向左

for (var i = 0; i < 4; i++) {

newArr[i] = mergeArrayElement(arr[i])

}

}

return newArr

// 一维数组合并相邻非空项

function mergeArrayElement(arr) {

var newArr = []

var index = -1 // index为-1表示未找到一个非空值

for (var i = 0; i < arr.length; i++) {

if (arr[i] != 0) {

if (index != -1) {

if (arr[index] == arr[i]) {

newArr.push(arr[index] * 2)

index = -1

} else {

newArr.push(arr[index])

index = i

}

} else {

index = i

}

}

}

if (index != -1) newArr.push(arr[index])

// 如果新数组长度不足4,补0

while (newArr.length < 4) {

newArr.push(0)

}

return newArr

}

// 二维数组转置

function arrayTransposition(arr) {

var newArr = [

[],

[],

[],

[]

]

for (var i = 0; i < arr.length; i++) {

for (var j = 0; j < arr[0].length; j++) {

newArr[i][j] = arr[j][i]

}

// console.log(newArr[0][0])

}

return newArr//.reverse()

}

}

原文地址:https://www.cnblogs.com/chuanzi/p/11638376.html

时间: 2024-07-28 14:43:17

js实现2048小游戏二维数组更新算法的相关文章

使用JS实现2048小游戏

JS实现2048小游戏源码 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器.) <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name=&

js实现2048小游戏

这是学完javascript基础,编写的入门级web小游戏 游戏规则:在玩法规则也非常的简单,一开始方格内会出现2或者4等这两个小数字,玩家只需要上下左右其中一个方向来移动出现的数字,所有的数字就会想滑动的方向靠拢,而滑出的空白方块就会随机出现一个数字,相同的数字相撞时会叠加靠拢,然后一直这样,不断的叠加最终拼凑出2048这个数字就算成功.但是我们的程序没有终点. 一.HTML部分 1 <body> 2 <!-- 分数行 --> 3 <p id="scorePane

二维数组查询算法

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 实现思路:由于行列都为递增排序,所以可以从左下角开始比较查询,若目标值target大于该数,则将查询位置右移,否则上移,即可达到查询目的. 代码: 1 #_*_coding:utf-8_*_ 2 3 class Solution: 4 # array 二维列表 5 def Find(self, target, array):

用原生js写2048小游戏

WEB前端交流群  172994155  回复 ww 验证  <!DOCTYPE html> <html> <head> <title> 2048-game </title> <meta charset="utf-8" /> <style media="screen"> #game { display: none; position: absolute; left: 0px; top

小程序二维数组遍历

js html 效果 原文地址:https://www.cnblogs.com/studyh5/p/9969629.html

php 把一个数组分成有n个元素的二维数组的算法

<?php //把一个数组分成几个数组 //$arr 是数组 //$num 是数组的个数 function partition($arr,$num){ //数组的个数 $listcount=count($arr); //分成$num 个数组每个数组是多少个元素 $parem=floor($listcount/$num); //分成$num 个数组还余多少个元素 $paremm=$listcount%$num; $start=0; for($i=0;$i<$num;$i++){ $end=$i&

c# 类;一维数组;二维数组

1. 输入邮箱帐号,判断格式是否正确  (1)有且只有一个@          Contains IndexOf ==LastIndexOf  (2)不能以@开头           StartsWith  (3)@之后至少有一个.     Contains   (4)@和.不能靠在一起     Contains  (5)不能以.结尾             EndsWith Console.Write("请输入邮箱帐号:"); string a = Console.ReadLine(

查找有序二维数组中的元素

给定一个已排序的二维数组array,在其中查找一个元素value 查找策略如下图: (1)将value和数组的右上角的值比较,如果大于右上角的值,则移除数组的第一行. (2)将value和数组的左下角的值比较,如果大于左下角的值,则移除数组的第一列. (3)直到查找完毕,已经找不到符合(1)(2)的情况后,或者数组只剩下一个元素 (4)得到一个较小的二维数组,再遍历该数组即可.             /** * Created by wuchao on 17-3-29. */ import j

题目一:使用Java实现二维数组中的查找

考点:数组 题目:二维数组中的查找 描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 方式一:选择从左下角开始搜寻,因为选择在左下角搜寻的话,如果目标值大于搜索值,那么就向右继续搜索,如果目标值小于搜索值,那么就向上继续搜索.在左上角就无法形成这样的判断.时间复杂度为:0(lgn) package cn.imooc.java2; public class Solution