2017-08-30 5 views
0

Je suis essentiel d'essayer de créer un jeu de devinettes, un peu comme un bourreau, mais vous devez deviner un titre de film. Le titre du film est codé avec chaque caractère représenté par le caractère de soulignement ('_'). Lorsque l'utilisateur entre une lettre correcte, le trait de soulignement à la position de la lettre correspondante change à cette lettre. L'utilisateur introduit ses suppositions sous la forme de caractères uniques en utilisant le scanner. Mon problème est que certains titres de films contiennent un espace (''). Mais je suis incapable d'utiliser le scanner pour retourner un espace ... Je suppose qu'un scanner utilise l'espace comme délimiteur par défaut, donc il ne retourne pas un espace en tant que caractère car il utilise l'espace pour casser l'entrée en jetons ? Par «retourner un espace», je veux dire considérer un espace comme une entrée, et non comme un délimiteur. Est-ce que n'importe qui peut me donner une solution quant à la façon dont je pourrais détecter un espace de l'entrée de l'utilisateur? Ce code doit lire le MovieTitle, puis si le titre du film contient un espace à l'index i et que l'entrée utilisateur est un espace, codedMovieTitle doit alors se mettre à jour avec un espace à la position i, au lieu d'un trait de soulignement. Cependant cela ne fonctionne pas. Quand j'entrer dans un espace en utilisant rien du scanner arrive ...imprimer un espace avec le scanner

for (int i = 0; i < movieTitle.length(); i++) {  
      if(Character.isSpaceChar(movieTitle.charAt(i)) && 
      Character.isSpace(userInput)){ 
        encodedMovieTitle = encodedMovieTitle.substring(0, i) 
        + userInput 
        + encodedMovieTitle.substring(i + 1); 
      } 
    } 

Voici le code pour mon scanner:

Scanner scanner = new Scanner(System.in); 
    char userInput; 
    while(!gameIsWon && (numberOfGuessesLeft != 0)) { 
     while (scanner.hasNextInt()) { 
      System.out.println("You must enter a single character, try again."); 
      scanner.next(); 
     } 
     userInput = scanner.nextLine().charAt(0); 

Je me bats aussi avec permettre mon entrée du scanner pour être non sensible à la casse. Certains films ont des majuscules. Si le titre est "Tempête de neige" et que l'utilisateur saisit le caractère 's', le résultat encodedMovieTitle sera "_ _ _ _ s _ _ _ _" et non "S _ _ _ s _ _ _ _"

Si quelqu'un a une solution qui serait géniale! La plupart des solutions trouvées impliquaient l'utilisation de chaînes mais j'utilisais des caractères comme userInput etc, donc je me demandais s'il y avait une solution impliquant des caractères.

code

pour la vérification est UserInput (char) est en movieTitle (string):

for (int i = 0; i < movieTitle.length(); i++) { 
      if (updatedCodedMovieTitle.charAt(i) != userInput && movieTitle.charAt(i) == userInput) { 
       updatedCodedMovieTitle = updatedCodedMovieTitle.substring(0, i) 
             + userInput 
             + updatedCodedMovieTitle.substring(i + 1); 
       wordHasBeenUpdated = true; 
      } 
      if(Character.isSpaceChar(movieTitle.charAt(i)) && Character.isSpaceChar(userInput)){ 
       updatedCodedMovieTitle = updatedCodedMovieTitle.substring(0, i) 
         + " " 
         + updatedCodedMovieTitle.substring(i + 1); 
      } 
     } 
+2

pouvez-vous s'il vous plaît coller le code du scanner aussi? –

+0

pouvez-vous nous montrer comment créez-vous le scanner? –

+0

J'ai mis à jour mon commentaire pour ajouter le code du scanner – CheckCho

Répondre

0

En effet, Scanner (documentation)

rompt son entrée en jetons en utilisant un modèle de séparation, qui Par défaut correspond à des espaces.

De plus, les espaces contiennent également de l'espace.

Mais vous pouvez facilement modifier délimiteurs de Scanner utilisant son useDelimitermethod, par exemple .:

Scanner s = new Scanner(System.in); 
s.useDelimiter("\n"); 

\n est le caractère de nouvelle ligne, qui dans ce cas signifie que Scanner va générer de nouveaux jetons lorsque l'utilisateur appuie sur <Enter>. Les espaces seront donc renvoyés comme prévu.

Ou si vous voulez Scanner revenir only 1 character à la fois, vous pouvez définir "" comme séparateur, puis utilisez s.next() pour obtenir un personnage de l'entrée:

Scanner s = new Scanner(System.in); 
s.useDelimiter(""); 
String input = s.next(); // this will be only one character 
+0

Cela a fonctionné !! Merci Juzraai! – CheckCho

+0

Heureux d'aider :) Si cette réponse a résolu votre problème, s'il vous plaît marquer comme accepté en cliquant sur la coche à côté de la réponse. [(plus d'informations sur l'acceptation)] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – juzraai

1

Vous pouvez prendre une entrée du scanner de la manière suivante:

Scanner scanner = new Scanner(System.in); 
String str; 
str = scanner.nextline(); 

Cela acceptera l'espace comme un caractère non pas comme un delimiter.

Hope this helps :)

+0

Oh ... ouais, désolé mon mauvais .. –

+0

Corrigé . Merci d'avoir dit l'erreur. –

0

Pour faire correspondre les chaînes indépendamment de cas, vous pouvez utiliser equalsIgnoreCase() comme:

String movieName = "Snowstrom"; 
if(str.equalsIgnoreCase(movieName.charAt(0))) { 
    // Set the value at appropriate location, 0 in this case 
} 

La déclaration de l'état if comparera les deux chaînes quel que soit leur cas. La condition ci-dessus va évaluer à vrai si l'utilisateur entre s ou S.

MISE À JOUR

Vous pouvez prendre l'entrée du caractère comme suit:

Scanner scanner = new Scanner(System.in); 
scanner.useDelimiter("\n"); 
char userInput; 
userInput = scanner.next().charAt(0); 

Voici votre code avec une modification:

for (int i = 0; i < movieTitle.length(); i++) { 
    if (updatedCodedMovieTitle.charAt(i) != userInput && (movieTitle.charAt(i) == userInput || movieTitle.charAt(i) == Character.toUpperCase(userInput))) { 
     updatedCodedMovieTitle = updatedCodedMovieTitle.substring(0, i) 
             + userInput 
             + updatedCodedMovieTitle.substring(i + 1); 
     wordHasBeenUpdated = true; 
    } 
    if(Character.isSpaceChar(movieTitle.charAt(i)) && Character.isSpaceChar(userInput)){ 
     updatedCodedMovieTitle = updatedCodedMovieTitle.substring(0, i) 
         + " " 
         + updatedCodedMovieTitle.substring(i + 1); 
    } 
} 

Le changement que je fait dans votre code est dans la première condition if pour comparer les caractères majuscules et minuscules. J'ai testé ce programme moi-même et cela a bien fonctionné pour moi et m'a donné la sortie désirée.

J'espère que cela fonctionne pour vous aussi :)

+1

Ceci est une méthode intégrée pour String, n'est ce pas? La façon dont j'ai écrit mon code signifie que je comparerais deux caractères signifiant que je ne peux pas utiliser la méthode equalsIgnoreCase ... – CheckCho

+0

J'ai mis à jour mon article pour ajouter le code qui vérifie si l'entrée de l'utilisateur est présente dans le titre du film – CheckCho

+0

mon message. Vous pouvez le vérifier. J'espère que cela aide :) –