2017-06-28 1 views
0

J'ai créé un jeu de pendu.Comment vérifier si l'entrée de l'utilisateur a été tapée auparavant?

Je veux savoir comment je peux vérifier si l'utilisateur tape la même lettre. Tout fonctionne bien mais sans vérifier si le numéro est déjà tapé.

if (word.contains(input)) { 
     i = i - 1; 
     char[] charOfGameBoard = gameBoard.toCharArray(); 
     for (int x = 0; x < word.length(); x++) { 
      if (word.charAt(x) != input.charAt(0)) { 
       continue; 
      } 

      int j = x * 2; 
      charOfGameBoard[j] = input.charAt(0); 
     } 

     gameBoard = String.valueOf(charOfGameBoard); 

    } 

Je ne peux pas poster trop de sry.

mot = "maison"

charOfGameBoard = _ _ _ _ _

userinput = "h" // Correct

charOfGameBoard = h _ _ _ _

userinput = "h" // incorrect à ce stade

charOfGameBoard = h _ _ _ _

+0

pourquoi ne pas garder un tableau de lettres devinées, et voir si le deviner lettres contient l'entrée avant de vérifier pour voir si le mot contient l'entrée? – brw59

+0

ce serait ma solution mais je veux voir si quelqu'un a une meilleure solution. Car ce ne serait pas propre d'avoir un tableau avec toute la lettre de l'alphabet. Mais je pense à enregistrer la lettre d'entrées dans un tableau. – ManuellsenDeve

+0

Pourquoi pas? En outre, ce n'est pas comme si le bourreau était une application gourmande en mémoire ou consommatrice de ressources. Je vous suggère de stocker les valeurs dans un tableau et de vérifier si c'est dans le tableau avant de le tester par rapport au mot – brw59

Répondre

0

Vous pouvez simplement ajouter les caractères à une liste de tableau comme ils sont entrés et vérifier si vous avez vu la lettre avant:

ArrayList<Character> usedLetters = new ArrayList<>(); 
public boolean UserTypedLetterBefore(char letter) { 
    if(usedLetters.contains(letter)) 
     return true; 

    usedLetters.add(letter); 
    return false; 
} 

Puis, quand le jeu est terminé, vous appelez simplement usedLetters.clear() pour vider la liste et recommencez. Cette méthode peut également garder une trace du nombre d'essais en faisant usedLetters.size() parce que chaque conjecture est une lettre


Si vous voulez être efficace supplémentaire, vous pouvez utiliser un HashSet à la place (bien qu'il ne soit pas nécessaire dans votre cas) :

HashSet<Character> usedLetters = new HashSet<>(); 
public boolean UserTypedLetterBefore(char letter) { 
    if(usedLetters.contains(letter)) 
     return true; 

    usedLetters.add(letter); 
    return false; 
} 

Ce sera l'option idéale pour grands ensembles de données, mais dans votre cas, puisque vous avez seulement 26 lettres possibles, vous ne remarquerez une différence de vitesse.


Une troisième option consiste à utiliser une matrice primitive, comme par exemple:

boolean[] usedLetters = new boolean[26]; 
public boolean UserTypedLetterBefore(char letter) { 
    letter = Character.toLowerCase(letter); 

    if(usedLetters[letter - 'a']) 
     return true; 

    usedLetters[letter - 'a'] = true; 
    return false; 
} 

où chaque indice est un pavillon à cette lettre utilisée. En effectuant des maths sur le caractère letter - 'a', nous pouvons faire 'a' = 0 afin que nous puissions l'utiliser comme index dans notre tableau dont nous avons besoin. Le Character.toLowerCase() est ajouté en tant que sécurité.

+0

est-il un moyen sans liste ou cartes? Donc juste Array primitif? – ManuellsenDeve

+0

@ManuellsenDeve Mise à jour – Chris

+0

Ty tant. Je pense que je prends simplement la liste ou Hash son simplement et plus rapidement. – ManuellsenDeve

1

Vous pouvez stocker les suppositions dans un HashSet

HashSet<char> guessedLetters = new HashSet(); 
    ... 
    boolean success = guessedLetters.Add(input) 

Un HashSet ne peut contenir un de chaque valeur, la méthode Add retourne false si le jeu contient déjà l'élément ajouté.

https://www.javatpoint.com/java-hashset

+0

Petite question, y a-t-il une autre manière sans hachage, juste des tableaux primitifs? – ManuellsenDeve

+1

Vous auriez besoin de faire un tableau de taille 26, quand vous obtenez une boucle d'entrée à travers le tableau et vérifiez si c'est déjà là, sinon, ajoutez le nouveau lettter au tableau. Mais pourquoi voudriez-vous le faire de cette façon? –

+0

Ty vous tellement, vous les gars m'a aidé. – ManuellsenDeve

0

Vous pouvez juste faire une List de suppositions, et ajouter une autre condition dans votre déclaration if, comme ceci:

List<String> guesses = new ArrayList<>(); 

if (word.contains(input) && !guesses.contains(input)) { 
    guesses.add(input); 
    //... 
    //all of your other code 
    //... 
}