gpt4 book ai didi

java - 为我的 Java 棋盘游戏优化我的 "capture"算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:03:35 25 4
gpt4 key购买 nike

  • 棋盘游戏是一个 11x11 矩阵。
  • 棋子是白色的,黑色的,(1)whiteking
  • 可以通过夹住对手来“夺取”棋子
    • ex) 一个黑色棋子的左右或顶部和底部有一个白色棋子/白色国王
  • 也可以使用板的边缘或 4 个角 block 中的任何一个来夹住和捕获
    • ex) 白色棋子在棋盘的左边,然后黑色棋子直接移动到白色棋子的右边,这将是一个捕获

到目前为止我有一个

  • 11 x 11 矩阵
  • (int) 0 = 空,1 = 白,2 = 黑,3 = 白

所以我的算法到目前为止是基本的,检查上/下/左/右,如果是对立,然后再次检查旁边的棋子是否是友好棋子,如果是,则捕获。

但我不能就这么简单地做,因为如果这 block 在 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;
}
}

最佳答案

考虑一个棋子只能作为另一个棋子移动的结果被捕获。假设您有一 block 白色棋子移动到与黑色棋子相邻的某个位置(八次检查“我旁边有黑色棋子吗?”);在那一点上,检查是否有一个白色的棋子沿着同一条线穿过它(如果黑色棋子在第一个白色棋子的下方,请检查第一个黑色棋子正下方的另一个白色棋子;如果黑色棋子斜向上并且在右边,检查黑色棋子右边的另一 block 白色棋子;等等)。此外,每次移动棋子时,您都需要检查 a) 我周围是否有敌人棋子,如果有 b) 它是否被另一个敌人棋子镜像到另一边?

按照这些思路尝试一些事情:

for all eight directions (up, down, left, right, and the four diagonals):
is there an enemy piece in that direction adjacent to me?
if so:
is there a friendly piece in that direction that is also adjacent to that enemy piece?
if so:
remove that piece

for all eight directions:
is there an enemy piece in that direction adjacent to me?
if so:
is there another enemy piece in the opposite direction that is also adjacent to me?
if so:
remove me

关于java - 为我的 Java 棋盘游戏优化我的 "capture"算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com