Ввод игры Java Scramble после подсказки

#java #input

#java #ввод

Вопрос:

Я модифицирую игру unscramble на Java. У меня есть два массива: один для исходных слов, а другой для их подсказок. Поэтому, когда пользователь угадывает неправильно, появляется соответствующая подсказка, и я хочу, чтобы у пользователя был еще один шанс угадать после отображения подсказки. Но прямо сейчас я, похоже, не могу получить этот «еще один шанс» на работу. Может кто-нибудь, пожалуйста, помочь? Спасибо.

Код:

 import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;
import java.util.Calendar;
import java.util.Date;

// How to create a Jumble word game in Java
 
public class MyProgram {
 
    private static final String[] WORDS_DATABASE = new String[] {
        "code","kids","baby", "dosa", "beach","house","apple", "paper", 
        "Java", "school", "science", "Oracle", "Disney", "cricket", "carrot",
        "vada"
    };
    
    private static String[] hints = new String[] {
        "Programs are made of ___", "Synonym for children", "Synonym for infant",
        "Idli, vada, and ___", "This place is next to ocean", "Other word for 'home'", 
        "This is a red color fruit", "pencil and ____", "programming language", 
        "place for education", "Physics, chemistry, biology are all ____", 
        "Larry Ellison founded this company", "the ____ princesses", "Famous sport with bat and ball",
        "What rabbits eat", "idli and ___"
    };
     
    public static void main(String[] args) {
        MyProgram jg = new MyProgram();
        jg.startGame();

        
    }
 
    /**
     * Run a game of Jumble in Java. The steps in the game are,
     * 1. Get a random word from the words database
     * 2. Shuffle/jumble the word by randomly shuffling characters
     * 3. Present the jumbled word to the user and ask him to guess the word.
     * 4. Repeat the guess till answer is found or user decides to quit.
     */
    private void startGame() {
       // int numberOfGuesses = 0;
       // String original = selectRandomWord();
        
        
        //String shuffled = getShuffledWord(original);
        boolean gameOn = true;
        while(gameOn) {
            int numberOfGuesses = 0;
            String original = selectRandomWord();
        
        
            String shuffled = getShuffledWord(original);

            System.out.println("Shuffled word is: " shuffled);
            
            numberOfGuesses  ;
            String userGuess = getUserGuess();
            if(original.equalsIgnoreCase(userGuess)) {
                System.out.println("Congratulations! You found the word in " numberOfGuesses " guesses");
                System.out.println("");
                //gameOn = false;
            }else {
                
                System.out.println("Sorry, Wrong answer");
                System.out.println("--------");
                if (numberOfGuesses > 0){
                    displayHint(original);
                    System.out.println("");
                  //  String userGuess = getUserGuess();
                }
            }
        }        
    }
     
    /**
     * Get the user's word guess from command line
     * @return 
     */
    public String getUserGuess() {
        Scanner sn = new Scanner(System.in);
        System.out.println("Please type in the original word: ");
        return sn.nextLine();
    }
     
    /**
     * Select a random word from the WORDS_DATABASE array.
     * @return 
     */
    public String selectRandomWord() {
        int rPos = ThreadLocalRandom.current().nextInt(0, WORDS_DATABASE.length);
        return WORDS_DATABASE[rPos];
    }
     
    /**
     * Shuffle the original word by randomly swapping characters 10 times
     * @param original
     * @return 
     */
    public String getShuffledWord(String original) {
        String shuffledWord = original; // start with original
        int wordSize = original.length();
        int shuffleCount = 10; // let us randomly shuffle letters 10 times
        for(int i=0;i<shuffleCount;i  ) {
            //swap letters in two indexes
            int position1 = ThreadLocalRandom.current().nextInt(0, wordSize);
            int position2 = ThreadLocalRandom.current().nextInt(0, wordSize);
            shuffledWord = swapCharacters(shuffledWord,position1,position2);
        }
        return shuffledWord;
    }
 
    /**
     * Swaps characters in a string using the given character positions
     * @param shuffledWord
     * @param position1
     * @param position2
     * @return 
     */
    private String swapCharacters(String shuffledWord, int position1, int position2) {
        char[] charArray = shuffledWord.toCharArray();
        // Replace with a "swap" function, if desired:
        char temp = charArray[position1];
        charArray[position1] = charArray[position2];
        charArray[position2] = temp;
        return new String(charArray);
    }
    
