1

JOptionPane を使用してユーザーの推測を取得するハングマン エンジンがありますが、テキスト フィールドを使用して GUI を実装しているため、エンジンを停止してテキスト フィールドからユーザーの推測を取得する方法が必要です。 MVCを使用して、テキストフィールドからのデータがメイン/コントローラークラスに送信される瞬間に、データがメインクラスの変数にロードされた後-そのデータをエンジンに統合する際に問題が発生し始めます

エンジンに待機を追加することが最善かどうかはわかりませんが、それが私が本当に考えることができるすべてです。

これが私のエンジンクラスです:

public class engine {
    char [] charda = new char[20];
    char [] charwo = new char[20];
    Highscore words = new Highscore();
    main mn = new main();
    int guesses =7;
    char guess;

    public engine() {
    }

    public void enginer(){

        int count = 0;
        String word = words.getWord();

        for (int i = 0; i<word.length(); i++)
        {
            //instantiates two arrays one of dahses and one with the word
            charwo[count] = word.charAt(i);
            charda[count]= '_';
            count++;
        }

        for (int l=0; l<count; l++)
        {
            System.out.print(" "+charda[l]);
        }

        while (guesses != 0 && !Arrays.equals(charwo, charda))
        {
            System.out.println("");
            guess = JOptionPane.showInputDialog("enter a Guess").charAt(0);

            if (word.toUpperCase().contains(String.valueOf(guess).toUpperCase()))
            {
                for (int k = 0; k<word.length(); k++)
                {
                    if (String.valueOf(guess)
                            .toUpperCase()
                            .equals( String.valueOf(charwo[k]).toUpperCase() ))
                    {
                        charda[k]=charwo[k];

                        for(int l=0; l<count; l++)
                        { // prints dashes here to avoid a letter being 
                          // chopped off by the program stopping in the middle
                            System.out.print(" "+charda[l]);

                        }
                    }
                }
            }
            else
            {
                guesses = guesses-1;
                System.out.println("guesses left "+guesses);
                //
                //Re-displays dashes 
                for (int l=0; l<count; l++)
                {
                    System.out.print(" "+charda[l]);
                }
            }

            if (Arrays.equals(charwo, charda))
            {
                System.out.println("");
                System.out.println("You are Winner");

            }
        }
    }
}

これは、ボタンのクリックを処理するメイン クラスの一部です。

public void buttonClicked ()
{
    gameplay gp = new gameplay(); 
    engine en  = new engine();

    en.guess = gp.getInput; // this is where I try send the input from the text field to the engine
    en.enginer(); 

    System.out.println("button clicked"); 
}

私は現時点で本当に迷っているので、正しい方向へのうなずきさえも本当に役に立ちます:)

4

1 に答える 1

4

wait/notify通常、組み込みの Java メカニズムを使用して待機を実装できます。

この問題を説明するチュートリアルはたくさんありますが、ここでは非常に簡単に説明します。

Java の各クラスは、java.lang.Objectメソッドwait()notify(). Wait はnotify()、同じオブジェクトで呼び出されるまで現在のスレッドを中断します。wait()呼び出しに使用され、 monitornotify()と呼ばれるオブジェクト。Java スレッド管理の規則に従って、両方のメソッドをブロックから呼び出す必要があります。synchronized

synchronized(obj) {
    obj.wait();
}

あなたの質問に対する答えは簡単です。両方のポイントから見える監視オブジェクトを定義します (待機する必要があるコードと、最初のスレッドを続行するようにトリガーするコードを意味します)。

次のように待機を実装します。

synchronized(obj) {
    obj.wait();
}

クリックボタンを使用する場合(終了するまで待機する場合)、コードを呼び出す必要があります。

synchronized(obj) {
    obj.notify();
}

それでおしまい。waitタイムアウトありのバージョンとありますので注意してnotifyAll()ください。そして、私見はJavaスレッド、同期などを学ぶのに時間がかかります。それは楽しいです。幸運を。

于 2013-08-27T08:59:39.253 に答える