Java中的迷宫图案建筑

时间:2017-08-05 14:33:31

标签: java multidimensional-array maze

这是我正在处理的一些代码,用这样的模式构建一个迷宫,我实现了2D数组。

我的想法,首先是试图建立一个完整的' @'在二维数组中,我给它的每一个奇数行' &#39 ;.它还没有完成

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();
        }
    }
}

我的代码结果如下所示:

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

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

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

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

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

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

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

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

我想要如下结果:

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

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

3 个答案:

答案 0 :(得分:2)

显然你的&#34;算法&#34;建造迷宫是不够的。有两种方法可以改善:

  • 您查看所需的输出并开发一种精确创建预期输出的算法。这并不容易 - 但您可以从将问题分解为较小的问题开始。例如,行2,4,6,...都是相同的。
  • 而不是在一个循环中使用计算结束状态的算法 - 首先初始化外框和完整行会容易得多。然后你更新数组,将空洞切割成应该是免费的。

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

最后:考虑不要将迷宫变成一个字符数组。而是使用布尔值或你的枚举。事实上,你后来想要打印空白和&#34;采取&#34;具有不同字符的插槽不应该驱动迷宫在内部表示的方式。

答案 1 :(得分:2)

@GhostCat是对的。看看你想成为什么样的结果:

//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] = '@');
        }
    }
}            

请勿尝试立即编写整个算法。逐步创建它。

1)你的迷宫是否适用于每一行?

2)是否有与其他线完全不同的线?

3)你的任何一行都能找到一种模式吗?

4)描述通路线的模式。

6)你可以识别出多少种墙线?

7)描述每种类型墙线的图案。

...

https://ideone.com/DBOJRy,这有效:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000000137304bab, pid=55750, tid=0x000000000000080b
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C  [liblwjgl_opengl.dylib+0xcbab]
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/leobattle/Desktop/Programming/Java/Minecraft Modding/GLGame/GLGame/hs_err_pid55750.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

答案 2 :(得分:0)

考虑到您当前的代码,除了GhostCat建议之外,您应该明确申请:

  1. 我会尝试验证维度的输入。确实,因为您希望第一行和最后一行是墙(@),并且每个墙行由空格/走廊行分隔,您将始终具有奇数行(如果输入%2,您可以减少/增加维度1 == 0表示输入均匀时。)
  2. 然后你的结构初始化中有两个“逻辑块”:一个用于奇数行,一个用于偶数行。

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

    2. 现在你的奇数行,你想要交替“门”,不是吗?您需要一个“开关/中断器”,它指示状态:列索引2(行的开头)或索引N-1(行的结尾)的门。有条件检查行索引或有一个布尔值,它会做得很好。使用布尔值,在每个奇数行进程中更改其状态。然后,当您的布尔值为true时,将门放在行的开头,否则放在最后。如果你想让它关闭,不要忘记不要在最后一行做。