2016-10-02 77 views
4

我正在为Java介绍一个类,并且我们有一个处理hang子手游戏的项目。我有大部分的代码已经解决了,但是有一个我似乎无法解决的错误。Java中的基本Hang子手游戏(主要涉及字符串操作)

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

出于测试目的,该词已默认为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的事,但我已经尝试了一些其他的事情,他们都没有奏效。任何帮助,将不胜感激。

谢谢。

+1

如果问题是字符串操作,那么为什么不把自己的包装类'的char []',那也可以拥有到正在实际字的引用猜到了。操作起来会更容易,因为它不是不可变的。你可以填写字符。 –

+0

我不确定我们是否可以这样做,但无论如何感谢 – Equinoxinator

回答

2

与您的代码的问题是,每次的blank.indexOf(输入)返回2每次(的indexOf返回“R”,这是2的第一次出现

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

  1. 保持要打印的图案。为此做一个变量。
  2. 每当用户猜测正确时更新模式。

注:在下面的代码的猜测是我说的这最初被设置为“------”单词“窄”

// 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) 

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

+0

您的方式奏效。谢谢 – Equinoxinator

+1

乐意帮忙! :) – Moonstruck

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; 
    } 
} 

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

1

我认为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);      
    } 
} 
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); 
}