Topic de JamereBurvelle :

[PROJET] Apprenons à programmer en JAVA !

Ouais, même en mettant un caractère dans currentChar il me sort la même erreur :(

Le 26 novembre 2017 à 19:59:56 JamereBurvelle a écrit :
Ouais, même en mettant un caractère dans currentChar il me sort la même erreur :(

Bah au second tour de boucle c'est normal, en fait j'pige pas trop ce que doit faire ton programme, l'utilisateur doit deviner un mot c'est ça ?

C'est ça, word est le mot à trouver et guessedLetters la chaine de lettres entrées par l'utilisateur :(
Pour ton problème tu devrais déclarer CurrentChar comme un char justement et non un String, initialiser sa valeur à n'importe quelle caractère et ça devrait mieux aller !

Le 26 novembre 2017 à 19:31:19 JamereBurvelle a écrit :
J'ai un soucis https://image.noelshack.com/fichiers/2016/36/1473263957-risitas33.png

J'essaie de faire le dernier exo de la semaine 4 de mon cours (un pendu), mais j'ai une ereur que je pige pas :(

le code : https://pastebin.com/FHy5PmGG

C'est dans la fonction hiddenWord, je dois créer le mot tel qu'il apparaîtra à l'utilisateur ("_" si la lettre est pas trouvée, sinon on l'affiche)

Mais j'ai l'erreur "Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:658)
at HangmanLogic.hiddenWord(HangmanLogic.java:47)" qui apparaît :-(

Apparemment ça voudrait dire que j'essaie d'accéder à l'index 0 et qu'il n'existe pas, sauf que j'initialise hiddenWord en copiant le mot en question dedans dès le début https://image.noelshack.com/fichiers/2017/21/1495823687-risitas197.png

J'suis perdu du coup, on pourrait m'aider ? :-(

(le code c'est vraiment le bordel, à force de tout modifier y a plus rien de clair :rire: )

Si tu regardes ton erreur, il te donne la ligne:
HangmanLogic.hiddenWord(HangmanLogic.java:47

à cette ligne, on a :

currentChar = currentChar.replace(currentChar.charAt(i), this.guessedLetters.charAt(i));

Or, à ce moment là ton currentChar est vide, donc tu peux effectivement pas remplacer un caractère à l'index 0 vu qu'il n'y en a pas, ta chaine est de taille 0.

Si ton objectif est d'ajouter à chaque tour de boucle une lettre à ta variable currentChar, tu peux te contenter de faire un simple += :ok:

Le 26 novembre 2017 à 19:59:02 JamereBurvelle a écrit :

Le 26 novembre 2017 à 19:57:59 RepasDuCRIF a écrit :
Non en fait c'est tout con, la 1ère fois que tu lances ton programme ton "currentChar" est vide du coup c'est impossible de connaitre le caractère à 0

Bah il me dit bien que l'erreur vient de hiddenWord :( Je vais essayer de modifier quand même

Accessoirement, ton erreur ne vient pas de la variable hiddenWord, mais de la fonction hiddenWord(), tu devrais éviter de donner le même nom à une variable et à une fonction, ça crée une ambiguïté [[sticker:p/1jnf]]

Je participe. :)

Je ne sais pas si j'aurais la motivation pour (je suis un putain de procrastinateur) mais je vais commencer par regarder les vidéos :hap:

Le 27 novembre 2017 à 01:35:52 SixBlade a écrit :

Le 26 novembre 2017 à 19:59:02 JamereBurvelle a écrit :

Le 26 novembre 2017 à 19:57:59 RepasDuCRIF a écrit :
Non en fait c'est tout con, la 1ère fois que tu lances ton programme ton "currentChar" est vide du coup c'est impossible de connaitre le caractère à 0

Bah il me dit bien que l'erreur vient de hiddenWord :( Je vais essayer de modifier quand même

Accessoirement, ton erreur ne vient pas de la variable hiddenWord, mais de la fonction hiddenWord(), tu devrais éviter de donner le même nom à une variable et à une fonction, ça crée une ambiguïté [[sticker:p/1jnf]]

Ah putain, ok merci j'éviterai de faire ça à l'avenir :(

Par contre j'ai initialisé currentChar = 'a';

Et j'ai toujours l'erreur :-(

Le 27 novembre 2017 à 01:43:27 ChakraChancla a écrit :
Je participe. :)

Je ne sais pas si j'aurais la motivation pour (je suis un putain de procrastinateur) mais je vais commencer par regarder les vidéos :hap:

Essaie de te motiver, c'est sympa :oui:

J'ai modifié la fonction mais j'ai toujours mon erreur [[sticker:p/1lmc]]

public String hiddenWord() {
        String printedWord = this.word;
        String currentChar = "";
        
        for(int k = 0; k < this.word.length() ; k++ ){
            printedWord = printedWord.replace(printedWord.charAt(k), '_');
            
            
        }
        for (int i = 0; i < this.word.length() ; i++){
            currentChar += this.guessedLetters.charAt(i);
            
            if (this.word.contains(currentChar)){
               for (int j = 0; j < this.word.length() ; j++){ 
                   if (this.word.charAt(j) == this.guessedLetters.charAt(i)){
                       printedWord = printedWord.replace(printedWord.charAt(j), this.guessedLetters.charAt(i));
                   }
               }
            }
            currentChar = currentChar.substring(1);
            
        }
        
        
        return printedWord;
    }
Ton problème viens de ta variable this.guessedLetters.
Elle est initialisé à "" mais je ne la vois jamais modifiée, tu aurais la fonction de test que tu utilises?

Le 27 novembre 2017 à 01:43:27 ChakraChancla a écrit :
Je participe. :)

Je ne sais pas si j'aurais la motivation pour (je suis un putain de procrastinateur) mais je vais commencer par regarder les vidéos :hap:

Ben dis moi à quel niveau t'en es et je vais voir si je peux te passer un objectif à atteindre [[sticker:p/1jnf]]

Le 27 novembre 2017 à 10:31:53 SixBlade a écrit :
Ton problème viens de ta variable this.guessedLetters.
Elle est initialisé à "" mais je ne la vois jamais modifiée, tu aurais la fonction de test que tu utilises?

Voilà la fonction guessedLetters :

public void guessLetter(String letter) {
        if (!this.word.contains(letter)) {
            this.numberOfFaults++;
        } else if (this.word.contains(letter)) {
            if (!this.guessedLetters.contains(letter)) {
                this.guessedLetters += letter;
            }
        }
    }

Et la fonction de test :

public class TestProgram {

    public static void main(String[] args) {

        HangmanLogic l = new HangmanLogic("kissa");
        System.out.println("Word at start: " + l.hiddenWord());

        System.out.println("Let us guess: A, D, S, F, D");
        l.guessLetter("A");
        l.guessLetter("D");
        l.guessLetter("S");
        l.guessLetter("F");
        l.guessLetter("D");
        System.out.println("Guessed letterd: " + l.guessedLetters());
        System.out.println("Number of faults: " + l.numberOfFaults());
        System.out.println("Word is: " + l.hiddenWord());

    }
}

Je comprends vraiment pas d'où vient le soucis, les deux sont initialisées :-(

Donc ton mot est "kissa"
Tu teste les lettre "adsfd"

Vu que la fonction guessLetter ne garde que les lettres appartenant au mot et qui n'ont pas déjà été testée, on a alors guessedLetters="AS"

on a donc this.guessedLetter.length()=2 et this.word.length()=4
donc à cette partie de code :

 for (int i = 0; i < this.word.length() ; i++){
    currentChar += this.guessedLetters.charAt(i);

ton i allant de 0 à 3, tu va essayer d'accéder à this.guessedLetters.charAt(2) et this.guessedLetters.charAt(3) alors que la taille de guessedLetters vaut 2.

Voilà où se trouvait ton indexOutOfRange :ok:

Oh putain oui je suis trop con [[sticker:p/1lmc]]

Merci je modifie mon code ce soir :rire:

Quelqu'un connaît un bon livre pour JAVA ? Tous les livres que je lis sont assez lourds. Les chapitres sont des pavés et une fois arrivé aux exos, t'as tout oublié. https://image.noelshack.com/fichiers/2017/02/1483996277-154457.jpg

Le 27 novembre 2017 à 17:31:18 HommeDeMode a écrit :
Quelqu'un connaît un bon livre pour JAVA ? Tous les livres que je lis sont assez lourds. Les chapitres sont des pavés et une fois arrivé aux exos, t'as tout oublié. https://image.noelshack.com/fichiers/2017/02/1483996277-154457.jpg

en parlant de livres

https://www.humblebundle.com/books/java-books

Putain j'ai ENFIN réussi ! Merci :rire:

J'suis même allé pomper une méthode pour remplacer un caractère sur le net :rire:

public String hiddenWord() {
        String printedWord = this.word;
        String currentChar = "";

        for (int k = 0; k < this.word.length(); k++) {
            printedWord = printedWord.replace(printedWord.charAt(k), '_');

        }
        for (int i = 0; i < this.guessedLetters.length(); i++) {
            currentChar += this.guessedLetters.charAt(i);

            if (this.word.contains(currentChar)) {
                for (int j = 0; j < this.word.length(); j++) {
                    if (this.word.charAt(j) == this.guessedLetters.charAt(i)) {
                        printedWord = replaceCharAt(printedWord, j, this.guessedLetters.charAt(i));
                    }
                }
            }
            currentChar = currentChar.substring(1);

        }

        return printedWord;
    }

    public static String replaceCharAt(String s, int pos, char c) {
        return s.substring(0, pos) + c + s.substring(pos + 1);
    }

Et leur solution, 10 fois plus simple :

public String hiddenWord() {
        String hiddenVersionOfWord = "";
 
        int letterIndex = 0;
        while (letterIndex < this.word.length()) {
            char character = this.word.charAt(letterIndex);
 
            if (this.guessedLetters.contains("" + character)) {
                hiddenVersionOfWord = hiddenVersionOfWord + character;
            } else {
                hiddenVersionOfWord = hiddenVersionOfWord + "_";
            }
 
            letterIndex++;
        }
 
        return hiddenVersionOfWord;
    }

J'ai honte :hap:

Je l'ai mis en fav je passerai dans quelques jours [[sticker:p/1kki]]
JamereBurvelle :d) En même temps je t'avoue que j'ai vaguement essayé l'exercice, j'ai pensé à plusieurs solution, mais aucune me convenait, plus ça va moins j'aime faire des boucles :ok:

Données du topic

Auteur
JamereBurvelle
Date de création
22 novembre 2017 à 23:04:59
Nb. messages archivés
412
Nb. messages JVC
410
Voir le topic sur JVC

Afficher uniquement les messages de l'auteur du topic

En ligne sur JvArchive

JvArchive compagnon

Découvrez JvArchive compagnon , l'userscript combattant la censure abusive sur le 18-25 !