2

ここに画像の説明を入力してください

ハングマンプログラムに関して非常に具体的な質問があります。

私が抱えている問題を理解するために、プログラムを自分で実行することをお勧めします。

この問題は、カウンター(間違った数の推測を保持する変数)が6に達したときに発生します。この時点で、ユーザーは割り当てられた推測をすべて使い果たし、再度プレイするオプションが与えられます。ユーザーが再度再生することを選択した場合、askQuestionメソッドが呼び出されます。このメソッドでは、JOptionPaneが、推測される新しい単語となる文字列をユーザーから取得します。

ユーザーが単語を入力して[OK]をクリックすると、何らかの理由でJOptionPaneがパネルにペイントされます。

これが私が抱えている問題です。推測で手紙を提出すると消えますが、存在している間は非常に見苦しいエラーです。上記のスクリーンショットを含めました。これが私のコードです:

//********************************************************
//  HangmanPanel.java        
//
//  Creates your run-of-the mill hangman game.
//********************************************************

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class HangmanPanel extends JPanel
{

private JLabel inputLabel;    // Input field for letter guesses
private String word;          // Variable to hold answer word 
private String guessed = "Guessed: ";  // Holds letters already guessed
private String l, text = "";  // l: Variable to hold letter guess; text: Tells user whether their guess was correct
private JTextField letter;    // Text Field for Input Label
private int counter = 0;      // Incremented when wrong guess is made; controls drawing of hangman
private String underscore = "";    // Shows answer as sequence of underscores, which are replaced with correct guesses
private boolean playing = true;

//------------------------------------------
//  Sets up the hangman panel.
//------------------------------------------
public HangmanPanel()
{
    setBackground (Color.white);
    setPreferredSize (new Dimension(300, 300));
    askQuestion();

    inputLabel = new JLabel ("Enter a letter.");
    add (inputLabel);


    letter = new JTextField (1); 
    add (letter);
    letter.addActionListener(new TempListener());
}
public void askQuestion()
{
    word = JOptionPane.showInputDialog ("Enter the word.");
    for (int i = 0; i < word.length(); i++)
    {
        underscore += "-";    
    }

    repaint();
}
//----------------------------------
//  Paints a hanging man.
//----------------------------------
public void paintComponent (java.awt.Graphics page)
{

    super.paintComponent (page);

    final int xBound = 200, yBound = 20;

    if (playing)
    {
        page.setColor (Color.black);

        page.fillRect(xBound + 30, yBound + 80, 60, 10); // Stand
        page.fillRect (xBound +55, yBound, 10, 80); // Gallows Pole
        page.fillRect(xBound + 25, yBound, 40, 5);
        page.fillRect(xBound + 25, yBound, 3, 20); // Rope

        if (counter > 0)
        page.fillOval(xBound + 18, yBound + 15, 16, 16); // Head
        if (counter > 1)
        page.fillRect(xBound + 24, yBound + 23, 5, 30); // Torso
        if (counter > 2)
        page.drawLine(xBound + 23, yBound + 40, xBound + 13, yBound + 30); // Right Arm
        if (counter > 3)
        page.drawLine(xBound + 29, yBound + 40, xBound + 39, yBound + 30); // Left Arm
        if (counter > 4)
        page.drawLine(xBound + 23, yBound + 53, xBound + 18, yBound + 63); // Right Leg
        if (counter > 5)
        {
            page.drawLine(xBound + 29, yBound + 53, xBound + 34, yBound + 63); // Left Leg
            text = "";
            counter=0;
            underscore = "";
            guessed = "Guessed: ";

           //page.drawString("Play Again?", 50, 130);
            int again = JOptionPane.showConfirmDialog (null, "Do Another?");
            if (again == JOptionPane.YES_OPTION)
                askQuestion();
            else 
                playing = false;



        }

        page.drawString(guessed, 20, 130);

        page.drawString(underscore, 20, 110);

        page.drawString(text, 20, 250);

    }
    else
        page.drawString("Goodbye", 50, 50);
}

private class TempListener implements ActionListener
{
    public void actionPerformed (ActionEvent event)
    {
        l = letter.getText();     // Stores letter guess as a string
        letter.setText("");       // Clears Text Field
        char let = l.charAt(0);   // Creates a char variable for letter guess
        guessed = guessed + let + " ";

        int index = word.indexOf(let);
        if (index != -1)
        {
            text = "Correct";
            underscore = underscore.substring(0,index) + word.substring(index, index+1) + underscore.substring(index+1); // Replaces underscore with found letter
            String substring = word.substring(index+1);
            int index2 = substring.indexOf(let);

            while (substring.indexOf(let) != -1)
            {
                index2 = substring.indexOf(let);
                index = index + index2 + 1;
                underscore = underscore.substring(0,index) + word.substring(index, index+1) + underscore.substring(index+1);
                substring = word.substring(index+1);
            }
        }
        else
        {
            text = "Wrong";
            counter++;
        }
        if (underscore.indexOf('-') == -1)
        {
            text = "You Win!";
            //askQuestion
        }


        repaint();

    }

}

}

これがHangmanFrameクラスです。それは私の質問とは関係ありません、私はプログラムを実行したい人のためだけにそれを含めます:

import javax.swing.JFrame;

public class HangmanFrame
{
    //----------------------------------------------
    //  Creates the main frame of the program.
    //----------------------------------------------
    public static void main (String[] args)
{
    JFrame frame = new JFrame ("Hangman");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    HangmanPanel panel = new HangmanPanel();

    frame.getContentPane().add(panel);
    frame.pack();
    frame.setVisible(true);

}

}

そして、これが私の検索クラスです。これも私の質問とは直接関係ありません。

public class Search{
    public static Comparable linearSearch (String word, String letter, int start)
    {

        while (!found && index < word.length())
        {
            if (word.charAt(index) == letter.charAt(0))
                found = true;
            else
                index++;
        }
        if (found)
            return index;
        else
            return null;

    }
}

そこのフォーマットの問題をお詫びします、私は最善を尽くしました。とにかく、誰かが私を正しい方向に向けてくれることを願っています。問題はrepaint()を呼び出すことで修正できると思いますが、私はそうすることができませんでした。また、このプログラムには明らかに他にも多くの欠陥があることにも言及したいと思います。堅牢にはほど遠いです。それはまだ終わっていないからです。これらの問題に注意を向ける必要はありません。このバグを整理した後、これらの問題に取り組みます。これを見てくれてありがとう!編集:私の問題は修正されましたが、私の元のコードが機能しなかった理由を誰かが正確に解明できるかどうかを確認するために、しばらくの間これを開いたままにしておきたいと思います。

4

1 に答える 1

3

JOptionPane.showConfirmDialog問題は、メソッドで表示するという事実に関連している可能性がありますpaintComponent。このメソッドは、コンポーネントのペイントを担当します。そのメソッドにプログラムロジックを入れないでください。ペイント操作は、パフォーマンスとユーザーエクスペリエンスを向上させるために、高速で最適化する必要があります。このメソッドからモーダルダイアログをポップアップすることはお勧めできません。さらに、このメソッドがいつ呼び出されるかを制御することはできません。呼び出しrepaint()は、コンポーネントの更新要求のみをスケジュールします。

詳細と例については、カスタムペイントの実行チュートリアルをご覧くださいAWTとSwingでのPaintingもご覧ください。

于 2012-10-03T04:36:35.137 に答える