0

私はカードゲームを持っており、これは ArrayLists を使用してカードを人々の手に保存することに基づいています。メインクラスでInvokeLaterを使用して呼び出されたスレッドを使用して、ゲームをプレイし、GUIクラスを更新するメインメソッドがあります

現時点では、コンソールでゲームをプレイし、スキャナーに int を入力して、プレーヤーの手からカードを選択しています。私がやりたいことは、プレーヤーが選択をしなければならないときに実行されるスレッドを、おそらく呼び出しと待機で実行することです。次に、プレーヤーが GUI で対応するカードをクリックし、カードの場所の適切な int を返すのを待ちます。この選択は、ゲームによって処理されます。

現時点で GUI をどのように更新しているか。

      public static void Play(ArrayList<Card> ...){
        UpdateHand(player1, deck, deckused);

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI.getInstance().UpdateHand();

            }
        });

リスナーをカードにアタッチし、その名前を手札の対応する場所の int に設定します。

   public void PlayerSelection()
    {
        selection = -1;
        Information = new JLabel("Please Select Your Card");
        ButtonDisplay.add(Information);
        ButtonDisplay.updateUI();
        for (int i = 0; i < (HumanHand.size()); i++)
           {
               Card card = HumanHand.get(i);

               BufferedImage cardImage = null;

                try {

                    cardImage = ImageIO.read(new File("card/" + card + ".jpg"));
                    } catch (IOException e) {
            // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    JLabel picLabel = new JLabel(new ImageIcon( cardImage ));
                    String name = "" + i;
                    picLabel.setName(name);
                    picLabel.addMouseListener((MouseListener) this);
                    HumanHandDisplay.add(picLabel);
           }
    }   

マウスがクリックされたときの選択のためにintを保存します。

    public void mouseClicked(MouseEvent e) {
        String name = ((JLabel)e.getSource()).getName();
        System.out.println("Working " + name);
        selection = Integer.parseInt(name);         
    }

この int をメイン クラスの Play() メソッドに戻し、残りの計算で使用したいと考えています。これを行う方法がわかりません。具体的には、選択が行われるのを待っています。これができると聞いたことがありますが、これを自分の仕事に実装する方法がわかりません。誰かがそれを助けることができれば、それは素晴らしいことです.

4

2 に答える 2

2

いいえ、ここでスレッドなどを一時停止したくありません。代わりに、ユーザーがプログラム内のどこにいるかに応じてプログラムの状態を変更し、ユーザーの応答に応じて、プログラムの動作はその状態に応じて異なります。

たとえば、ユーザーがカードをプレイするのをユーザーが待つ必要がある場合は、メイン クラスに currentPlayer 変数を指定し、ユーザーの番になったときにそれをユーザーに割り当てます。次に、自分の順番に適切な有効な入力以外のユーザー入力に応答しないように、プログラムをコーディングします。

次に、メインの GameEngine クラスが currentPlayer 変数を次のプレイヤーに進め、その応答を待ちます。

編集1
あなたは次のように述べています:

本当に理解しているかどうかわかりません。私はすでにゲームを実装しており、対戦するすべてのルールと AI プレーヤーは、今のところコンソールで実行しています。スキャナーを使用して選択を行っている場所を GUI に拡張して、Mouse Clicked イベントを待機する必要があるだけです。

コンソール ベースの線形プログラムから GUIイベントベースのプログラムに移行するという大きな移行を行っていることを理解してください。重要なのは、新しいプログラムがイベント ベースであるということです。現在のコードが適切に動作する OOP 準拠のクラス、最小限の静的変数とメソッド、および適切に定義された状態を持つクラスで記述されている場合、移行はスムーズに進むはずです。一方、現在のコード ベースに少数のクラスしかなく、そのほとんどがリニア コンソール ユーザー インターフェイスに集中している場合は、コードを最初から書き直す必要があるかもしれません。

現在のコードの一部を見せて、その設計について説明したい場合があります。

次に次のように述べます。

プログラムがint以外に応答しないようにするにはどうすればよいですか?

プログラムがintにのみ応答するという意味を明確にしてください。int どこ?JTextField で? 何処か別の場所?これには、ある種の入力検証が必要になる可能性が高いと思います。

于 2012-04-16T01:39:14.503 に答える
0

あなたが望むのはカスタムコンポーネントのモダリティであり、それは Swing では不可能です (少なくとも、独自のモダリティを実装するための多くの努力が必要です)。@Hovercraftの回答と同じように、プログラムには状態があり、イベントベースである必要があります。

于 2012-04-16T08:11:38.803 に答える