2012-09-30 60 views
0

我有一個hangman項目的邏輯問題,它需要用戶的一封信,並搜索該字母是否包含在祕密詞中。問題在於我編寫它的方式,如果用戶在祕密詞中猜出了幾個字母。它只會通過並表示它們。這不是我想要的,我只希望它一次更新正確猜測的字母的狀態。java:hangman遊戲重複字母

我嘗試了一些不同的東西,比如在status(guessCh,之後設置中斷,但是迭代器只會在第一次出現字母匹配並停止的地方。

任何簡單的修復?

private void compare(String str) 
{ 
    guessCh = str.charAt(0); 
    char secretCh = '0'; 
    for (int i = i2; i < secretWord.length(); i++)           // Cuts the secret word into individual chars to process. 
    { 
     secretCh = secretWord.charAt(i); 
//  Compare the two strings. 
     if (guessCh == secretCh)                
     { 
      status(guessCh, i);                // Sends the letter & placement to status(). 
     } 

    } 

} 

ň

private String status(char guessCh, int placement) 
{ 
/* Update and return status. */ 

    if (guessCh >='A' && guessCh <= 'Z') 
    { 
     status = new StringBuffer(status).deleteCharAt(placement).toString(); 
     status = new StringBuffer(status).insert(placement,guessCh).toString(); 
     println("That guess is correct."); 
     canvas.displayWord(status); 
     return status; 
    } 

    return status; 
} 

回答

0

我猜這是某種形式的家庭作業 - 但無論如何,爲什麼不使用indexOf

2

你可以使用你的狀態變量從內部測試事先解決您的比較方法。

if (guessCh == secretCh && status.charAt(i) != secretCh) 
    { 
     status(guessCh, i); 
     break; 
    } 
+0

爲'status.charAt測試(i)!= secretCh'使其跳過已經解決的字母,並且當一個新字母被解決時,「break」使它停止。 – phatfingers

1

從我可以讀到(和理解),你面對的基本問題是通過比較法for循環引起的。

(請注意,我的例子是區分大小寫的,則需要考慮到這一點)

有我可以建議兩種基本方法...

首先是,匹配所有出現的一個單次檢查...

private char guessCh; 
private String secretWord; 
private String status; 
private String secretBuffer; 

public TestStringCompare() { 

    secretWord = "This is a test"; 
    // This is a copy of the secret word, this ensures that 
    // we always have a copy of the original. 
    secretBuffer = secretWord; 
    status  = "______________"; 
    guessCh = 'i'; 

    compare("i"); 

} 

private void compare(String str) { 

    while (secretBuffer.contains(str)) { 

     int foundAt = secretBuffer.indexOf(str); 
     status(str.charAt(0), foundAt); 
     // We want to remove the "guess" from our check string 
     // so it doesn't cause a false positive in the future 
     StringBuilder sb = new StringBuilder(secretBuffer); 
     sb.replace(foundAt, foundAt + 1, "_"); 

     secretBuffer = sb.toString(); 
     System.out.println(secretBuffer); 


    } 

} 

private String status(char guessCh, int placement) { 
    /* Update and return status. */ 

    if (Character.isLetter(guessCh)) { 
     status = new StringBuffer(status).deleteCharAt(placement).toString(); 
     status = new StringBuffer(status).insert(placement, guessCh).toString(); 
     System.out.println("That guess is correct."); 
     System.out.println(status); 
    } 

    return status; 
} 

將產生:

That guess is correct. 
__i___________ 
Th_s is a test 
That guess is correct. 
__i__i________ 
Th_s _s a test 

或更換猜測中第一次出現(這從我的理解是你以後在做什麼)

public class TestStringCompare { 

    public static void main(String[] args) { 
     new TestStringCompare(); 
    } 
    private char guessCh; 
    private String secretWord; 
    private String status; 
    private String secretBuffer; 

    public TestStringCompare() { 

     secretWord = "This is a test"; 
     secretBuffer = secretWord; 
     status  = "______________"; 
     guessCh = 'i'; 

     compare("i"); 

    } 

    private void compare(String str) { 

     if (secretBuffer.contains(str)) { 

      int foundAt = secretBuffer.indexOf(str); 
      status(str.charAt(0), foundAt); 
      // Some where here you need to remove the "guess" character 
      // to ensure that it doesn't get repeated... 
      StringBuilder sb = new StringBuilder(secretBuffer); 
      sb.replace(foundAt, foundAt + 1, "_"); 

      secretBuffer = sb.toString(); 
      System.out.println(secretBuffer); 


     } 

    } 

    private String status(char guessCh, int placement) { 
     /* Update and return status. */ 

     if (Character.isLetter(guessCh)) { 
      status = new StringBuffer(status).deleteCharAt(placement).toString(); 
      status = new StringBuffer(status).insert(placement, guessCh).toString(); 
      System.out.println("That guess is correct."); 
      System.out.println(status); 
     } 

     return status; 
    } 
} 

將產生此...

That guess is correct. 
__i___________ 
Th_s is a test