JavaScript:清理数组路径

时间:2017-11-20 06:27:11

标签: javascript arrays math random

我有使用JavaScript创建数组路径的代码。我无法发布所有代码,因为它太长了;但是,我可以向您展示代码的片段,以便您可以看到我如何制作路径。这是代码片段。

    var MazeComplete = false;
    var RV1 = null;
    var RV2 = null;
    while(MazeComplete === false){
        //Get Maze Blocks.
        RV1 = Math.random()*(MazeArray.length)|0;
        RV2 = Math.random()*(MazeArray.length)|0;

        //No dead Or Used Values
        if(MazeArray[RV1][RV2] == 0){
            MazeArray[RV1][RV2] = 3;
        }else if((MazeArray[RV1][RV2] == MazeArray[0][0] && MazeArray[0][0] == 0) || 
                 (MazeArray[RV1][RV2] == MazeArray[0][9] && MazeArray[0][9] == 0) ||
                 (MazeArray[RV1][RV2] == MazeArray[9][0] && MazeArray[9][0] == 0) ||
                 (MazeArray[RV1][RV2] == MazeArray[9][9] && MazeArray[9][9] == 0)){
            MazeArray[RV1][RV2] = 0;
        }else{
            continue;
        }
        //[0][0]
        if(MazeArray[RV1][RV2] == MazeArray[0][0] && (MazeArray[0][0] == 0 && (MazeArray[1][0] == 2 || MazeArray[0][1] == 2))){
            //Setting Highs.
            MazeArray[0][0] = 2;
        }
        //[0][1]
        else if(MazeArray[RV1][RV2] == MazeArray[0][1] && (MazeArray[0][0] == 2 || MazeArray[0][2] == 2 || MazeArray[1][1] == 2)){
            MazeArray[0][1] = 2;
        }
        //[0][2]
        else if(MazeArray[RV1][RV2] == MazeArray[0][2] && (MazeArray[0][1] == 2 || MazeArray[0][3] == 2 || MazeArray[1][2] == 2)){
            MazeArray[0][2] = 2;
        }
        //[0][3]
        else if(MazeArray[RV1][RV2] == MazeArray[0][3] && (MazeArray[0][2] == 2 || MazeArray[0][4] == 2 || MazeArray[1][3] == 2)){
            MazeArray[0][3] = 2;
        }
        //[0][4]
        else if(MazeArray[RV1][RV2] == MazeArray[0][4] && (MazeArray[0][3] == 2 || MazeArray[0][5] == 2 || MazeArray[1][4] == 2)){
            MazeArray[0][4] = 2;
        }
        //[0][5]
        else if(MazeArray[RV1][RV2] == MazeArray[0][5] && (MazeArray[0][4] == 2 || MazeArray[0][6] == 2 || MazeArray[1][5] == 2)){
            MazeArray[0][5] = 2;
        }
        ...
        else{
            MazeArray[RV1][RV2] = 0;
        }

        //Maze Ending.
        if((MazeArray[0][0] == 2 || MazeArray[0][9] == 2) && 
           (MazeArray[9][0] == 2 || MazeArray[9][1] == 2 || MazeArray[9][2] == 2 || MazeArray[9][3] == 2 || MazeArray[9][4] == 2 || MazeArray[9][5] == 2 || MazeArray[9][6] == 2 || MazeArray[9][7] == 2 || MazeArray[9][8] == 2 || MazeArray[9][9] == 2)){
            MazeComplete = true;
        }else if((MazeArray[9][0] == 2 || MazeArray[9][9] == 2) && 
           (MazeArray[0][0] == 2 || MazeArray[0][1] == 2 || MazeArray[0][2] == 2 || MazeArray[0][3] == 2 || MazeArray[0][4] == 2 || MazeArray[0][5] == 2 || MazeArray[0][6] == 2 || MazeArray[0][7] == 2 || MazeArray[0][8] == 2 || MazeArray[0][9] == 2)){
            MazeComplete = true;
        }else{
            continue;
        }
    }

我还将解释代码的功能。它是一个10x10阵列路径生成器。我将10个数组放入一个大数组中,我可以有10行10个。它从数组的一个角开始并流向另一侧。数组。它只碰到了对面一次。数组生成器将作为我的html元素的“Back-Code”。如果输出值(即[0] [5])为2,​​那么它是一个高值并且是路径的一部分;同样,如果它是0,它不是路径的一部分。

