0

ターンごとに「X」と「O」を交互に切り替える必要があるだけですが、Xしか表示されません。

import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.*;
public class tictactoe {
    public static final int FRAME_WIDTH = 700;
    public static final int FRAME_HEIGHT = 200;
    public static void main(String[] args)          
    {
        int slots = 9;

        final JButton[] gameButton = new JButton[9];

        JPanel ticTacToeBoard = new JPanel();
        ticTacToeBoard.setLayout(new GridLayout(3, 3));
        JButton clearButtons = new JButton("New Game");
        for (int i = 0; i < slots; i++)
        {
            gameButton[i] = new JButton();
            ticTacToeBoard.add(gameButton[i]);
            final int countTurns = i;

            gameButton[i].addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Object clicked = e.getSource();
                    int turns = 1;
                    for (int p = 0; p < 9; p++)
                    {
                        if(clicked == gameButton[countTurns] && turns < 10)
                        {
                            if (!(turns % 2 == 0))
                            {
                                ((JButton)e.getSource()).setText("X");
                                turns++;
                            }
                            else
                            {
                                ((JButton)e.getSource()).setText("O");
                                turns++;
                            }
                        }
                    }
                }
            });

            final int integerHack = i; 

            clearButtons.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    gameButton[integerHack].setText("");
                }
            });
        }
        JButton exit = new JButton("Exit");
        exit.setActionCommand("EXIT");
        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (cmd == "EXIT")
                {
                    System.exit(FRAME_WIDTH);
                }
            }
        });

        JPanel rightPanel = new JPanel();
        JLabel wonLabel = new JLabel();
        rightPanel.setLayout(new GridLayout(1, 3));
        rightPanel.add(wonLabel);
        rightPanel.add(clearButtons);
        rightPanel.add(exit);
        JFrame mainFrame = new JFrame();
        mainFrame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        mainFrame.setVisible(true);
        mainFrame.setLayout(new GridLayout(1,2));
        mainFrame.add(ticTacToeBoard);
        mainFrame.add(rightPanel);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
4

4 に答える 4

0

あなたのactionPerformed方法を見てください。クリックが発生するたびに、1 に設定turnsします。その結果、!(turns % 2 == 0)は常に true と評価され、常に X を描画します。

于 2012-07-16T23:23:31.470 に答える
0

まず、他の人も言っているように、「ターン」をすべてのループの外で初期化する必要があります。

次に、タイプミスを指摘したいと思います。

            if(clicked == gameButton[countTurns] && turns < 10)

する必要があります

            if(clicked == gameButton[p] && turns < 10)

...ボタンがクリックされるたびに、各ボタンのテキストを X から O に 9 回変更したい場合を除きます。

しかし、そのタイプミスを修正しても意味がありません。特定のボタンが何であるかは問題ではないのに、特定のボタンを見つけるためにループスルーするのはなぜですか? いずれにせよ、すべてのボタンには同じアクション ハンドラがあり、毎回 9 つの同一のコピーを作成しているため、9 つの個別のコピーしかありません。

代わりに、すべてのボタンが同じことを行うため、すべてのボタンに対して 1 つのアクション ハンドラーを用意する必要があります。それがどのように行われるかわからない場合は、ボタン作成ループの外で作成して変数に割り当て、各ボタンのアクションハンドラーを割り当てるときにその変数に入れます。

 gameButton[i].addActionListener(myActionListener);
于 2012-07-17T00:06:44.927 に答える
0

コードをざっと見てみると、変数がすべてのオブジェクトturnでローカルであるためだと思います。ActionListenerしたがって、turn変数は常に 1 であり、常に最初の if ケースに遭遇します。したがって、メソッドturnでコールバックを取得するとすぐに、変数は常にスタック上で再作成されますactionPerformed。簡単な修正とテストのために、ターン変数をtictactoeクラスに入れてみて、それが役立つかどうかを確認してください。

于 2012-07-16T23:25:22.393 に答える
0

問題は、actionPerformed の turn 変数にあります。それを追跡したい場合は、メソッドからそれを移動する必要があります。

于 2012-07-16T23:26:26.933 に答える