2013-06-25 40 views
0
public class Hangman { 

    private String secret; 
    private String disguise; 
    private int guessCount; 
    private int wrong; 

    public Hangman() { 
     secret="word"; 
     disguise="????"; 
     guessCount=0; 
     wrong=0; 
    } 

    public void makeGuess(char input) { 
     String temp; 
     temp=disguise; 
     for (int i=0; i<secret.length(); i++) { 
      if (secret.charAt(i)==input) { 
       disguise=disguise.replace(disguise.charAt(i), input); 
      } 
     } 
     if (temp.equals(disguise)) 
      wrong++; 
    } 

我對我的代碼有些困難,特別是僞裝=僞裝。替換行。我的代碼的目標是通過用戶猜測來僞裝成祕密的字母。 for循環遍歷祕密詞中的所有字母,並查找用戶輸入的字符與祕密詞中的字母之間的匹配。 如果有匹配,我希望程序用輸入的字符替換那個位置的僞裝符號。用hang子手的錯誤代替字母(s)

取而代之的是我的代碼正在用用戶猜測的字母來代替所有的字母,如果它在單詞祕密中。

Example: 
???? 
w 
wwww (disguise) 
word (secret) 

what I want: 
???? 
w 
w??? 
word 

這是我的演示類:

import java.util.Scanner; 
public class HangmanDemo { 

    public static void main(String[] args) { 
     char input; 
     Hangman game = new Hangman(); 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println(game.getDisguisedWord()); 
     for (int i=0;i<10;i++){ 
      String line=keyboard.nextLine(); 
      input = line.charAt(0); 

      game.makeGuess(input); 
      game.guessCount(); 
      game.getDisguisedWord(); 
      game.isFound(); 
      System.out.println(game.getDisguisedWord()); 
      System.out.println(game.getSecretWord()); 
     } 
    } 
} 

如果任何人都可以指出什麼是錯的我在班上編碼REPLACE語句,將不勝感激。

感謝

+0

請提供一些示例輸入和輸出。 – Masudul

+0

你可能想要考慮的其他事情是,如果他們猜測他們已經進入的一封信,會發生什麼?目前,以下所有解決方案都無能爲力,因爲信件已被替換,但您可能希望它是錯誤的猜測或顯示,他們已經猜到了 –

回答

1

你disquise字都是????所以不管你輸入什麼,代碼disguise.charAt(i)將永遠是一個?所以每一個?將被替換

你想要的是secret.charAt(i)像下面

public void makeGuess(char input) { 
    String temp; 
    temp=disguise; 
    char[] disquiseChars = disquise.toCharArray(); //added 
    for (int i=0; i<secret.length(); i++) { 
     if (secret.charAt(i)==input) { 
      //disguise=disguise.replace(secret.charAt(i), input); 
      //Change in above line, but this still wont work, try this now 
      disquiseChars[i] = input; 
     } 
    } 
    disquise = disquiseChars; 
    if (temp.equals(disguise)) 
     wrong++; 
} 

不是最完美的解決方案,但應該做的伎倆

編輯:下面將是一個快速的方法來檢查,如果他們有已經猜到了一個字母,但只猜對了一個正確的字母我現在意識到了

public void makeGuess(char input) { 
    if(diquise.contains(String.valueOf(input)) 
    { 
     System.out.println("You have already guessed " + input); 
     wrongGuess++; // if you decide 
     return; 
    } 
    String temp; 
    temp=disguise; 
    char[] disquiseChars = disquise.toCharArray(); 
    for (int i=0; i<secret.length(); i++) { 
     if (secret.charAt(i)==input) 
     { 
      disquiseChars[i] = input; 
     } 
    } 
    disquise = disquiseChars; 
    if (temp.equals(disguise)) 
     wrong++; 
} 
0

只需更換用disguise[i] = input;代替循環中的函數,並且隨着循環的繼續,所有更改都根據需要進行:)

這裏的問題與Java魔鬼建議的一樣,您將替換所有'?'與輸入!

編輯:對不起,我在想.NET。當我說disguise[i]

無論聲明僞裝爲StringBuilder爲使用disguise.setCharAt(i, input);或做 disguise = disguise.substring(0,i) + input + disguise.substring(i+1, disguise.length());

第2版適用於字符串了。你是第一個從0創建2子到要改變位置的索引,然後加入串聯第二子從i + 1到年底

希望它可以幫助新的字符& ..

乾杯

0

看看String.replace(char,char)文檔,你會看到它用newChar替換了oldChar的EVERY實例。這意味着每個'?'將被'w'取代。你想要做的只是替換那個給定位置上的字符。

爲此,您可以使用char []而不是字符串,並輕鬆地用索引替換字符。要從字符串中獲取char [],只需在祕密字上調用String.toCharArray()方法即可。

public class Hangman { 

    private String secret; 
    private char[] disguise; 
    private int guessCount; 
    private int wrong; 

    public Hangman() { 
     secret="word"; 
     disguise="????".toCharArray(); // <-- Basically this changes 
     guessCount=0; 
     wrong=0; 
    } 

    public void makeGuess(char input) { 
     boolean found = false; 
     for (int i=0; i<secret.length(); i++) { 
      if (secret.charAt(i)==input) { 
       disguise[i] = input; // <-- Basically this changes 
       found = true; 
      } 
     } 
     if (!found) 
      wrong++; 
    } 
4

因爲你的「僞裝」只包含?replace(char oldchar, char newChar)實際上替代的oldchar所有出現,你的整個字符串被替換。

你真正想要的是在特定位置替換一個字符,並且可以使用StringBuilder#setCharAt。看我的例子如下:

public void makeGuess(char input) { 
    StringBuilder temp = new StringBuilder(disguise); 
    boolean wrongGuess = true; 
    for (int i=0; i<secret.length(); i++) { 
     if (secret.charAt(i) == input) { 
      temp.setCharAt(i, input); 
      wrongGuess = false; 
     } 
    } 

    disguise = temp.toString(); 
    System.out.println(disguise); 
    if (wrongGuess){ 
     wrong++; 
    } 
} 
0

String chartAt(i)return character not index。如果您替換角色,而不是所有角色的出現都將被替換。

如果您閱讀Java文檔,那麼您必須瞭解爲什麼replace(char,char)方法不會替換單個字符。以下qoute來自Java Docs。

公共替換​​字符串(字符oldChar,焦炭newChar)

返回從替換此字符串中通過用newChar oldChar的所有事件導致一個新的字符串。如果在此String對象表示的字符序列中出現字符oldChar ,則返回此String對象的引用。否則,將創建一個新的 字符串對象,該對象表示與由此String對象表示的字符序列 相同的字符序列 ,只是每次出現的oldChar被newChar的出現次數 替換。