-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());
}
}
FYI【如何實現只用5行代碼在java中的劊子手(https://stackoverflow.com/a/22269413/256196) – Bohemian
它不是「好「代碼,因爲它不易讀;這更像是一種好奇心,就像代碼高爾夫一樣。您可能能夠簡化代碼中的某些部分,例如您所問的部分,在我的版本中,該部分從完整的單詞開始,用星號(簡單)替換*未經猜測的*字母,而不是代碼已知字母(複雜)。 – Bohemian
我明白了。我只是想知道它是如何工作的。 –