-3

だから私は Java クラスの絞首刑執行人ゲームを作成していますが、単語のアンダースコアを文字に置き換えるのに問題があります。次のようなアンダースコアで単語を出力するようにしました。

     for(int i = 0; i < GuessWord.length(); i++) { 
                if (guesses[GuessWord.charAt(i) - 'a']) { 
                    mainword.append(words[i].charAt(i));
                }
                else {
                    mainword.append("_");

                }
                mainword.append(" ");
            }

残りは私のコードの残りです。私は Netbeans IDE 7.2 で作業しており、System.out.print ではなく JLayeredPane を使用してすべてを表示していることに言及する必要があります。ありがとう!

    import java.util.Random;
    import java.util.Scanner;
    import javax.swing.JOptionPane;

    public class MainFrame extends javax.swing.JFrame {

        public MainFrame() {
            initComponents();
        }

    //declare variables                      
    static String SecretWord = "";
    static String Letters = "";
    double Result = 0;
    String SetMain = null;
    StringBuilder mainword = new StringBuilder();
    StringBuilder gletters = new StringBuilder();
    boolean[] guesses = new boolean[26];
    String[] words = {"technology", "computer", "camera", "graphic design", "digital", "media", "technician", "photography", "troubleshoot", "pixels", "application", "download"};
    Random r = new Random();
    int randvalue = r.nextInt(11);
    String GuessWord = words[randvalue];


        private void GoButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
    mainword.append(SecretWord);
    //make word in underscore form
        for(int i = 0; i < GuessWord.length(); i++) { 
                if (guesses[GuessWord.charAt(i) - 'a']) { 
                    mainword.append(words[i].charAt(i));
                }
                else {
                    mainword.append("_");

                }
                mainword.append(" ");
            }

   //put in label
   SetMain = mainword.toString();
   WordLabel.setText(SetMain);
   GuessButton.setEnabled(true);
   GoButton.setEnabled(false);
}                           


private void GuessButtonActionPerformed(java.awt.event.ActionEvent evt) {                                      
    //declare variables      
    String strGuess = GuessText.getText();
    String SetMain = null;
    String GuessedLetters = null;
    Result = 1;//(int)(Math.random() * 11) + 1;
    int errors = 0;
    int i = 0;
    char guess2 = strGuess.charAt(i);
    gletters.append(Letters);

    //*******MAJOR PROBLEM AREA FOCUS HERE*******
    do{
        //replace underscore with guessed letter
        for(i = 0; i < GuessWord.length(); i++) { 
                if (GuessWord.charAt(i) == guess2) { 
                   mainword.replace(0,i,strGuess.toUpperCase()); 
                }
                else {
                    mainword.append("_");

                }
                mainword.append(" ");
            }

    //put in labels
    SetMain = mainword.toString();
    GuessedLetters = gletters.toString();
    WordLabel.setText(SetMain);
    GuessedLabel.setText(GuessedLetters);
    GuessText.setText(null);
    GuessText.requestFocusInWindow();
    }//end of do

while(SetMain == null);
if (SetMain.equalsIgnoreCase(GuessWord)){
    //show winning message to user and reset game
    JOptionPane.showMessageDialog(null, "Congrats!");
    GuessButton.setEnabled(false);
    GoButton.setEnabled(true);
    WordLabel.setText(null);
    GuessedLabel.setText(null);
    WinsLabel.setText("1");
}
//if too many errors show lost message
else if (errors >= 5){
    JOptionPane.showMessageDialog(null, "You Lost!");
    GuessButton.setEnabled(false);
    GoButton.setEnabled(true);
    WordLabel.setText(null);
    GuessedLabel.setText(null);
    LossesLabel.setText("1");
}
    }//end of 1GAME
}                                           

どんな助けでも素晴らしいでしょう!複雑すぎないでください。また、上記のコードで主な問題領域がどこにあるかをマークしました。

4

2 に答える 2

0

入力に基づいて変更できる文字の配列を保持する、より単純なアプローチを試してみます。これは、アイデアの全体的な説明です。

char guess[] = {'_', '_', '_', '_', '_', ' ', '_', '_', '_', '_', '_'};
// It's "Hello World" :)
if(input == answer.getCharAt(inputIndex))
    guess[inputIndex] = answer.getCharAt(inputIndex); 
    //replace the underscore with the correct character
else
    //Add it to a list of used characters, ignore it or do as you've been asked to    

あなたの場合、正しい単語を含む文字列がどこにあるかguessを呼び出して、この配列を作成します。を使用して、その文字列内のすべての文字をアンダースコアに置き換える必要があります(元の回答も保持することを忘れないでください)。最初のパラメーターは、「AからZ、aからz、0から9までのすべての文字のグループ」を意味する正規表現です。いくつかの正規表現を調べて慣れてください。信頼してください。 、後でより早くそれらを使用します。answer.toCharArray()answerreplaceAll("[A-Za-z0-9]", "_")

guess[i]次に、推測が正しく行われるたびに置き換える必要がありますanswer.getCharAt(i)。これにより、文字列を文字ごとに作成するという面倒な作業を回避できます。

これは別のアプローチの簡単な説明です。これは、試してみるかどうかを決定できる割り当てであり、一般的な実装はあなた次第です。アイデアについて説明します。

于 2012-11-06T17:39:05.297 に答える
0

ここに別のアプローチがあります。推測されていない文字をプレースホルダーに置き換えようとはしません。ここでは、これまで (セットで) 推測されたすべての文字を記憶し、各ターンの合言葉の「ビュー」を再現します。デモ コードには、アルファベットのすべての文字をランダムに推測する愚かなプレーヤーが含まれています。

public static void main(final String[] args) {

    String secretWord = "fibonacci";
    Set<Character> guessedLetters = new HashSet<>();

    // (1) create some test input (all letters randomized)
    List<Character> chars = new ArrayList<>();
    for (char c = 'a'; c <= 'z'; c++) {
        chars.add(c);
    }
    Collections.shuffle(chars);

    // (2) Let's guess
    for (char guessedLetter : chars) {
        // (3) memorize all letters that have been guessed
        guessedLetters.add(guessedLetter);

        // (4) print the display version of the secret word
        boolean guessedCompletely = true;
        System.out.print("My guess: [" + guessedLetter + "] -> ");
        for (char letterOfSecretWord : secretWord.toCharArray()) {
            if (guessedLetters.contains(letterOfSecretWord)) {
                // (4a) - we already guessed this letter
                System.out.print(letterOfSecretWord);
            } else {
                // (4b) - we haven't guessed it so far
                guessedCompletely = false;
                System.out.print('_');
            }
        }
        System.out.println();
        // (5) check, if the game is won
        if (guessedCompletely) {
            System.out.println("Yeah!");
            break;
        }
    }
}
于 2012-11-06T17:12:15.700 に答える