    private void displayHint(String s){
        for (int i = 0; i < WORDS_DATABASE.length; i  ){
            if (WORDS_DATABASE[i].equals(s)){
                System.out.println("HINT:"   hints[i]);
            }
        }
    }
}
  

Ответ №1:

Добавьте цикл в startGame() для повторного воспроизведения с новым словом, например:

 boolean playAgain = true;
while(playAgain)
    playAgain = jg.startGame();
  

Измените startGame(), чтобы возвращать true, когда пользователь хочет играть снова, в противном случае false . Кроме того, переместите операторы случайного выбора слова и перетасовки слов за пределы цикла GameOn, чтобы прекратить получение нового слова, даже если пользователь дает правильный ответ.

 private boolean startGame() {
    boolean gameOn = true;
    int numberOfGuesses = 0;
    String original = selectRandomWord();
    String shuffled = getShuffledWord(original);
    System.out.println("Shuffled word is: " shuffled);
    while(gameOn) {
        numberOfGuesses  ;
        String userGuess = getUserGuess();
        if(original.equalsIgnoreCase(userGuess)) {
            System.out.println("Congratulations! You found the word in " numberOfGuesses " guesses");
            System.out.println("");
            gameOn = false;
        }else {
            System.out.println("Sorry, Wrong answer");
            System.out.println("--------");
            if (numberOfGuesses > 0){
                displayHint(original);
                System.out.println("");
            }
        }
    }
    if(checkIfUserwantsToPlayAgain())
        return true; // To restart the game
    return false; // To stop the game
}
  

Ответ №2:

Поэтому, когда пользователь угадывает неправильно, появляется соответствующая подсказка, и я хочу, чтобы у пользователя был еще один шанс угадать после отображения подсказки. Но прямо сейчас я, похоже, не могу получить этот «еще один шанс» на работу.

Вам просто нужно переместить выделение и скремблирование слова ПЕРЕД while циклом, чтобы он не выбирал новое слово, когда они угадывают неправильно. Кроме того, почему вы закомментировали gameOn = false; строку? Это необходимо для завершения игры.

После того, как вы переместите строки инициализации перед while циклом, теперь вы можете поместить все это в другой while цикл, который запрашивает пользователя, хочет ли он сыграть в новую игру (впрочем, я оставлю это вам).

 int numberOfGuesses = 0;
String original = selectRandomWord();
String shuffled = getShuffledWord(original);

while(gameOn) {
    System.out.println("Shuffled word is: " shuffled);
    
    numberOfGuesses  ;
    String userGuess = getUserGuess();
    if(original.equalsIgnoreCase(userGuess)) {
        System.out.println("Congratulations! You found the word in " numberOfGuesses " guesses");
        System.out.println("");
        gameOn = false;
    }else {
        
        System.out.println("Sorry, Wrong answer");
        System.out.println("--------");
        if (numberOfGuesses > 0){
            displayHint(original);
            System.out.println("");
        }
    }
}  
  

Теперь, когда пользователь угадывает неправильно, он отобразит подсказку и вернется к началу while цикла, где он попросит пользователя еще раз угадать. Он будет оставаться в цикле, пока они не получат его правильно и gameOn не переключится на false.

Но как мне сделать так, чтобы пользователь мог ввести, хочет он играть дальше или нет, после окончания раунда?

Вы могли бы изменить свой main() на что-то вроде этого:

   public static void main(String[] args) {
    boolean keepPlaying = true;
    Scanner sn = new Scanner(System.in);
    
    while (keepPlaying) {
      MyProgram jg = new MyProgram();
      jg.startGame();

      
      System.out.print("Would you like to play again? [Y or YES]: ");
      String response = sn.nextLine().toUpperCase();
      keepPlaying = (response.equals("Y") || (response.equals("YES")));
    }
    
  }
  

Комментарии:

1. Всем привет, спасибо за помощь! Теперь это сработало. Но как мне сделать так, чтобы пользователь мог ввести, хочет он играть дальше или нет, после окончания раунда? (Я относительно новичок в Java game dev. так что я все еще изучаю логику и прочее) Еще раз спасибо.