【问题标题】:Basic Hangman game in Java (mostly concerns string manipulation)Java 中的基本 Hangman 游戏(主要涉及字符串操作)
【发布时间】:2017-02-10 20:35:18
【问题描述】:

我正在学习 Java 入门课程,我们有一个处理刽子手游戏的项目。我已经完成了大部分代码,但有一个我似乎无法解决的错误。

首先,程序提示用户输入一个字母和一个他们认为该字母所在的空格,然后程序以一系列连字符显示一个单词,如果用户猜对了,则显示相应连字符中的字母替换为上述字母。

出于测试目的,该词已默认为narrow

所以如果我猜字母 r 和空格,我猜索引 2,程序会给我:

Guess a letter: r 

Guess a space:  2

Guess:    --r---

我遇到的问题是,当我猜测空间的索引 3 并尝试猜测下一个 r 时,程序只会给我与以前相同的输出。

我们不允许使用数组或字符串生成器,因为我们还没有讨论过它们。

这是我的变量:

    // default word for testing
    String blank = "narrow";

    // variables to manipulate the string
    String start = "";
    String end = "";
    String word = "";

    // variables for input and output
    // input is used for the user's letter guess
    String input; 
    // space is used for the user's index guess
    String space = "";
    // guess is used at the end to display the word to the user and set equal to word after
    // it has been manipulated
    String guess = "";

这是正在处理字符串的代码。

    for (int i = 0; i < blank.length(); i++) {
         if (i == blank.indexOf(input)) {
             start = guess.substring(0, i);
             end = guess.substring(i + 1);
             word = start.concat(input).concat(end);                    
         }
    }

我认为这与if statement 有关,但我尝试了其他一些方法,但没有奏效。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 如果问题是字符串操作,那么为什么不为char[] 创建自己的包装类,它也可以包含对正在猜测的实际单词的引用。操纵它会更容易,因为它不是一成不变的。你可以只填写字符。
  • 我不确定我们是否可以这样做,但还是谢谢

标签: java string if-statement


【解决方案1】:

我会这样写:

//set up variables
Scanner keyboard = new Scanner(System.in);
String word = "narrow";
String display = "";
for (int i = 0; i < word.length(); i++) {
  display = display + "-";
}

//loop until the word is guessed
while (display.contains("-")) {

  //show the user flow, take input
  System.out.println("Guess: " + display);
  System.out.print("Guess a letter: ");
  String letter = keyboard.nextLine();
  System.out.print("Guess a space: ");
  String spaceStr = keyboard.nextLine();
  int space = Integer.parseInt(spaceStr);

  //check if the guess is right
  if (letter.equals(word.charAt(space) + "")) {

    //modify the string shown to the user
    String temp = display.substring(space + 1);
    display = display.substring(0, space);
    display = display + letter + temp;
  }
}

关键是要有一个向用户显示的变量和一个保存真实单词的变量。当他们做出正确的猜测时,您可以修改显示给用户的字符串。

【讨论】:

    【解决方案2】:

    我认为blank.indexOf(input) 仅返回该input 字符的第一个出现索引。所以你需要使用thisindexOf(int ch, int fromIndex)。 在您的情况下,将输入字符的最后一次出现的索引存储在某个 int 变量中,然后将其用作fromIndex

    int lastOccurrence = 0; 
    for (int i = 0; i < blank.length(); i++) {
         if (i == blank.indexOf(input, lastOccurrence)) {
             lastOccurrence = i; 
             start = guess.substring(0, i);
             end = guess.substring(i + 1);
             word = start.concat(input).concat(end);                    
         }
    }
    

    【讨论】:

      【解决方案3】:

      您的代码的问题是每次 blank.indexOf(input) 每次都返回 2(indexOf 返回 'r' 的 第一次出现,即 2)

      您可以更改条件以检查用户猜测的空格处的字符是否包含用户猜测的字母。 你可以这样做:

      1. 维护要打印的图案。为此创建一个变量。
      2. 每次用户猜对时更新模式。

      注意:在下面的代码中,猜测是我正在谈论的变量,它最初设置为“------”,表示单词“narrow”

          // check if the space has the letter you guessed
          if (blank.charAt(space) == input.charAt(0)) {
               // if it has just update the pattern string to also contain the new letter
               guess = guess.substring(0, space) + input + guess.substring (space + 1)
      

      您可以只打印或返回(如果是方法)模式字符串。

      【讨论】:

      • 乐于助人! :)
      【解决方案4】:

      indexOf(String str) 返回此字符串中指定子字符串第一次出现的索引。更多 here

      我建议的最佳方法是仅在用户正确的情况下更改输出。因此,对于我会做的每一个猜测:

      if(blank.charAt(space) == input.charAt(0))
      {
           start = guess.substring(0, space);
           end = guess.substring(space + 1);
           word = start.concat(input).concat(end);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多