0

私は学校で取り組んでいるハングマンプログラムを持っていますが、ユーザーが間違った文字を推測したときに正しく印刷するための間違った推測の数を取得できません。これまでに取得したコードは次のとおりです。ヒントをいただければ幸いです。

import java.util.Scanner;

public class HangmanTest {
    public static void main(String[] args) {

        String[] wordBank = { "madelynn", "crystal", "mcbride", "daughter",
                "adorable", "beautiful", "andrew", "programming", "alyssa",
                "computers", "mcbreezy", "maddy", "happy", "vacation", "beach",
                "java", "benefical", "military", "veteran", "standale",
                "lions", "tigers", "redwings", "pistons", "michigan",
                "football", "baseball", "hockey", "basketball", "golf" };
        int minimum = 0;
        int maximum = wordBank.length - 1;
        String again;

        do {
            int choice = minimum + (int) (Math.random() * maximum);

            String word = wordBank[choice];

            // Converts the random word to asterix
            String userWord = "";
            for (int i = 0; i < word.length(); i++) {
                userWord += "*";
            }

            // Breaks into a bunch of characters
            char[] userWordCh = userWord.toCharArray();

            // Show the random word
            System.out.println("The word for you to guess is " + userWord);

            // instantiate a scanner object
            Scanner input = new Scanner(System.in);

            int size = word.length();
            int rightGuesses = 0;
            int wrongGuesses = 0;

            while (size != rightGuesses) {
                System.out.println("Enter a character: ");
                String response = input.next();
                char ch = response.charAt(0);

                char[] wordChars = word.toCharArray();

                for (int i = 0; i < word.length(); i++) {
                    if (wordChars[i] == ch) {
                        userWordCh[i] = ch;
                        ++rightGuesses;
                    } else {
                        ++wrongGuesses;
                    }
                } // end of for loop

                System.out.print("The word is: ");
                for (int j = 0; j < userWordCh.length; j++)
                    System.out.print(userWordCh[j]);

                System.out.println();
            } // end of while loop

            System.out.println("You had " + wrongGuesses + " wrong guesses.");

            System.out.println("Would you like to play again y/n: ");
            again = input.next();

        } while (again.equals("y"));

    }
}
4

4 に答える 4

2
for (int i = 0; i < word.length(); i++) {
    if (wordChars[i] == ch) {
        userWordCh[i] = ch;
        ++rightGuesses;
    } else {
        ++wrongGuesses;
    }
} // end of for loop

このループでは、推測が単語​​内の文字と一致するたびに rightGuesses を 1 ずつ増やし、推測が単語​​内の文字と一致しないたびに wrongGueeses を 1 ずつ増やします。ご想像のとおり、これにより、1 回だけインクリメントする必要がある場合に、文字数と同じ数だけインクリメントされる数値が集合的に発生します。

次のようなものを試してください:

boolean foundMatch = false;
for (int i = 0; i < word.length(); i++) {
    if (wordChars[i] == ch) {
        userWordCh[i] = ch;
        if (!foundMatch)
        {
            ++rightGuesses;
            foundMatch = true;
        }
    }
}
if (!foundMatch)
{
    ++wrongGuesses;
}
// end of for loop

ここで、rightGuesses と wrongGuesses の 1 つだけをインクリメントします。rightGuesses は、一致が見つからない場合にのみインクリメントできます (見つかった一致を true に設定します)。

于 2013-02-06T21:40:22.083 に答える
0

私はここで推測していますが、これは間違っているかもしれないと思います:

for (int i = 0; i < word.length(); i++) {
     if (wordChars[i] == ch) {
         userWordCh[i] = ch;
         ++rightGuesses;
     } else {
         ++wrongGuesses;
     }
} // end of for loop

これにより、入力された文字に一致する/一致しない単語内の各文字の変数rightGuessesと変数がインクリメントされます。wrongGuesses代わりに、文字が「一致」したときにフラグを設定し、最後にそのフラグをチェックして更新する必要がrightGuessesありwrongGuessesます。

于 2013-02-06T21:41:00.023 に答える
0

問題は for ループにあります。各文字を反復処理しており、一致しないすべての文字について、間違った推測としてマークします。どの文字も正しくない場合にのみ、不正解とマークする必要があります。さらに、まだマークしていない場合にのみ、右にマークする必要があります。

import java.util.Scanner;
import java.util.ArrayList;

public class HangmanTest {
    public static void main(String[] args) {

        String[] wordBank = { "madelynn", "crystal", "mcbride", "daughter",
                "adorable", "beautiful", "andrew", "programming", "alyssa",
                "computers", "mcbreezy", "maddy", "happy", "vacation", "beach",
                "java", "benefical", "military", "veteran", "standale",
                "lions", "tigers", "redwings", "pistons", "michigan",
                "football", "baseball", "hockey", "basketball", "golf" };
        int minimum = 0;
        int maximum = wordBank.length - 1;
        String again;

        do {
            int choice = minimum + (int) (Math.random() * maximum);

            String word = wordBank[choice];

            // Converts the random word to asterix
            String userWord = "";
            for (int i = 0; i < word.length(); i++) {
                userWord += "*";

            }

            String guessedLetters="";
            // Breaks into a bunch of characters
            char[] userWordCh = userWord.toCharArray();

            // Show the random word
            System.out.println("The word for you to guess is " + userWord);

            // instantiate a scanner object
            Scanner input = new Scanner(System.in);

            int size = word.length();
            int rightGuesses = 0;
            int wrongGuesses = 0;
            boolean foundLetter;
            char[] wordChars = word.toCharArray();

            guessLoop:
            while (size != rightGuesses) {
                System.out.println("Enter a character: ");
                String response = input.next();
                char ch = response.charAt(0);


                foundLetter=false;
                for (int i=0;i<guessedLetters.size();i++){
                    if (ch == guessedLetters.charAt(i)){
                         System.out.println("Already guessed that letter!");
                         continue guessLoop;
                    }
                }

                guessedLetters+=response;
                for (int i = 0; i < word.length(); i++) {
                    if (wordChars[i] == ch) {
                           foundLetter=true;
                           userWordCh[i] = ch;
                           ++rightGuesses;                            
                    } 
                } // end of for loop
                if(!foundLetter)
                     ++wrongGuesses;
                System.out.print("The word is: ");
                for (int j = 0; j < userWordCh.length; j++)
                    System.out.print(userWordCh[j]);

                System.out.println();
            } // end of while loop

            System.out.println("You had " + wrongGuesses + " wrong guesses.");

            System.out.println("Would you like to play again y/n: ");
            again = input.next();

        } while (again.equals("y"));

    }
}
于 2013-02-06T21:41:08.070 に答える
0
for (int i = 0; i < word.length(); i++) {
                if (wordChars[i] == ch) {
                    userWordCh[i] = ch;
                    ++rightGuesses;
                } else {
                    ++wrongGuesses;
                }
            } // end of for loop

この for ループは、文字が単語内にあるにもかかわらず間違った推測であると言うため、間違った推測で問題を引き起こしています。できるオプションは、文字が見つかったときに true に切り替えられるブール値を持つことです。そうすれば、for ループを終了するときに、その値が true かどうかを確認できます。そうでない場合は、間違った推測を増やします。

于 2013-02-06T21:43:06.730 に答える