Hangman可以在数组中保存错误的猜测并在每次猜测之前打印出来。还用“_”打印游戏板并正确猜测

时间:2017-04-08 01:13:11

标签: java

所以我已经学习了大约3个月的Java,我应该只使用数组,循环和if语句来做一个Hangman代码。从另一个文件中读取要猜测的单词并保存为字符串。我必须能够在数组中保存错误的猜测。并且在每次猜测之后打印所有错误的猜测到目前为止,以及带有下划线的游戏板没有猜到的字母和当然在他们的位置的正确猜测。这是我目前的代码:

for(int l = 0; l<wordlength;l++)
{
    System.out.print("_");
}
System.out.println();
System.out.println("WRONG: ");
for(int c = 0; c<numofGuesses;c++)
{  
    System.out.println();
    System.out.print("GUESS"+guessN+"/"+numofGuesses+": ");   
    char guess1=in.next().charAt(0);
    char guess = Character.toUpperCase(guess1);
    guessN = guessN+1;
    for (int j = 0; j<wordlength;j++)
    {
        if (guess==guessword.charAt(j))
        {
          System.out.println("Great guess!");
          System.out.print (guessword.charAt(j));
        }
        else 
        {
          System.out.print("_");
          WRONG[u]=guess;
          u++;
        }
    }

如果你猜A它打印正确“A ___”但是如果你猜B后而不是打印“AB __”(猜到的字是ABLE)我得到“B__”也是错误的数组没有存储和打印所有的每次错误的猜测。请帮助我已经尝试了5天,这就是我今天整天所做的一切,我无法超越它。

1 个答案:

答案 0 :(得分:1)

因为这听起来很像家庭作业,我会给出解决方案,但不提供完整的解决方案。希望看到一个人如何 1 接近这样一个问题就足以朝着正确的方向迈出一步,以便能够自己解决这个问题。

让我们首先考虑一下我们需要做什么。

  1. 读一个需要猜到的词,比如说String toBeGuessed 你这样做了✔
  2. 跟踪玩家到目前为止猜到的角色。
  3. 跟踪玩家获得的回合次数。
  4. 跟踪单词是否已被猜到(玩家赢了!)。
  5. 假设玩家可以进行的猜测数量是固定的。这可以使用常量建模:

    /**
     * Number of guesses a player can take.
     */
    public static final int NUM_GUESSES = 10;
    

    现在让我们考虑一下我们的刽子手游戏的主要逻辑。最好先考虑一下程序的结构,然后再实际实现它。在考虑程序结构时,我们不会为您选择的编程语言的细节烦恼。在pseudocode中,它可能类似于以下内容,也许(让我们用✔表示你已经拥有的内容)。

    for turn from 1 upto NUM_GUESSES do                   ✔
      show player what they guessed so far
      show the gameboard
      ask player for their new guess                      ✔
      save player's guess and update internal state
      check if the player won, let them know if they did
    if player did not win
      let them know
    

    右。所以,我们需要以某种方式存储玩家所做的猜测。每个猜测都是一个角色,我们知道总共会有NUM_GUESS个猜测。一个好的选择(和你的练习建议的一个)是一个数组!

    /**
     * Characters that have been guessed so far.
     */
    private char[] guessed;
    

    这可以初始化如下,因为我们知道最大猜测数:

    this.guessed = new char[NUM_GUESSES];
    

    这为我们提供了一个NUM_GUESSES个字符数组,这些字符被初始化为0(see here)。由于用户不会猜到该字符,我们可以用它来表示尚未完成的猜测。或者,我们可以在单独的变量中跟踪玩家的当前回合。你的选择!

    在下文中,我不会在单独的变量中跟踪当前转弯,只是为了显示更多的数组和循环。将此更改为使用int turn变量可能是一项有趣的练习!

    向玩家展示他们到目前为止所猜到的内容
    好吧,现在这应该是相当简单的。我们基本上需要打印guessed数组中不是0的部分。可以使用循环来完成,例如:

    System.out.print("You so far guessed: ");
    for (int i = 0; i < guessed.length; ++i) {
      if (i > 0) {
        System.out.print(", ");
      }
      if (guessed[i] != 0) {
        System.out.print(guessed[i]);
      } else {
        break; // stop the loop as soon as we run into a 0
      }
    }
    System.out.println(".");
    

    当玩家猜到这些角色时,会打印You so far guessed: a, b, c.之类的内容。看看我们以前只打印过其他字符时如何打印逗号?

    显示游戏板
    程序结构的下一个点是更难以正确的。让我们再考虑一下结构。

    for each character in toBeGuessed
      if the character has been guessed
        print it
      else
        print an underscore
    

    循环一个单词的每个字符可以按如下方式进行。

    int length = toBeGuessed.length();
    for (int i = 0; i < length; ++i) {
      char character = toBeGuessed.charAt(i);
      // do something with character here
    }
    

    如何判断某个角色是否被猜到了?好吧,通过检查它是否存储在guessed数组中。这也可以使用循环完成。当显示玩家到目前为止所猜测的内容时,该循环将与我们上面所描述的循环非常相似。我认为你应该能够解决这个问题。

    保存玩家猜测并更新内部状态
    我们继续讨论程序结构的下一个点。假设我们有一个玩家猜到的char guess。我们需要将它存储在数组guessed中。哪里?那么,在第一个开放点,这似乎是一个合理的选择。要找到那个,让我们再次使用一个循环,并在我们找到一个开放点时break循环。

    for (int i = 0; i < guessed.length; ++i) {
      if (guessed[i] == 0) {
        guessed[i] = guess;
        break;
      }
    }
    

    检查玩家是否赢了,让他们知道他们是否确实
    我们需要知道的是为了查看玩家是否赢了,只是他们猜对了的字符数等于toBeGuessed中的字符数。您可以修改循环以显示游戏板不打印字符,但计算正确的字符。然后在最后与toBeGuessed.length()比较,如果它们相等,则玩家获胜。

    如果玩家没有获胜,请告诉他们
    如果你上一点工作,这应该是相当容易的。

    当你完成上述所有操作并将它拼接在一起时,你应该有一个工作版本的hangman。你自己的,值得骄傲的东西!

    一些提示和技巧:

    • 您可以将上述大多数要点作为单独的方法实施;
    • 当你这样做时,你可以写一个调用其他方法的主方法(这样可以更容易地阅读你自己的代码并对其进行更改);
    • 尽量在main方法中添加尽可能少的代码。

    这是一个你可以从中开始的小模板。

    import java.io.PrintStream;
    import java.util.Scanner;
    
    public class HangMan
    {
      /** Number of guesses a player can take. */
      public static final int NUM_GUESSES = 10;
    
      /** Word to be guessed in a game of hangman. */
      private String toGuess;
      /** Letters that have been guessed so far. */
      private char[] guessed;
    
      /**
       * Construct a new game of hangman, ready to be played.
       */
      public HangMan(String toGuess)
      {
        this.toGuess = toGuess;
        this.guessed = new char[NUM_GUESSES];
      }
    
      // your other methods go here
    
      /**
       * Read guesses from given input and print results to given output.
       * Continues until guesses have run out, or word was guessed.
       */
      public void play(Scanner in, PrintStream out)
      {
        for (int round = 0; round < NUM_GUESSES; ++round) {
          showGuessedSoFar(out);
          showGameBoard(out);
          char guess = askGuess(in, out);
          saveGuess(guess);
          if (hasPlayerWon()) {
            out.println("You won!");
            return;
          }
        }
        // at this point, player ran out of guesses and hence lost
        out.println("You lost...");
      }
    
      /**
       * The bit that runs our hangman game.
       */
      public static void main(String[] args)
      {
        // read word to guess from arguments, with a default value
        // you would probably insert your "read word from file" code here
        HangMan game = new HangMan(args.length >= 1 ? args[0] : "ABLE");
        // play a game, using system input and output
        game.play(new Scanner(System.in), System.out);
      }
    }
    
    祝你好运!

    TL; DR。尝试教会人们如何思考问题以及如何编写执行解决方案的代码。提供了一些带有数组和循环的示例代码。

    1 这只是一种可能的解决方案,总有很多方法可以解决给定的问题。