2017-09-20 1 views
-1

Ich würde gerne wissen, was der beste Weg ist, um den Index eines bestimmten Buchstabens in einem Wort zu erhalten. Der Grund, warum ich das mache, ist, weil ich ein Hangman-Spiel mache und modifiziere. Ich bin bereits fertig mit dem Spiel und es funktioniert gut, aber ich möchte ein Score-basiertes System implementieren. Ich habe eine Methode namens keepScore() erstellt, die einen booleschen Wert verwendet, um zu sehen, ob die Antwort richtig oder falsch ist. Wenn es richtig ist, werde ich 10 Punkte für jeden gefundenen Buchstaben hinzufügen. Wenn es falsch ist, werde ich 10 Punkte abziehen. Meine Methode keepScore() ist falsch implementiert jede Hilfe?Was ist die beste Methode, um den Index eines String oder Char Array zu erhalten?

Hangman.java

import Game.Game; 
import Prompter.Prompter; 

/* This class is the main class that starts the game. 
* It instantiates the Game and Prompter objects. 
*/ 
public class Hangman { 

    public static void main(String[] args) { 
     //Check if an argument has been passed, we expect the answer to be passed 
     if(args.length == 0) { 
      System.out.println("Expected: Java Hangman <answer>"); 
      System.err.println("Answer is required!"); 
      System.exit(1); 
     } 

     System.out.println("Welcome to Hangman!"); 

     //Create an instance of our game 
     Game game = new Game(args[0]); 
     //Create an instance of our prompter 
     Prompter prompter = new Prompter(game); 

     //Starts the game 
     while (game.getRemainingTries() > 0 && !game.isWon()) { 
      prompter.displayProgress(); 
      prompter.promptForGuess(); 
     } 
     //Displays the outcome of the game 
     prompter.displayOutcome(); 
    } 
} 

Game.java

package Game; 

/* This class is responsible for implementing the game 
* logic. 
*/ 
public class Game { 
    //Declare our member variables 
    public final static int TOTAL_TRIES = 3; 
    public final static int MAX_SCORE_POINTS = 10; 
    private String mAnswer; 
    private String lettersHit; 
    private String lettersMissed; 
    private int score; 

    //Default constructor 
    public Game(String answer) { 
     //Initialize our member variables 
     mAnswer = answer.toLowerCase(); 
     lettersHit = ""; 
     lettersMissed = ""; 
    } 

    //This method checks to see if the letter was a hit or a miss 
    public boolean checkLetter(char letter){ 
     letter = validateGuess(letter); 
     boolean isHit = mAnswer.indexOf(letter) != -1; 
     //If correct 
     if (isHit) { 
      //Add the letter to the lettersHit pool 
      lettersHit += letter; 
      keepScore(isHit); 
      System.out.println("Hit! Score: " + score); 

     }else { 
      //Add the letter to the lettersMissed pool 
      lettersMissed += letter; 
      keepScore(isHit); 
      System.out.println("Missed! Score: " + score); 
     } 
     return isHit; 
    } 

    private void keepScore(boolean isHit) { 
     if(isHit) { 
      for (int i = 0; i < lettersHit.length(); i++) { 
       score += MAX_SCORE_POINTS; 
      } 
     } else { 
      for (int i = 0; i < lettersMissed.length(); i++) { 
       score -= MAX_SCORE_POINTS; 
      } 
     } 
    } 

    /* 
    This method handles an empty string input. For example, 
    if the user were to press enter on input a 0 length String 
    will cause the program to crash. 
    */ 
    public boolean checkLetter(String letters) { 
     if (letters.length() == 0) { 
      throw new IllegalArgumentException("No letter entered"); 
     } 
     return checkLetter(letters.charAt(0)); 
    } 

    //This method validates the user guess 
    private char validateGuess(char letter) { 
     //If the character is not a letter 
     if (!Character.isLetter(letter)) { 
      //Ask user for a valid letter 
      throw new IllegalArgumentException("A letter is required!"); 
     } 
     //If entry was valid, convert character to lowercase 
     letter = Character.toLowerCase(letter); 

     //Check if the letter has been guessed already 
     if (lettersHit.indexOf(letter) != -1 || lettersMissed.indexOf(letter) != -1) { 
      throw new IllegalArgumentException("The letter " + letter + " has already been guessed"); 
     } 
     return letter; 
    } 

    //This method keeps track of the user's game progress 
    public String getCurrentProgress() { 
     String progress = ""; 
     //For each character in the array of strings of mAnswer 
     for (char letter : mAnswer.toCharArray()) { 
      char display = '-'; 
      if (lettersHit.indexOf(letter) != -1){ 
       display = letter; 
      } 
      progress += display; 
     } 
     return progress; 
    } 

    //Get the current remaining tries 
    public int getRemainingTries() { 
     return TOTAL_TRIES - lettersMissed.length(); 
    } 

