Java中的基本Hangman游戏(主要涉及字符串操作)

时间:2016-10-02 22:38:07

标签: java string if-statement

我正在参加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有关,但我尝试了其他一些事情并没有奏效。任何帮助将不胜感激。

谢谢。

4 个答案:

答案 0 :(得分:2)

你的代码的问题是每次blank.indexOf(输入)每次都返回2(indexOf返回第一次出现的&#39; r&#39;这是2)

您可以更改条件以检查用户猜到的空格中的字符是否包含用户猜到的字母。 您可以按如下方式执行此操作:

  1. 保持要打印的图案。为此做一个变量。
  2. 每次用户猜对时都会更新模式。
  3. 注意:在下面的代码中,猜测是我正在谈论的变量,它最初被设置为&#34; ------&#34;对于&#34;狭窄&#34;

    这个词
    datetime

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

答案 1 :(得分: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 :(得分:1)

我认为blank.indexOf(input)仅返回该input字符的第一个匹配索引。因此,您需要使用this indexOf(int ch, int fromIndex)。 在您的情况下,将输入char的最后一次出现的索引存储在某个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 :(得分:1)

indexOf(String str)返回指定子字符串的FIRST OCCURENCE的字符串中的索引。更多此here

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

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