
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 ?

Le 26 novembre 2017 à 19:31:19 JamereBurvelle a écrit :
J'ai un soucis![]()
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îtApparemment ç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
![]()
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
)
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 += 
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 à 0Bah 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é
Je participe. _.gif)
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 
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 à 0Bah 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é
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
Essaie de te motiver, c'est sympa 
J'ai modifié la fonction mais j'ai toujours mon erreur
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;
}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
Ben dis moi à quel niveau t'en es et je vais voir si je peux te passer un objectif à atteindre
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 
Oh putain oui je suis trop con
Merci je modifie mon code ce soir 
Putain j'ai ENFIN réussi ! Merci 
J'suis même allé pomper une méthode pour remplacer un caractère sur le net 
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 
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 
JvArchive compagnon