现在我将向您展示我的代码生成的前三个输出。请记住,它们完全是随机的。我没有以任何方式替换它们。这是输出。

输出1

[0, 0, 0, 0, 0, 2, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 2, 0, 0, 0, 0]
[2, 0, 0, 0, 0, 2, 2, 0, 0, 0]
[2, 0, 2, 2, 2, 2, 0, 0, 0, 0]
[2, 0, 0, 2, 2, 2, 2, 2, 2, 0]
[2, 2, 2, 2, 2, 2, 2, 2, 0, 0]
[2, 0, 2, 2, 2, 2, 0, 2, 2, 0]
[2, 2, 2, 2, 2, 2, 2, 0, 0, 0]
[2, 2, 2, 2, 2, 2, 2, 0, 0, 0]
[2, 2, 2, 2, 2, 2, 2, 2, 0, 0]

从[9] [0]开始,到[0] [5]结束。

输出2

[0, 0, 0, 0, 0, 0, 0, 2, 0, 0]
[0, 0, 0, 0, 0, 2, 0, 2, 2, 0]
[0, 0, 0, 0, 0, 2, 2, 2, 2, 2]
[0, 0, 0, 0, 0, 0, 2, 2, 2, 2]
[0, 0, 0, 0, 0, 0, 2, 2, 2, 0]
[0, 0, 0, 0, 2, 0, 2, 2, 2, 2]
[0, 2, 0, 2, 2, 2, 2, 2, 2, 2]
[0, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[0, 0, 2, 2, 2, 2, 2, 2, 2, 2]
[0, 2, 2, 2, 2, 2, 2, 2, 2, 2]

从[9] [9]开始,到[0] [7]结束。

输出3

[2, 2, 2, 2, 2, 2, 2, 2, 2, 0]
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[2, 2, 2, 2, 2, 2, 2, 0, 2, 2]
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[2, 2, 2, 2, 2, 0, 2, 0, 2, 2]
[0, 2, 2, 0, 2, 2, 0, 0, 0, 2]
[0, 0, 2, 2, 2, 0, 0, 0, 0, 2]
[0, 0, 0, 0, 2, 2, 2, 0, 2, 2]
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0]

从[0] [0]开始,到[9] [4]结束。

输出问题是它没有任何算法来制作更好的路径。我只知道如何编写从一个角落到底部的随机路径。我想知道如何清理路径,使它看起来更像是一个“迷宫”。

例如,我想要一条看起来更干净且可以更容易区分为路径的路径。我将编辑第三个输出以使其更清晰,因此我可以向您展示我想要的输出类型。以下是调整后的第三个输出:

[2, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 2, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 2, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 2, 2, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0]

(从输出3调整)。

我认为这是可能的唯一方法是,如果我遍历数组中的每个值并对可以和不能命中的值施加限制,但我不能以合理的方式做到这一点(一种方式)这不需要我写出数千行代码)。我尝试使用我称之为“对角线取消”的策略更早地做到了,但它没有用,因为根据你从哪个角落开始,一个值可能是不合逻辑的从角落来看但从另一个角落来看是合乎逻辑的。

一个例子是[0] [1]。如果从[0] [0]开始,迷宫可以进入[0] [1];因此,[9] [0]将是一个不合逻辑的价值,因为它会使迷宫变得不洁净。因此,你可以通过在其位置放置1来声明它为“死值”。

[2, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

这似乎是制作一条干净路径的好方法,但如果从[9] [0]开始呢?然后,你不能使用[1] [0],因为它被第一个值声明为死。因此,相反,您必须为每个起始角落的每个值制定规则,这需要花费很长时间和精力。我没有耐心去做这件事,也没有足够的时间或知识。

如何操作输出1,2或3以获得更“清洁”的路径(注意:输出不必像我所做的调整那样干净,但它必须有点干净)?

而且,如果你想让我的完整代码进一步帮助你理解我如何编程路径,我会发布链接到它。我意识到人们不会因为显而易见的原因而点击链接,但我向你保证这是我的代码,而且只是我的代码。

0 个答案:

没有答案