OOP设计,Java Swing,国际象棋游戏,instanceof

use*_*871 5 java oop swing instanceof

好的,我正在制作一个简单的java swing国际象棋游戏.这个问题更多的是关于OOP设计然后是Java Swing.

我有以下内容:

  • 我有一个实现JPanel的Panel类.
  • 然后我有一个从我的Panel类扩展的抽象类Piece
  • 然后我有我的课程为不同的片断:Pawn,King,Bishop等从我的Pieces课程延伸

在我的主要ChessGame类中:

  • 我正在使用一个Panel数组来存储我的电路板的布局
  • 因此,数组将存储Panel对象,用于没有碎片的板位.
  • 并且它将存储子类,例如Pawn,Queen,Bishop等(板块放置件)

所以,左上方(0,0)映射到myArray [0] [0]

我的问题是,要检查这个地方是空的还是有棋子,我必须使用:

        if(panels[x][y] instanceof Piece){
            ((Piece)panels[x][y]).makeMove();
        }
Run Code Online (Sandbox Code Playgroud)

我问的是这个可怕的设计?我知道我应该尝试远离实例.什么是更好的方法?

谢谢.

ale*_*lex 0

您必须在画布上绘制棋盘和各个部分,而不是将面板拆分为 8x8 的较小面板。之后,玩家最终将在棋盘上拖动棋子来移动棋子。您还可以在国际象棋游戏中寻找位板演示,尽管此演示仅适用于能够“思考”快速计算的国际象棋引擎,但当您必须检查玩家试图采取的动作是否正确时,它仍然很有用。正确的。

可能的位板:

public class BitBoard
{
    public static final int P = 0;
    public static final int N = 2;
    public static final int B = 4;
    public static final int R = 6;
    public static final int Q = 8;
    public static final int K = 10;

    public static final int p = 1;
    public static final int n = 3;
    public static final int b = 5;
    public static final int r = 7;
    public static final int q = 9;
    public static final int k = 11;

    // empty field
    public static final int empty = 12;

    // number of pieces , squares
    public static final int nPieces = 12;
    public static final int nSquares = 64;

    public static final int whitePieces = 12;
    public static final int blackPieces = 13;
    public static final int nBoards = 14;

    public static long squareBits[];

    // static member initialization
    static
    {
        squareBits = new long[64];
        long square = 1;
        square = square << 8 * 8 - 1;
        for (int i = 0; i < 64; i++) {
            squareBits[i] = square >>> i;
        }
    }

    long bitBoards[];

    public BitBoard() {
        bitBoards = new long[nBoards];
    }

    public boolean initBoard()
    {
        // Put the pieces on the board
        EmptyBoard();
        addPiece(0, r);
        addPiece(1, n);
        addPiece(2, b);
        addPiece(3, q);
        addPiece(4, k);
        addPiece(5, b);
        addPiece(6, n);
        addPiece(7, r);
        for (int i = 8; i < 16; i++) {
            addPiece(i, p);
        }

        for (int i = 48; i < 56; i++) {
            addPiece(i, P);
        }
        addPiece(56, R);
        addPiece(57, N);
        addPiece(58, B);
        addPiece(59, Q);
        addPiece(60, K);
        addPiece(61, B);
        addPiece(62, N);
        addPiece(63, R);

        return true;
    }

    public boolean addPiece(int whichSquare, int whichPiece)
    {
        bitBoards[whichPiece] |= squareBits[whichSquare];
        bitBoards[nPieces + (whichPiece % 2)] |= squareBits[whichSquare];
        return true;
    }

    private boolean removePiece(int whichSquare, int whichPiece)
    {
        bitBoards[whichPiece] ^= squareBits[whichSquare];
        bitBoards[nPieces + (whichPiece % 2)] ^= squareBits[whichSquare];
        return true;
    }

    private boolean EmptyBoard()
    {
        for (int i = 0; i < nBoards; i++)
        {
            bitBoards[i] = 0;
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)