Java中的迷宫模式构建



这是我正在处理的一些代码,用于构建具有此类模式的迷宫,其中我实现了2D数组。

我的想法首先是尝试在 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();
}
}
}

我的代码结果如下所示:

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

我想要如下结果:

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

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

显然,你构建迷宫的"算法"是不够的。有两种方法可以改善这一点:

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

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

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

@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. 我会尝试验证维度的输入。事实上,由于您希望第一行和最后一行是墙壁 (@(,并且每个墙壁行都由空格/走廊行分隔,因此您将始终拥有奇数行(如果 input%2==0 表示输入是偶数,您可以将维度减少/增加 1(。

那么目前结构初始化中有两个"逻辑块":一个用于奇数行,一个用于偶数行。

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

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

最新更新