    //Get the current answer 
    public String getAnswer() { 
     return mAnswer; 
    } 

    //This method checks if the game is won. 
    public boolean isWon() { 
     return getCurrentProgress().indexOf('-') == -1; 
    } 


    public int getScore(){ 
     return score; 
    } 
} 

Prompter.java

package Prompter; 
import Game.Game; 
import java.util.Scanner; 

/* This class is responsible for displaying instructions and information to the user 
* regarding the game. 
*/ 
public class Prompter { 
    //The game object 
    private Game mGame; 
    private boolean isHit; 
    private boolean acceptable; 

    //Default constructor 
    public Prompter(Game game) { 
     //Get the instance of our game 
     mGame = game; 
     isHit = false; 
     acceptable = false; 
    } 

    //This method prompts the user for a guess 
    public boolean promptForGuess() { 
     //Create an instance of scanner 
     Scanner scanner = new Scanner(System.in); 

     //Loop for input 
     do { 
      System.out.println("Please enter a letter: "); 
      String guess = scanner.nextLine(); 

      try { 
       isHit = mGame.checkLetter(guess); 
       acceptable = true; 
      }catch (IllegalArgumentException iae) { 
       System.out.printf("%s. Please try again!%n", iae.getMessage()); 
      } 
     } while (!acceptable); 
     return isHit; 
    } 

    //This method displays the progress 
    public void displayProgress() { 
     System.out.printf("You have %d tries to guess the answer" + 
       " before you are taken to the gallows. Try to solve: %s%n", mGame.getRemainingTries(), 
       mGame.getCurrentProgress()); 
    } 

    //This method displays the outcome of the game 
    public void displayOutcome() { 
     if(mGame.isWon()) { 
      System.out.printf("Congratulations! you won with %d tries remaining.%n" + 
        "Your total score: %d%n", mGame.getRemainingTries(), mGame.getScore()); 
     }else { 
      System.out.printf("Bummer! The answer was: %s", mGame.getAnswer()); 
     } 
    } 
} 
+0

Sie verwenden bereits den besten Weg: String.indexOf(). Also, was ist deine ** tatsächliche ** Frage? Haben Sie Ihren Debugger verwendet, um Code Zeile für Zeile auszuführen, die Werte der Variablen zu überprüfen und den Fehler in Ihrem Code zu finden? –

+1

Ihre 'keepScore' Methode ist falsch: Sie fügt 10 * die Anzahl der Buchstaben hinzu, die bereits gefunden wurden. – Nathan

+0

Da ich die Länge einer Zeichenfolge verwende, um die Anzahl der Punkte zu verfolgen, wird die Länge jedes Mal erhöht und daher mit 10 multipliziert. Ich möchte den Index des Buchstaben in der Zeichenfolge erhalten, wenn die Antwort Nizeet ist und ich denke, e wird es: --- ee - und so werden meine Punkte 20. Nächste rate, n: n - ee - jetzt sind meine Punkte 30. Dies passiert hier nicht und da der Index einer Schätzung immer sein wird 0, wird es immer sicher die erste Rate berechnen, ob richtig oder falsch wie 0. –

Antwort

0

Schauen Sie sich diese Methode von Ihnen:

private void keepScore(boolean isHit) { 
    if(isHit) { 
     for (int i = 0; i < lettersHit.length(); i++) { 
      score += MAX_SCORE_POINTS; 
     } 
    } else { 
     for (int i = 0; i < lettersMissed.length(); i++) { 
      score -= MAX_SCORE_POINTS; 
     } 
    } 
} 

Es fügt nicht MAX_SCORE_POINTS mal die Anzahl der guten Buchstaben Sie gerade gefunden, tut es so mit der Anzahl der guten Buchstaben in lettersHit. Nun, was ist in lettersHit? Nun, da sind alle Buchstaben, die du seit dem Start gefunden hast.

So werden Sie haben:

word to guess: anaconda 

letter: a 
lettersHit = "a", score += (lettersHit.length * 10) = 10 
letter: c 
lettersHit = "ac", score += (lettersHit.length * 10) = 30 

Sie nur StringUtils.countMatches(mAnswer, letter); verwenden könnte die Anzahl der Vorkommen zu erhalten, damit die Partitur.

+0

Ok, das ist mein letzter Kommentar für dich. Wenn ein getroffen wird, wird es eine Länge von 1 zurückgeben. Es gibt jedoch zwei As in Anakonda, also wird der Punktwert 20 sein. Wie machst du das? –

+0

@ErickRamirez Verwenden Sie 'StringUtils.countMatches (mAnswer, letter);', um die Anzahl der Vorkommen in Ihrem Wort zu ermitteln. Dann müssen Sie nur diese Zahl verwenden (wenn 0, leiten Sie die Punkte ab, sonst fügen Sie 10 * numberOfOccurences hinzu) – Nathan

Verwandte Themen