[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪

Ceci est le premier post! !!

J'ai un labyrinthe comme celui-ci.

実行結果.png

La raison pour laquelle j'ai décidé de le faire

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.

Quelle est la méthode de creusement?

** ■ 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.

Contenu

Classe principale

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

Classe de labyrinthe

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

}

Ce que j'ai remarqué quand il a été terminé

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.

Que pouvez-vous faire si vous en avez envie

--Le début et l'objectif sont définis automatiquement --Trouvez l'itinéraire le plus court

Mon environnement

OS :Windows10 IDE:Eclipse 2020-03

Recommended Posts

[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'expliquer la méthode
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
J'ai créé un client RESAS-API en Java
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
J'ai essayé de frapper une méthode Java d'ABCL
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
J'ai essayé de créer une compétence Clova en Java
[JDBC] J'ai essayé de faire de l'accès à la base de données SQLite3 depuis Java une méthode pour chaque instruction SQL.
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
Je veux faire une liste avec kotlin et java!
Je veux appeler une méthode et compter le nombre
Je voulais juste créer une propriété réactive en Java
Je veux créer une fonction avec kotlin et java!
J'ai essayé de faire coexister Java Optional et la clause de garde
Créer une méthode pour renvoyer le taux de taxe en Java
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
Créez un labyrinthe de fouilles avec Ruby2D
Comment créer un conteneur Java
J'ai essayé d'interagir avec Java
J'ai essayé le framework Java "Quarkus"
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
Comment créer un tableau Java
J'ai essayé de créer un outil de comparaison des prix des produits Amazon dans le monde entier avec Java, l'API Amazon Product Advertising, l'API Currency (29/01/2017)
J'ai essayé Tribuo édité par Oracle. Tribuo --Une bibliothèque de prédiction Java (v4.0)
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
Création d'une méthode pour demander Premium Friday (version Java 8)
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
[VBA] J'ai créé un outil pour convertir le type primitif de la classe Entity générée par Hibernate Tools en type de référence correspondant.
Comment créer un résumé de calendrier Java
J'ai essayé de me permettre de définir le délai pour le client Android UDP
J'ai essayé de résumer les méthodes utilisées
J'ai essayé le nouveau yuan à Java
[Java] Comment utiliser la méthode toString ()