2017-10-07 5 views
-1

私はStringBuilderを使用して、推測する単語の文字ごとに*を付けています。次にユーザーが文字/ charを正しく推測すると、StringBuilderは特定のインデックスの文字を*から推測された文字/ charに変更する必要があります。次に、新しいStringBuilderを印刷して、このような正しい文字を表示します(ho * s *)。推測が間違っている場合は、単にStringBuilderを印刷し、間違った推測をしてください。私の出力が2回印刷されている理由と、StringBuilderのスワップ文字の相違を見つけることができません。

これはなぜ正しく動作していないのか理解しようとしています。私のような出力を取得しています:(マイナス/それは投稿しないのと同じ*)

ハングマン

試してみて、単語を推測、あなたは9つの試みがあります

/******を*********

手紙を推測:G

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

文字を推測する:p

P **** P **** P **** P **** P ****

はまた、複数回の単語を印刷していると私は手紙

をゲス理由は分かりません。

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

[コードの唯一の5行を使用してJavaで絞首刑を実装する方法](https://stackoverflow.com/a/22269413/256196) – Bohemian

+0

それは「良いではありません"コードは読みにくいので、コードゴルフのような好奇心です。私のバージョンでは、完全な単語で始まり、あなたのコードではなく、あなたのコードではなく、(単純な)*類義語ではない*文字を置き換える、あなたのコードの特定の部分を簡略化することができるかもしれません知られている手紙(複雑)。 – Bohemian

+0

私は理解しています。私はちょうどそれがどのように動作するか知りたい。 –

答えて

1

あなたはこのラインを持つ任意の正しい推測上書きされます:あなたはそれを削除する必要がありますのでごfindMatch方法で

sb.setCharAt(i, '*'); 

を。

また、印刷文はそれぞれforループにあり、各単語が印刷されるので、n回です。これを修正するには、ループの外にSystem.out.print(sb.toString())に移動します。

これはであなたを残します:FYI

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()); 
} 
関連する問題