2017-10-07 44 views
-1

我正在使用一個StringBuilder並將*附加到要猜測的單詞的每個字母。然後,當用戶猜測字母/字符正確時,StringBuilder應該將某個索引處的字符從*改變爲猜到的字母/字符。然後打印新的StringBuilder以顯示正確的字母(ho * s *)。如果猜測是錯誤的,那麼只需打印StringBuilder並說錯誤的猜測。找不到爲什麼我的輸出打印2次以及如何在StringBuilder中交換字符

我想弄清楚爲什麼這不能正常工作。我越來越喜歡輸出:(減去/它不會發布只是*)

劊子手

嘗試和猜詞,你有9名企圖:

/****** *********

猜一個字母:克

/********

猜一個字母:p

p **** **** p **** p **** p **** p

猜一個字母

這也是印刷字不止一次和我不知道爲什麼。在findMatch方法

sb.setCharAt(i, '*'); 

,所以你應該將其刪除:

import java.util.Random; 
import java.util.Scanner; 


public class Hangman { 
static String[] words = {"house", "show", "garage", "computer", "programming", "porch", "dog"}; 
static char[] correct = new char[26]; 
static char[] wrong = new char[26]; 
static char guess; 
static Random generator = new Random(); 
static Scanner input = new Scanner(System.in); 
static String word; 
static int attempts = 0; 
static StringBuilder sb = new StringBuilder(); 

public static void main(String[] args){ 

    word = words[generator.nextInt(words.length)]; 
    System.out.print("HANGMAN\nTry and guess the word, you have 9 attempts: \n"); 
    printAstrick(); 

    while(attempts <= 9){ 
     System.out.print("\nGuess a letter: "); 
     guess = input.next().charAt(0); 
     findMatch(guess); 

    }  
    if(attempts == 9){ 
     System.out.println("Your attempts are up"); 
     } 
} 

public static void findMatch(char c){ 
    for(int i = 0; i < word.length(); i++){ 
      if(word.charAt(i) == c){ 
       correct[i] = c; 
       sb.setCharAt(i, c); 
       System.out.print(sb.toString()); 

      } 
      else if(word.charAt(i) != c){ 
       wrong[i] = c; 
       sb.setCharAt(i, '*'); 
       System.out.print(sb.toString()); 

      } 

     } 
    attempts++; 
} 

public static void printAstrick(){ 
    for(int i = 0; i < word.length(); i++){ 
     sb.append("*"); 
     System.out.print(sb.toString()); 
    } 

} 
+1

FYI【如何實現只用5行代碼在java中的劊子手(https://stackoverflow.com/a/22269413/256196) – Bohemian

+0

它不是「好「代碼,因爲它不易讀;這更像是一種好奇心,就像代碼高爾夫一樣。您可能能夠簡化代碼中的某些部分,例如您所問的部分,在我的版本中,該部分從完整的單詞開始,用星號(簡單)替換*未經猜測的*字母,而不是代碼已知字母(複雜)。 – Bohemian

+0

我明白了。我只是想知道它是如何工作的。 –

回答

1

您將要覆蓋所有正確的猜測這一行。

此外,您的打印語句爲for循環,因此每個字都打印出來n次。通過將您的呼叫移至for環路以外的System.out.print(sb.toString())來解決此問題。

這留給你:

public static void findMatch(char c) { 
    for (int i = 0; i < word.length(); i++) { 
     if (word.charAt(i) == c) { 
      correct[i] = c; 
      sb.setCharAt(i, c); 
     } else if (word.charAt(i) != c) { 
      wrong[i] = c; 
     } 
    } 
    System.out.print(sb.toString()); 
    attempts++; 
} 

public static void printAstrick() { 
    for (int i = 0; i < word.length(); i++) { 
     sb.append("*"); 
    } 
    System.out.print(sb.toString()); 
} 
相關問題