0

Javaでトランプゲームを作っています。すべてのルールなどを含むゲーム ロジック全体を既にプログラムしており、そのモデルの上に GUI の実装を開始しました。

私は 5 つのクラスを持っていますが、これから話すのは「メイン」またはゲーム クラスと「GUI」クラスだけです。まず、ハンドを作成するために、作成した Object Type < Card > の ArrayLists を使用します。このゲームは、「Play()」メソッドを使用してプレイし、(現時点では) コンソールを介して人間のプレーヤーの手を表示し、ArrayList で整数を選択して配置するように求めることによって機能します。クラス Main に main(String[] args) があり、クラス GUI を呼び出して、使用するゲーム ボードをセットアップします。

     public static void main(String[] args)
     {
        Deck deck = new Deck();     
        ai = new AI;

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI gui = new GUI();
                gui.setVisible(true);
            }
        })

理想的には、Play() メソッドを使用してゲームをプレイし、GUI クラスからメソッドを呼び出して、ボードを更新し、人間のプレイヤーが選択したカードを返すようにしたいと考えています。現時点で私ができる最善のことは、ボードをセットアップするときにボタンを実装することです

   Button go = new Button("Update Hand");
   ButtonDisplay.add(go);

   go.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
                Thread queryThread = new Thread() {
            public void run() {
                 UpdateHand();
            }
            };
                queryThread.start();                      
                        }
        });

その後実行されます

  public void UpdateHand()
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                inPlay = main.inPlay;
                UpdateInPlay(inPlay, InPlayDisplay);
                HumanHand = main.humanplayer;
                HumanHandDisplay.removeAll();

クリックすると、パネルがクリアされ、カード JLabels が再描画されます。

私の質問は、Play() メソッドで GUI クラスのメソッドを呼び出すにはどうすればよいですか? Play() メソッドから UpdateHand() を実行しようとすると、

gui.UpdateHand();

その gui.UpdateHand() 行で NullPointerException を返しますが、ArrayList など、指示すると UpdateHand() メソッド内の変数をコンソールに出力します。先ほど言ったように、GUI にボードを更新するボタンを配置する代わりに、ターン シーケンスをループし、プレイヤーがカードを選択する必要があるときに、Play() メソッドが UpdateMethod を呼び出すようにしたいと考えています。現在使用しているコンソール スキャナーを使用して、ユーザーが選択内容を入力できるようにテキスト フィールドとボタンをボードに追加するメソッドを実行します。これは Play() メソッドに返され、ゲームの計算を続行します。 .

私が間違っていることと、ここで指定したことを達成する方法について誰かが光を当てることができますか?

編集:

要求された 2 つのクラスのコードの詳細

GUI
public class GUI extends JFrame
{
public Main main;
private ArrayList<Card> AIHand;
     public GUI() {

     pane = this.getContentPane();
     pane.setLayout(new GridLayout(6,1,2,2));
     AIBackDisplay = new JPanel();
     //just more of the same for other panels here

     pane.setBackground(Color.GREEN);
     setTitle("Last Man Standing");
     pane.add(AIBackDisplay);
     pane.add(AIHandDisplay);
     pane.add(InPlayDisplay);
     pane.add(HumanHandDisplay);
     pane.add(HumanBackDisplay);
     pane.add(HumanFacedownDisplay);
     pane.add(ButtonDisplay);

       setSize(800, 700);
       setLocationRelativeTo(pane);
       setDefaultCloseOperation(EXIT_ON_CLOSE);


       UpdateFacedown(AIFacedown, AIBackDisplay); //these are methods called for original display
       UpdateFacedown(HumanFacedown, HumanBackDisplay);

次に、ボタンを介して呼び出され、これを行う updateHand() メソッドがあります

                  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 ));
                    HumanHandDisplay.add(picLabel);

                } 

                HumanHandDisplay.updateUI();

私のメインクラスは

public class Main {

    static AI ai;
    public static GUI gui;

GUIは静的でなければならないことがわかりました。そうしないと、GUIを使用して呼び出すことができませんでした

      Scanner sc = new Scanner (System.in);
                choice = sc.nextInt(); //what i'm using now
                //choice = gui.GUIReturn(); //what i'd like to use

GUI が静的であっても、何らかの理由で gui.GUIReturn() を実行できません。静的でなければならないと言っています

4

1 に答える 1

2

これに答えるには、さらに多くのコードが必要になると思います。私には、GUI gui 変数のスコープのような単純なもののように見えます。示した例では、gui のスコープは、作成した Runnable オブジェクトの run メソッド内のみです。

伝統的に、GUI で何かを呼び出す適切な方法は、シングルトン パターンを使用することです。基本的に、それを呼び出しましょう

GUI.getInstance().myMethod();

また、少し関係があり、それが UpdateHand() メソッドの唯一のコードである場合、余分なスレッドは時間の無駄です。

SwingUtilities.invokeLater(new Runnable(){ ... });

Runnable をイベント キューに入れるだけで、その順番が実行されるのを待ちます。したがって、それがメソッドの唯一のものである場合、スレッドはすぐに消えてしまいます。そこにある唯一のコードではないかもしれませんが、ブラケットを終了していないので、メモしておこうと思いました.

最後に、GUI に影響するすべてのこと (一部を除く... ) は、invokeLater で実行する必要があります。そうしないと、コードに含まれていないように見えるため、気が狂ってしまうようなエラーが発生する可能性があります。

于 2012-04-07T01:38:05.420 に答える