当前位置: 首页 > 知识库问答 >
问题:

为我的Java方格棋盘游戏优化我的“捕获”算法

侯和惬
2023-03-14
    null
  • ex)白条在板子的左边缘,然后黑条直接移动到白条的右边,这将是一个捕获

到目前为止我有一个

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

但是我不能这么简单地做,因为如果这个片段在两个外边的行或列上,使用上面的算法,我会得到一个ArrayOutofBoundsException错误。

然后,我有一个巨大的if语句,用于判断这件作品是白的还是黑的。

我只是觉得有一个更简单的方法来优化这个…作为一个初学编程的人,我看不出来。有人能给我提点建议吗?

然后我必须再做一遍黑色的部分…我的代码看起来真的很邋遢,我觉得有一个更简单的方法来做这件事。有什么建议吗?

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;
            }
        }

共有1个答案

宁良平
2023-03-14

考虑一个片段只能作为另一个片段运动的结果被捕获。假设你有一个白色的棋子移动到一个黑色棋子的附近(八个检查“我旁边有一个黑色棋子吗?”);在这一点上,检查是否有一个白色片沿着同一条线从它对面(如果黑色片在第一个白色片的下面,检查在第一个黑色片的正下面的另一个白色片;如果黑色片在对角线上且向右,检查在黑色片的右边且向上的另一个白色片;等等)。此外,你需要检查每一个棋子移动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
 类似资料:
  • 棋盘游戏是一个11x11矩阵 ex)白板左边的白板,然后黑板直接移动到白板的右边,这将是一个捕获 到目前为止,我有一个 11 x 11矩阵 (int)0=空,1=白,2=黑,3=白 到目前为止,我的算法是基本的,检查上/下/左/右,如果是对立面,然后检查旁边的那块是否是友好的,如果是,那么抓取。 但我不能简单地这么做,因为如果工件位于两个边缘外的行或列上,使用上述算法,我会得到一个ArrayOut

  • 我对java完全陌生,我想在Java中创建一个单人棋盘游戏。 我已经有很多定义游戏的类,但是对于我的问题,我将把问题限制在为我的棋盘游戏创建GUI板 我非常具体的问题是,基于以下代码: 如何在棋盘游戏中移动玩家?(类播放器存在) 提前感谢您的得体回答。因为我对java非常陌生,请清楚地解释您的答案。 这是以下代码的输出:

  • 我需要使用JavaSlick库创建一个固定大小的2D网格,例如20x20。目前我有一个包含符号(文本)的数组[]。这些符号代表棋盘上的不同瓷砖(正方形)。 我知道如何在屏幕上渲染/绘制单个图像,但不确定如何在网格上执行相同的操作(循环?对游戏来说渲染不是太多吗?)。我应该研究精灵表的概念吗? 理想情况下,我想创造 平铺对象:平铺、平铺、大小、图像(基于类型) 我不知道如何在屏幕上绘制/渲染它。我应

  • 我试图为一个棋盘游戏找到一个更好的启发式函数,我将在代码后指定其规则。我的评估功能是: 初始板持有绿色和红色令牌,如图所示。人工智能先移动,使用与你相反的颜色,攻击你的代币。在黑色单元上,令牌可以正交(左、右、上、下)或对角移动。如果是在白血球上,你只能正交移动。 当您将令牌移动到对手令牌旁边时,您将删除该方向上所有对手的令牌。例如,如果我将绿色令牌从 C4 移动到 C5,我将杀死 C-6 到 C

  • 我只知道大学里的基本java技能,但我想编写一个棋盘游戏(基本上就像垄断游戏),我完全不知道如何开始一些东西,这会产生一些不同的东西(在这种情况下是棋盘游戏),而不仅仅是控制台的东西。我不想要超高的图形,但更多的是在控制台中创建一个带有许多“-”符号的矩形。它应该是2d的,从顶部看。 你有什么建议?你建议我怎么开始?

  • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]