2016-10-02 61 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); 
}