Java 中的迷宫图案构建

Maze Pattern Building in Java

这是我使用的一些代码,用于构建具有这样的模式的迷宫,其中我实现了 2D 数组。

我的想法,首先是尝试在二维数组中构建一个完整的“@”,并将每个奇数行赋予它“”。还没完

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Maze Dimension: ");
        int dim = sc.nextInt();

        //dimension
        char[][] maze = new char[dim][dim];
        int baris = maze.length;
        System.out.println("rows : " + baris);
        int kolom = maze[0].length;
        System.out.println("column : " + kolom);

        //initialize rows and column;
        int initBaris;
        int initKolom;

        for (initBaris = 0; initBaris < baris; initBaris++) {
            if (initBaris % 2 != 1) {
                for (initKolom = 0; initKolom < kolom; initKolom++) {
                    System.out.print(maze[initBaris][initKolom] = '@');
                }
            } else {
                for (initKolom = 0; initKolom < kolom ; initKolom++) {
                    System.out.print(maze[initBaris][initKolom] = ' ');
                }
            } System.out.println();
        }
    }
}

我的代码结果如下所示:

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@

我想要如下结果:

@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @

为了简单起见,我在这里缺乏逻辑。含义 - 我不知道如何获得预期结果,因此正在寻找有关如何调整给定代码的指导。

显然你的 "algorithm" 建造迷宫是不够的。有两种改进方法:

  • 您查看所需的输出并开发一种算法来准确地创建预期的输出。这并不容易——但您可以从将问题分解为更小的问题开始。例如,第 2、4、6 行……都是相同的。
  • 与其使用在一个循环中计算结束状态的算法,不如首先初始化外框和完整的线条要容易得多。然后你 更新 数组以在应该空闲的地方切洞。

需要理解的一件重要事情:您应该将数组的初始化与打印分开。你看 - 当您不必担心同时打印它时,使用数组来正确获取其内容要容易得多。所以:使用一个或多个步骤来初始化数组 - 然后有一个单独的步骤来打印它。

最后:考虑不要将迷宫设为字符数组。而是使用布尔值或您的枚举。事实上,您稍后想要打印空的和 "taken" 个具有不同字符的插槽,这不应影响迷宫的内部表示方式。

@GhostCat 没错。看你想要什么结果:

@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@ @
@             @  
@ @@@@@@@@@@@@@
@             @  
@@@@@@@@@@@@@@@

不要试图一次写出整个算法。逐步创建它。

1) 你的迷宫对每一行都有效吗?

2) 是否有完全不同于其他行的行?

3) 有没有可以在你的任何一行中找到的模式?

4) 描述路径线的模式。

6) 你能认出多少种墙线?

7) 描述每种类型的墙线的模式。

等等

...

https://ideone.com/DBOJRy 这行得通:

//import java.util.Scanner;

public class Main 
{
    public static void main(String[] args) 
    {
        //Scanner sc = new Scanner(System.in);
        int dim = 16; //sc.nextInt();
        System.out.println("Maze Dimension: " + dim);


        //dimension
        char[][] maze = new char[dim][dim];
        int baris = maze.length;
        System.out.println("rows : " + baris);
        int kolom = maze[0].length;
        System.out.println("column : " + kolom);

        //initialize rows and column;
        int initBaris;
        int initKolom;

       baris -= (baris%2 !=0) ? 1 : 2;

       for (initBaris = 0; initBaris < baris; initBaris++) 
        {
            System.out.print(maze[initBaris][0] = '@');

            if (initBaris % 2 != 1) 
            {
                System.out.print(maze[initBaris][1] = (initBaris%4!=2)?' ':'@');

                for (initKolom = 2; initKolom < kolom-2; initKolom++) 
                {
                    System.out.print(maze[initBaris][initKolom] = '@');
                }
                System.out.print(maze[initBaris][kolom-2] = (initBaris%4!=2)?'@':' ');
            }
            else 
            {
                for (initKolom = 1; initKolom < kolom-1 ; initKolom++) 
                {
                    System.out.print(maze[initBaris][initKolom] = ' ');
                }
            } 

            System.out.print(maze[initBaris][kolom-1] = '@');

            System.out.println();
        }

        for (initKolom = 0; initKolom < kolom ; initKolom++) 
        {
            System.out.print(maze[baris][initKolom] = '@');
        }
    }
}            

除了您绝对应该应用的 GhostCat 建议之外,考虑到您当前的代码:

  1. 我会尝试验证维度的输入。事实上,由于您希望第一行和最后一行是墙 (@) 并且每行墙由 space/corridor 行分隔,因此您将始终有奇数行(您可以 decrease/increase 维数为 1 if input%2==0 表示输入为偶数时)。

那么您当前在结构初始化中有两个 "logic blocks":一个用于奇数行,一个用于偶数行。

  1. 对于偶数行(迷宫中的走廊),只需填满第一列和最后一列。

  2. 现在对于你的奇数行,你想要交替 "door",是吗?您需要一个 "switch/interruptor" 来指示状态:列索引 2(行的开头)或索引 N-1(行的结尾)处的门。有条件检查行索引或有一个布尔值就可以了。使用布尔值,在每个奇数行进程中更改其状态。然后,当您的布尔值为真时,将门放在行的开头,否则放在末尾。如果你想关闭最后一行,请不要忘记不要这样做。