1

私はチェスゲームのGUIに取り組んでおり、一連のクリックをチェックする方法があるかどうか疑問に思っていました。たとえば、ユーザーがjPanelをクリックしてから、ユーザーが有効な移動配列に存在する別のjPanelをクリックします。変数を使用して「isSquareClicked=true」などの状態を格納できることはわかっていますが、それが唯一の方法でない限り、使用したくありません...

4

3 に答える 3

2

JPanels の使用に問題はありません。これが私の実装です:

最初の ChessSquare は、ボード上の 1 つのセルを表します。

public class ChessSquare extends JPanel{
    int x,y;

    public ChessSquare(int x, int y){
        super();
        this.setPreferredSize(new Dimension(50,50));
        this.setBorder(BorderFactory.createLineBorder(Color.black));
        this.x = x;
        this.y = y;
    }
}

メインボードパネル:

public class ChessPanel extends JPanel{
    JPanel positions[][] = new JPanel[8][8];
    ChessSquare move[] = new ChessSquare[2];

    public ChessPanel(){
        initComponents();
    }

    private void initComponents(){
        setLayout(new GridLayout(8,8));

        for(int i=0;i<positions.length;i++){
            for(int j=0;j<positions[i].length;j++){
                ChessSquare square = new ChessSquare(i,j);
                square.addMouseListener(new MouseListener(){
                    public void mouseClicked(MouseEvent me) {
                        ChessSquare cs = (ChessSquare)me.getComponent();
                        if(isValidMove(cs)){

                            System.out.println("Valid move!");
                            System.out.println("x1: "+move[0].x+" y1: "+move[0].y);
                            System.out.println("x2: "+move[1].x+" y2: "+move[1].y);
                            System.out.println("");

                            resetMove();
                        }
                    }

                    //Other mouse events

                });
                positions[i][j] = square;
                add(square);
            }
        }
    }

    private boolean isValidMove(ChessSquare square){
        //here you would check if the move is valid.
        if(move[0] == null){
            move[0] = square;
            return false; //first click
        }else{
            move[1] = square;
        }

        //Other chess rules go here...
        return true;
    }

    private void resetMove(){
        move = new ChessSquare[2];
    }
}

ボードを表す JPanel マトリックスと、現在の動きを表す ChessSquare 配列を保持します。ではisValidMove()、現在の移動が完了したかどうかを確認します (両方の四角形がクリックされているため、移動配列には既に 1 つの要素があります)。移動が完了したら、移動をリセットして、最初からやり直します。

于 2010-02-20T23:34:47.110 に答える
1

私が知っているように、Javaにはそのようなものはありません。

しかし:

1) 私が理解しているように、ゲーム用のフィールドを作成するために 8x8 JPanels のフィールドを使用しますか? 私見これは悪い方法です。私があなただったら、フィールドを作成するために 1 つのパネルを使用します - その上にすべて (セル、図など) をペイントします。これはよりシンプルで、作成が速く、操作が簡単です。

2) 質問に戻ります。フィールド用のパネルが 1 つある場合は、最初にクリックした場所と 2 番目にクリックした場所の 2 組の座標を覚えておくだけで済みます。あなたの場合-クリックされたパネル上の2つのポインターで十分です。;)

この助けを願っています:)

于 2010-02-20T19:34:59.233 に答える
1

imp に同意します。単一の JPanel を使用して、その 1 つのパネルにすべてを描画することをお勧めします。

そうは言っても、誰かがすでに 8x8 JPanel を使用してチェス盤を実装していて、それを使用するように言われた場合、8x8 JPanel を JLayeredPane に配置し、すべての上に単一の透過 JPanel を配置して、すべてのマウス クリックを処理することを試みる かもしれません。

それでも、そのアプローチでは、どのセルがクリックされているかを把握するためにポイント演算を行う必要があります.8x8 JPanels を使用するポイントは、そもそもそのような演算を避けたいということだったと思います。

于 2010-02-20T22:36:37.727 に答える