use*_*871 5 java oop swing instanceof
好的,我正在制作一个简单的java swing国际象棋游戏.这个问题更多的是关于OOP设计然后是Java Swing.
我有以下内容:
在我的主要ChessGame类中:
所以,左上方(0,0)映射到myArray [0] [0]
我的问题是,要检查这个地方是空的还是有棋子,我必须使用:
if(panels[x][y] instanceof Piece){
((Piece)panels[x][y]).makeMove();
}
Run Code Online (Sandbox Code Playgroud)
我问的是这个可怕的设计?我知道我应该尝试远离实例.什么是更好的方法?
谢谢.
您必须在画布上绘制棋盘和各个部分,而不是将面板拆分为 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)