Ceci est le premier post! !!
J'avais l'habitude de faire un jeu de labyrinthe en utilisant la méthode stick-down avec HTML5 et JS et je l'ai exposé lors d'un festival culturel. Cependant, le labyrinthe créé par la méthode stick-down a une solution très simple, j'ai donc voulu l'essayer avec une méthode de creusage avec une solution compliquée.
** ■ En gros, la méthode de creusage est un tel algorithme ** (Peut-être que c'est faux: sweat_drops :)
Créez une carte de taille étrange avec une taille de 5 ou plus à la fois verticalement et horizontalement. Remplissez tout avec un mur Sélectionnez au hasard un endroit où les coordonnées X et Y sont impaires, à l'exception du bord de la carte, et faites un trou. ★ Vérifiez s'il y a encore des murs avec des coordonnées X et Y impaires (cette fois le coin supérieur gauche est 0,0) autres que les bords. ** S'il y a: ** Sélectionnez au hasard un endroit où les coordonnées X et Y sont toutes les deux impaires et ont déjà des trous, autres que le bord de la carte. | Vérifier s'il y a encore un mur 2 carrés de tous côtés | ** S'il y a: ** Creuser 2 carrés au hasard à partir de la direction de creusement | Sinon **: Revenir à ** ★ ** Sinon: ** Labyrinthe terminé
…… Mais il est difficile de le mettre en œuvre avec obéissance, je vais donc concevoir diverses choses.
MainClass.java
package automaze;
public class MainClass {
public static void main(String[] args) {
Maze maze=new Maze(21,21);//Cette fois, je vais faire un labyrinthe 21x21 à titre d'essai.
maze.show();
}
}
Maze.java
package automaze;
public class Maze {
private int pointX; //Une marque pour placer et effacer des blocs.
private int pointY;
private int width; //Largeur et hauteur.
private int height;
private byte[][] map; //Tableau pour stocker la carte
public Maze(int w, int h) { //Constructeur
width = w;
height = h;
if (w % 2 != 0 && h % 2 != 0 && 5 <= w && 5 <= h) {
map = new byte[width][height];
make();
} else {
System.out.println("Créez un nombre impair de 5 ou plus verticalement et horizontalement.");
}
}
int randomPos(int muki) { //x,Renvoie des coordonnées aléatoires impaires pour les deux coordonnées y
int result = 1 + 2 * (int) Math.floor((Math.random() * (muki - 1)) / 2);
return result;
}
private void make() { //Créer une carte
pointX = randomPos(width);
pointY = randomPos(height);
for (int y = 0; y < height; y++) { //Remplissez tout avec un mur.
for (int x = 0; x < width; x++) {
map[x][y] = 1;
}
}
map[pointX][pointY] = 0;
dig();
}
private void dig() {
if (isAbleContinueDig() && map[pointX][pointY] == 0) {
map[pointX][pointY] = 0;
int direction = (int) Math.floor(Math.random() * 4);
switch (direction) {
case 0:
if (pointY != 1) {
if (map[pointX][pointY - 2] == 1) {
map[pointX][pointY - 1] = 0;
pointY -= 2;
break;//u
}
}
case 1:
if (pointY != height - 2) {
if (map[pointX][pointY + 2] == 1) {
map[pointX][pointY + 1] = 0;
pointY += 2;
break;//d
}
}
case 2:
if (pointX != 1) {
if (map[pointX - 2][pointY] == 1) {
map[pointX - 1][pointY] = 0;
pointX -= 2;
break;//l
}
}
case 3:
if (pointX != width - 2) {
if (map[pointX + 2][pointY] == 1) {
map[pointX + 1][pointY] = 0;
pointX += 2;
break;//r
}
}
}
map[pointX][pointY] = 0;
dig();
} else if (isAbleDig()) {
pointX = randomPos(width);
pointY = randomPos(height);
dig();
}
}
private boolean isAbleDig() { //Voir s'il y a encore un endroit pour creuser
boolean result;
int cnt = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (x % 2 != 0 && y % 2 != 0) {
if (map[x][y] != 0) {
cnt++;
}
}
}
}
if (cnt == 0) {
result = false;
} else {
result = true;
}
return result;
}
private boolean isAbleContinueDig() {//Déterminez s'il reste des zones à creuser dans toutes les directions
if (pointY != 1) {
if (map[pointX][pointY - 2] == 1) {
return true;
}
}
if (pointY != height - 2) {
if (map[pointX][pointY + 2] == 1) {
return true;
}
}
if (pointX != 1) {
if (map[pointX - 2][pointY] == 1) {
return true;
}
}
if (pointX != width - 2) {
if (map[pointX + 2][pointY] == 1) {
return true;
}
}
return false;
}
public void show() {
for (int y = 0; y < map[0].length; y++) {
System.out.println("");
for (int x = 0; x <map.length; x++) {
if (map[x][y] == 1) {
System.out.print("##");
} else {
System.out.print(" ");
}
}
}
}
public byte[][] getMaze() {
return map;
}
}
Je me demande si je peux le raccourcir un peu. Aussi, peut-être parce que j'appelle la fonction de creusage de manière récursive, j'obtiens une erreur de stackoverflow simplement en essayant de créer un labyrinthe légèrement plus grand. Je modifierai cet article dès qu'il sera corrigé. Je pense vaguement que cela semble tout à fait le cas si j'utilise l'instruction while.
--Le début et l'objectif sont définis automatiquement --Trouvez l'itinéraire le plus court
OS :Windows10 IDE:Eclipse 2020-03
Recommended Posts