Construction de modèles de labyrinthe en Java


Voici du code sur lequel je travaille, pour construire un labyrinthe avec un motif comme celui-ci où j'implémente un tableau 2D.

Mon idée est d'abord d'essayer de construire un '@' complet dans un tableau 2D, et toutes les lignes impaires que je lui donne ' '. Il ne se termine pas encore

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

Le résultat de mon code est montré ci-dessous:

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

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

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

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

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

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

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

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

Je veux le résultat comme ci-dessous:

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

Je manque de logique ici, pour être simple. Signification-Je ne sais pas comment arriver au résultat attendu, donc je cherche des conseils sur la façon de m'adapter le code donné.

Author: user3610391, 2017-08-05

3 answers

En plus des conseils GhostCat que vous devriez certainement appliquer, compte tenu de votre code actuel:

  1. J'essaierais de valider l'entrée pour la dimension. En effet, puisque vous voulez que la première et la dernière ligne soient des murs ( @ ) et que chaque ligne de mur soit séparée par des lignes d'espace/couloir, vous aurez toujours un nombre impair de lignes (vous pouvez diminuer/augmenter la dimension de 1 si input%2==0 ce qui signifie que input est pair).

Alors vous avez actuellement deux "blocs logiques" dans votre structure initialisation: une pour les lignes impaires et une pour les lignes paires.

  1. Pour les lignes paires (couloirs dans votre labyrinthe), remplissez simplement la première et la dernière colonne.

  2. Maintenant, pour vos rangées impaires, vous voulez alterner la "porte", n'est-ce pas? Vous avez besoin d'un" commutateur/interrupteur " qui indique l'état: porte à la colonne index 2 (début de la ligne) ou index N-1 (fin de la ligne). Avoir une condition vérifiant l'index de ligne ou avoir un booléen qui fera très bien l'affaire. Avec un booléen, changez son état à chaque processus de ligne impaire. Ensuite, lorsque votre booléen est vrai, placez votre porte au début de la rangée, sinon à la fin. N'oubliez pas de ne pas le faire pour la dernière ligne si vous voulez la fermer.

 0
Author: Maaaatt, 2017-08-05 15:14:07

Évidemment, votre "algorithme" pour construire le labyrinthe est insuffisant. Il y a deux façons d'améliorer cela:

  • vous regardez la sortie souhaitée et développez un algorithme qui crée exactement la sortie attendue. Ce n'est pas facile - mais vous pouvez commencer par disséquer le problème en plus petits. Par exemple lignes 2,4,6,... sont tous identiques.
  • au lieu d'avoir un algorithme qui calcule l'état final dans une boucle - il serait beaucoup plus facile d'initialiser d'abord le cadre externe et des lignes complètes. Et puis vous mettez à jour le tableau pour couper des trous dans des endroits qui devraient être libres.

Une chose importante à comprendre: vous devez séparer l'initialisation de votre tableau de impression il. Vous voyez - travailler un tableau pour obtenir son contenu est beaucoup plus facile lorsque vous n'avez pas à vous soucier de l'imprimer en même temps. Donc: utilisez une ou plusieurs étapes pour initialiser le tableau - puis une étape distincte pour l'imprimer.

Enfin: ne considérez pas faire du labyrinthe un tableau de personnages. Utilisez plutôt booléen ou une énumération de la vôtre. Le fait que vous souhaitiez plus tard imprimer des emplacements vides et "pris" avec des caractères différents ne devrait pas conduire à la représentation interne du labyrinthe.

 2
Author: GhostCat, 2017-08-05 15:16:48

@GhostCat est à droite. Regardez ce que vous voulez être le résultat:

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

N'essayez pas d'écrire tout l'algorithme à la fois. Créer, étape par étape.

1) Votre labyrinthe fonctionne-t-il avec chaque nombre de lignes?

2) existe-il des lignes qui diffèrent complètement des autres lignes?

3) Y a-t-il un motif qui peut être trouvé dans l'une de vos lignes?

4) Décrire le modèle pour les lignes de chemin.

6) Combien de sortes de mur-lignes pouvez-vous identifier?

7) Décrire un motif pour chacun des types de lignes de mur.

Etc.

...

À https://ideone.com/DBOJRy cela fonctionne:

//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] = '@');
        }
    }
}            
 2
Author: A Dude, 2017-08-05 15:24:47