Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retour à la ligne dans String ne fonctionne pas

Sujet résolu
    19 novembre 2017 à 10:31:14

    Bonsoir,
    J'ai un petit problème : je souhaiterais réaliser un labyrinthe carré (même longueur et même largeur) jouable dans un terminale (donc sans GUI) à l'aide de commande N: Avancer, S: Reculer, E:droite et O: gauche.
    Pour afficher le jeu j'utilise une méthode toString() dans ma classe Labyrinthe qui affiche les murs avec des X, le joueur avec un "." et la sortie avec un S. Exemple :
    XXXXXXXXXX
    XX   XX  XXX
    XX .      X XX
    XX           XX
    XX  XX X  XX
    XX X X XXXX
    XX           XX
    XX     X    XX
    XXXX X  XXX

    Voici ma méthode toString() :
    public String toString() {
        String str = "";
        String separator = System.getProperty("line.separator");
        for(int i = 0; i < this.labyrinthe.getTaille(); i++) {
          for(int j = 0; j < this.labyrinthe.getTaille(); j++) {
            if(this.labyrinthe.getMur(i,j) == false)
              str += " ";
            else if(this.labyrinthe.getMur(i,j) == true)
              str += "X";
            else if(i == this.x && j == this.y)
              str += ".";
            else if(i == this.xSortie && j == this.ySortie)
              str += "S";
            else if(i == this.labyrinthe.getTaille() - 1)
              str += separator;
          }
        }
        return str;
      }

    J'ai beau utilisé à la place un \n ou même \r\n rien n'y fait j'ai un affichage en ligne du type :
    XXXXXXXXX      XX      XX      XX      XX      XX      XXXXXXXXX

    Si quelqu'un a une idée je suis preneur ..

    -
    Edité par Ble14 19 novembre 2017 à 10:32:31

    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2017 à 12:16:08

      Bonjour.

      Es-tu sur de rentrer dans ton dernier "else if" ?
      Vérifie avec un point d'arrêt.

      Au passage tu as la méthode statique System.lineSeparator()
      https://docs.oracle.com/javase/9/docs/api/java/lang/System.html#lineSeparator--

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        19 novembre 2017 à 13:29:42

        Effectivement, après ajout du println on peut en déduire que mon dernier else if n'est pas pris en compte.
        Il suffisait d'enlever les else et de n'ajouter que des if ce qui nous donne après correction :
          public String toString() {
            String str = "";
            for(int i = 0; i < this.labyrinthe.getTaille(); i++) {
              for(int j = 0; j < this.labyrinthe.getTaille(); j++) {
                if(this.labyrinthe.getMur(i,j) == false)
                  str += " ";
                if(this.labyrinthe.getMur(i,j) == true)
                  str += "X";
                if(i == this.x && j == this.y)
                  str += ".";
                if(i == this.xSortie && j == this.ySortie)
                  str += "S";
                if(i == this.labyrinthe.getTaille() - 1)
                  str += System.lineSeparator();
              }
            }
            return str;
          }
        Grâce à toi j'ai pu remarquer que la position du joueur et la sortie n'étaient pas représentées non plus et à partir de là j'en ai déduit l'erreur.
        Cependant maintenant j'obtiens quelques chose de ce genre là dans le cas d'un labyrinthe de taille 10 :
        XXXXXXXXX      XX    S  XX .     XX      XX      XX      XX
        X
        X
        X
        X
        X
        X
        X
        
        
        Ce qui reste un résultat un peu bizarre :/

        -
        Edité par Ble14 19 novembre 2017 à 13:30:43

        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2017 à 14:44:31

          Bonjour,

          Tu devrais déplacer la ligne 14 après la boucle. Le if de la ligne 13 deviendra inutile.

          • Partager sur Facebook
          • Partager sur Twitter
            19 novembre 2017 à 16:22:15

            Merci brubru777 ! Problème résolu j'avais pas fais attention à l'emplacement de mon retour de ligne c'est pour ça que je me retrouvais avec une colonne de X.
            L'affichage fonctionne correctement maintenant cependant à titre informatif : j'ai repéré un autre défaut puisque je n'avais pas géré "l'occupation d'une case par le joueur ou par la sortie" ce qui me causait un petit décallage :
            XXXXXXXX
            X      X
            X    S  X
            X  .    X
            X      X
            X      X
            X      X
            XXXXXXXX
            
            Heureusement, on règle ça facilement avec 2 petits booleens :
              public String toString() {
                String str = "";
                boolean sPresent = false, jPresent = false;
                for(int i = 0; i < this.labyrinthe.getTaille(); i++) {
                  for(int j = 0; j < this.labyrinthe.getTaille(); j++) {
                    if(i == this.x && j == this.y) {
                      jPresent = true;
                      str += ".";
                    }
                    if(i == this.xSortie && j == this.ySortie) {
                      str += "S";
                      sPresent = true;
                    }
                    if(this.labyrinthe.getMur(i,j) == false && !sPresent && !jPresent)
                      str += " ";
                    if(this.labyrinthe.getMur(i,j) == true && !sPresent && !jPresent)
                      str += "X";
                    jPresent = false;
                    sPresent = false;
                  }
                  str += System.lineSeparator();
                }
                return str;
              }
            Et voilà le travail :
            XXXXXXXX
            X      X
            X      X
            X  .   X
            X    S X
            X      X
            X      X
            XXXXXXXX
            

            Donc merci à tous !


            • Partager sur Facebook
            • Partager sur Twitter

            Retour à la ligne dans String ne fonctionne pas

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown