【问题标题】:Hangman, replace hidden word with correctly guessed letter刽子手,用正确猜到的字母替换隐藏的单词
【发布时间】:2021-10-25 00:44:22
【问题描述】:

我是 java 新手,对于一个班级,我应该创建一个刽子手风格的游戏。我想出了如何从单词列表中提取和屏蔽单词,但不能用新猜测的字母替换被屏蔽的单词,也不会将猜测正确或错误的字母存储到 String 变量中。我的老师建议我们不能使用数组,我们必须使用一个字符并让它搜索字符串......任何帮助将不胜感激!

这是输入猜测:

guess = keyboard.next().toLowerCase().charAt(0);
            
            if (Character.isAlphabetic(guess)){
               for (int l = 0; l < guessedLetters.length(); l++){
                  if (guessedLetters.charAt(l) == guess){
                  System.out.println ("==> a was already guessed.");
                  }
                  else if (Character.isAlphabetic(guess)){
                     for(int m = 0; m < guessedLettersInc.length(); m++){
                        if (guessedLettersInc.charAt(m) == guess){
                           guessedLettersInc = guessedLettersInc + guess;
                  }}}
                  else{
                     hiddenWordGame = hiddenWordNew;
                     guessedLetters = guessedLetters + guess;
                  }}}
            else{
               System.out.println("Not a letter, guess again:");
            }

然后检查隐藏的单词并将“-”替换为我拥有的正确字母:

   public static String hiddenWordGame(String wordLookup, String hiddenWordGame, String guess, String hiddenWordNew)
   {
   
     for (int k = 0; k < wordLookup.length(); k++)
        if(wordLookup.charAt(k) == guess.charAt(0)){
           hiddenWordNew += guess.charAt(0);
           }
             
        else{
           hiddenWordNew += hiddenWordGame.charAt(k);
           }
          return hiddenWordNew;
              }

当它运行时,这就是我得到的全部(例如,单词是“lamber”):

已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ?? l

已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ?? 一个

已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ?? 米

已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ?? z

已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ?? /

不是字母,再猜一下: 已经猜到的字母: 猜猜这个单词中的一个字母:-=--=- ??


这里添加了完整代码,因为它必须从 txt 文件中提取单词(作为作业的一部分),然后是单词的实际掩码...

import java.util.Scanner;
import java.util.Random;
import java.io.*;

public class WordGame2 {

static Random randomNum = new Random();

   public static void main(String[] args) throws IOException
   {
   
   Scanner keyboard = new Scanner(System.in);
   
   int numberGames = 1;
   int highScore;
   int avgScoreRunning;
   int avgScoreFinal;
   int currentScore;
   int numGuesses = '0';
   char anotherOne;
   char guess;
   String guessedLetters = "";
   String hiddenWordNew = "";
   String guessedLettersInc = "";
   String secret = "";
   String hiddenWordFinal = "";
   String wordLookup;
   String hiddenWordGame;
   String guessGame;

   
   
   
   
   
   System.out.print("Welcome to Words: The Word Guessing Game!\n");
   System.out.print("Play as many games as you like. I'll remember your top score.\n");
   System.out.print("and also compute your average for all games played.\n");
   
   
   do{
   numberGames++;
   
   wordLookup = findWord();
   System.out.println(wordLookup);
   hiddenWordGame = hideWord(wordLookup);
   System.out.println(hiddenWordGame);
   System.out.println("\n- - - - - - - - - - - - - - - - - - - - - -");
      
   do{
   System.out.print("Letters already guessed: " + guessedLettersInc);
         System.out.println("\nGuess a letter in this word: " + hiddenWordGame + " ??");
         guess = keyboard.next().toLowerCase().charAt(0);
            
            if (Character.isAlphabetic(guess)){
               for (int l = 0; l < guessedLetters.length(); l++){
                  if (guessedLetters.charAt(l) == guess){
                  System.out.println ("==> a was already guessed.");
                  }
                  else if (Character.isAlphabetic(guess)){
                     for(int m = 0; m < guessedLettersInc.length(); m++){
                        if (guessedLettersInc.charAt(m) == guess){
                           guessedLettersInc = guessedLettersInc + guess;
                  }}}
                  else{
                     hiddenWordGame = hiddenWordNew;
                     guessedLetters = guessedLetters + guess;
                  }}}
            else{
               System.out.println("Not a letter, guess again:");
            }
   numGuesses++;            
   }
   while(hiddenWordNew != wordLookup);
   
   System.out.println("Want to play again? (Y/y for another): ");
      anotherOne = keyboard.next().charAt(0);
   }
   while (anotherOne == 'Y' || anotherOne == 'y');
   }
      public static String findWord() throws IOException
      {
         String secretWord = new String();
      
         File wordList = new File("wordlist.txt");
         Scanner wordListNew = new Scanner(wordList);
   
         int wordNumber = randomNum.nextInt(33735) +1;   
            
         for(int i = 1; i <= wordNumber; i++){
            secretWord = wordListNew.nextLine();
            if(i == wordNumber){
               }}
               return secretWord;
               }
               
       public static String hideWord(String wordLookup)
       {
         
         String hiddenWordFinal;
         
         int wordLength = wordLookup.length();
         System.out.println(wordLength);
         
         String hiddenWord = "";
         
         for (int j = 0; j < wordLookup.length(); j++)
            if(wordLookup.charAt(j) == 'a' || wordLookup.charAt(j) == 'e' || 
            wordLookup.charAt(j) == 'i' || wordLookup.charAt(j) == 'o' || 
            wordLookup.charAt(j) == 'u'){
               hiddenWord += "=";
            }
            else{
               hiddenWord += "-";
            }
            return hiddenWord;
            }
            
       public static String hiddenWordGame(String wordLookup, String hiddenWordGame, String guess, String hiddenWordNew)
       {
       
         for (int k = 0; k < wordLookup.length(); k++)
            if(wordLookup.charAt(k) == guess.charAt(0)){
               hiddenWordNew += guess.charAt(0);
               }
                 
            else{
               hiddenWordNew += hiddenWordGame.charAt(k);
               }
              return hiddenWordNew;
                  }
}

【问题讨论】:

  • 您的输出与代码不匹配。考虑提供一个 minimal reproducible example 来证明您的问题
  • 我添加了完整的代码,因为我认为它不是太大并且需要使用外部 txt 文件。感谢您的关注和回复
  • 你能解释一下为什么你有这个 if 语句吗? if (guessedLettersInc.charAt(m) == guess){ guessedLettersInc = guessedLettersInc + guess; }
  • 这是为了创建一串不正确的猜测,并验证猜测是否已经存在。看了一下,肯定是不完整的,我觉得我太专注于掩蔽问题了……但是你!我需要纠正那个

标签: java


【解决方案1】:

好的,所以我已经运行了您的代码并...

  • while(hiddenWordNew != wordLookup); 不是你比较 Strings 的方式
  • 你没有打电话给hiddenWordGame,所以我不确定hiddenWordNew 将如何更新
  • 你给Character.isAlphabetic打了两次电话,太浪费了
  • ...而且,您知道吗,需要一种稍微不同的方法

因此,基本思想是,您想为用户创建某种“提示”,向他们展示猜到了什么和没有猜到什么。这样管理起来就变得更简单了,因为您只需要根据用户的猜测“屏蔽”“主”词,如果它们匹配,则用户已经猜到了这个词。

所以,首先,我更改了您的“屏蔽”工作流程:

public static String maskFor(char character) {
    if (character == 'a' || character == 'e'
            || character == 'i' || character == 'o'
            || character == 'u') {
        return "=";
    } else {
        return "-";
    }
}

public static String wordMask(String master, String guesses) {
    String mask = "";
    for (char character : master.toCharArray()) {
        if (guesses.indexOf(character) != -1) {
            mask += character;
        } else {
            mask += maskFor(character);
        }
    }
    return mask;
}

使用快速健全性检查

System.out.println(wordMask("Java", ""));
System.out.println(wordMask("Java", "a"));
System.out.println(wordMask("Java", "av"));
System.out.println(wordMask("Java", "avp"));
System.out.println(wordMask("Java", "avj"));
System.out.println(wordMask("Java", "avjJ"));

打印

-=-=
-a-a
-ava
-ava
-ava
Java

很好,第一步完成了。

接下来,我改变了你的游戏循环。这基本上会

  • 找词
  • 生成第一个掩码
  • 提示用户输入
  • 检查这是一个“字母”字符
  • 更新用户猜测
  • 生成新蒙版
  • 将掩码与“master”和单词进行比较,然后继续直到猜出单词。

例如...

do {
    numberGames++;

    wordLookup = findWord();
    System.out.println("\n- - - - - - - - - - - - - - - - - - - - - -");

    guessedLetters = "";
    hiddenWordGame = wordMask(wordLookup, guessedLetters);
    do {
        System.out.println("\nGuess a letter in this word: " + hiddenWordGame + " ??");
        guess = keyboard.next().toLowerCase().charAt(0);

        if (Character.isAlphabetic(guess)) {
            guessedLetters += guess;
        } else {
            System.out.println("Not a letter, guess again:");
        }
        numGuesses++;
        hiddenWordGame = wordMask(wordLookup, guessedLetters);
    } while (!hiddenWordGame.equals(wordLookup));

    System.out.println("Want to play again? (Y/y for another): ");
    anotherOne = keyboard.next().charAt(0);
} while (anotherOne == 'Y' || anotherOne == 'y');

现在,如果您关心,您可以检查guessedLetters 是否也包含guess,我没有打扰。

可运行示例

我修改了您的 findWord 方法以返回静态单词,使测试更容易。

import java.util.Scanner;
import java.util.Random;
import java.io.*;

public class WordGame2 {

    static Random randomNum = new Random();

    public static void main(String[] args) throws IOException {

        Scanner keyboard = new Scanner(System.in);

        int numberGames = 1;
        int highScore;
        int avgScoreRunning;
        int avgScoreFinal;
        int currentScore;
        int numGuesses = '0';
        char anotherOne;
        char guess;
        String guessedLetters = "";
        String hiddenWordNew = "";
        String guessedLettersInc = "";
        String secret = "";
        String hiddenWordFinal = "";
        String wordLookup;
        String hiddenWordGame;
        String guessGame;

        System.out.print("Welcome to Words: The Word Guessing Game!\n");
        System.out.print("Play as many games as you like. I'll remember your top score.\n");
        System.out.print("and also compute your average for all games played.\n");

    do {
        numberGames++;

        wordLookup = findWord();
        System.out.println("\n- - - - - - - - - - - - - - - - - - - - - -");

        hiddenWordGame = wordMask(wordLookup, guessedLetters);
        do {
            System.out.println("\nGuess a letter in this word: " + hiddenWordGame + " ??");
            guess = keyboard.next().toLowerCase().charAt(0);

            if (Character.isAlphabetic(guess)) {
                guessedLetters += guess;
            } else {
                System.out.println("Not a letter, guess again:");
            }
            numGuesses++;
            hiddenWordGame = wordMask(wordLookup, guessedLetters);
        } while (!hiddenWordGame.equals(wordLookup));

        System.out.println("Want to play again? (Y/y for another): ");
        anotherOne = keyboard.next().charAt(0);
    } while (anotherOne == 'Y' || anotherOne == 'y');
    }

    public static String findWord() throws IOException {
        return "word";
//        String secretWord = new String();
//
//        File wordList = new File("wordlist.txt");
//        Scanner wordListNew = new Scanner(wordList);
//
//        int wordNumber = randomNum.nextInt(33735) + 1;
//
//        for (int i = 1; i <= wordNumber; i++) {
//            secretWord = wordListNew.nextLine();
//            if (i == wordNumber) {
//            }
//        }
//        return secretWord;
    }

    public static String maskFor(char character) {
        if (character == 'a' || character == 'e'
                || character == 'i' || character == 'o'
                || character == 'u') {
            return "=";
        } else {
            return "-";
        }
    }

    public static String wordMask(String master, String guesses) {
        String mask = "";
        for (char character : master.toCharArray()) {
            if (guesses.indexOf(character) != -1) {
                mask += character;
            } else {
                mask += maskFor(character);
            }
        }
        return mask;
    }
}

但是老师直到下一章才允许使用它们(他特别说我们不能使用它们...)

如果你只是遍历String的每个字符,基本逻辑仍然成立

public static String wordMask(String master, String guesses) {
    String mask = "";
    for (int index = 0; index < master.length(); index++) {
        char character = master.charAt(index);
        if (guesses.indexOf(character) != -1) {
            mask += Character.toString(character);
        } else {
            mask += maskFor(character);
        }
    }
    return mask;
}

从技术上讲,String 只是一个托管的char 数组;)

【讨论】:

  • 这绝对是一个更好的方法来运行它,我希望我们可以使用数组,但是老师直到下一章才允许它们(他特别说我们不能使用它们......),即使它会使这项任务变得更容易和更流畅。这是让我最悲伤的事情!
  • @beansers 查看更新
  • 非常感谢!抱歉,我第一次有机会看,但这完全解决了我的掩蔽问题,再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2020-10-15
  • 2015-11-20
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多