- 棋盘游戏是一个 11x11 矩阵。
- 件是白色,黑色,(1)whiteking
- 可以通过夹住对手来“捕获”一块
- 例如)黑色棋子的左右或上下有一个白色棋子/白色国王
- 也可以使用板的边缘或 4 个角件中的任何一个夹住和捕获
- ex) 白棋子在棋盘的左边缘,然后黑棋子直接移动到白棋子的右侧,这将是一个捕获
到目前为止,我有一个
- 11 x 11 矩阵
- (int) 0 = 空,1 = 白色,2 = 黑色,3 = 白化
所以到目前为止我的算法是基本的,检查上/下/左/右,如果是反对,然后再次检查旁边的棋子是否是友好的棋子,如果是,然后捕获。
但是我不能简单地这样做,因为如果这块在 2 个外边缘行或列上,使用上面的算法我会得到一个 ArrayOutofBoundsException 错误。
那么我有一个巨大的if语句来判断这件作品是白色还是黑色。
我只是觉得有一种更简单的方法来优化它.. 作为一个初级程序员,我看不到它。有人可以提出一些建议吗?
如果您查看下面的代码..您可以看到这仅在移动位于外边缘时...如果它位于“1”列/行中,我几乎必须重新复制并粘贴所有内容.. . 然后我终于可以检查 2 个空格上/左/右/下,而不必担心 ArrayOutofBoundsException。
然后我必须再次为 Black Pieces 做所有这些。我的代码看起来真的很草率,我觉得有一种更简单的方法可以做到这一点。有什么建议么?
void makeMove(int typePiece, int fromRow, int fromCol, int toRow, int toCol) {
board[toRow][toCol] = board[fromRow][fromCol];
board[fromRow][fromCol] = EMPTY;
//CAPTURE
if(typePiece == WHITE) {
if(toRow==0) { //top row
//check right
if(toCol!=9 && board[toRow][toCol+1]==BLACK &&
(toCol==10 || board[toRow][toCol+2]==WHITE || board[toRow][toCol+2]==WHITEKING)) {
board[toRow][toCol+1]=EMPTY;
}
//check left
if(toCol!=1 && board[toRow][toCol-1]==BLACK &&
(toCol==0 || board[toRow][toCol-2]==WHITE || board[toRow][toCol-2]==WHITEKING)) {
board[toRow][toCol-1]=EMPTY;
}
//check bottom
if(board[toRow-1][toCol]==BLACK && (board[toRow-2][toCol]==WHITE || board[toRow-2][toCol]==WHITEKING)) {
board[toRow-1][toCol]=EMPTY;
}
}
else if(toRow == 10) { //bottom row
//check right
if(toCol!=9 && board[toRow][toCol+1]==BLACK && (toCol==10 || board[toRow][toCol+2]==WHITE || board[toRow][toCol+2]==WHITEKING)) {
board[toRow][toCol+1]=EMPTY;
}
//check left
if(toCol!=1 && board[toRow][toCol-1]==BLACK && (toCol==0 || board[toRow][toCol-2]==WHITE || board[toRow][toCol-2]==WHITEKING)) {
board[toRow][toCol-1]=EMPTY;
}
//check top
if(board[toRow+1][toCol]==BLACK && (board[toRow+2][toCol]==WHITE || board[toRow+2][toCol]==WHITEKING)) {
board[toRow+1][toCol]=EMPTY;
}
}
else if(toCol == 0) { //left column
//check right
if(board[toRow][toCol+1]==BLACK && (board[toRow][toCol+2]==WHITE || board[toRow][toCol+2]==WHITEKING)) {
board[toRow][toCol+1]=EMPTY;
}
//check top
if(toRow!=1 && board[toRow+1][toCol]==BLACK && (board[toRow+2][toCol]==WHITE || board[toRow+2][toCol]==WHITEKING)) {
board[toRow+1][toCol]=EMPTY;
}
//check bottom
if(toRow != 9 && board[toRow-1][toCol]==BLACK && (board[toRow-2][toCol]==WHITE || board[toRow-2][toCol]==WHITEKING)) {
board[toRow-1][toCol]=EMPTY;
}
}
else if(toCol == 10) { //right column
//check left
if(board[toRow][toCol-1]==BLACK && (toCol==0 || board[toRow][toCol-2]==WHITE || board[toRow][toCol-2]==WHITEKING)) {
board[toRow][toCol-1]=EMPTY;
//check top
if(toRow!=1 && board[toRow+1][toCol]==BLACK && (board[toRow+2][toCol]==WHITE || board[toRow+2][toCol]==WHITEKING)) {
board[toRow+1][toCol]=EMPTY;
}
//check bottom
if(toRow != 9 && board[toRow-1][toCol]==BLACK && (board[toRow-2][toCol]==WHITE || board[toRow-2][toCol]==WHITEKING)) {
board[toRow-1][toCol]=EMPTY;
}
}