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 建议之外,考虑到您当前的代码:
- 我会尝试验证维度的输入。事实上,由于您希望第一行和最后一行是墙 (@) 并且每行墙由 space/corridor 行分隔,因此您将始终有奇数行(您可以 decrease/increase 维数为 1 if input%2==0 表示输入为偶数时)。
那么您当前在结构初始化中有两个 "logic blocks":一个用于奇数行,一个用于偶数行。
对于偶数行(迷宫中的走廊),只需填满第一列和最后一列。
现在对于你的奇数行,你想要交替 "door",是吗?您需要一个 "switch/interruptor" 来指示状态:列索引 2(行的开头)或索引 N-1(行的结尾)处的门。有条件检查行索引或有一个布尔值就可以了。使用布尔值,在每个奇数行进程中更改其状态。然后,当您的布尔值为真时,将门放在行的开头,否则放在末尾。如果你想关闭最后一行,请不要忘记不要这样做。
这是我使用的一些代码,用于构建具有这样的模式的迷宫,其中我实现了 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 建议之外,考虑到您当前的代码:
- 我会尝试验证维度的输入。事实上,由于您希望第一行和最后一行是墙 (@) 并且每行墙由 space/corridor 行分隔,因此您将始终有奇数行(您可以 decrease/increase 维数为 1 if input%2==0 表示输入为偶数时)。
那么您当前在结构初始化中有两个 "logic blocks":一个用于奇数行,一个用于偶数行。
对于偶数行(迷宫中的走廊),只需填满第一列和最后一列。
现在对于你的奇数行,你想要交替 "door",是吗?您需要一个 "switch/interruptor" 来指示状态:列索引 2(行的开头)或索引 N-1(行的结尾)处的门。有条件检查行索引或有一个布尔值就可以了。使用布尔值,在每个奇数行进程中更改其状态。然后,当您的布尔值为真时,将门放在行的开头,否则放在末尾。如果你想关闭最后一行,请不要忘记不要这样做。