【问题标题】:Board Game Capturing Pieces棋盘游戏抓片
【发布时间】:2015-05-03 07:40:48
【问题描述】:

我正在创建一个棋盘游戏,它有两种不同颜色的棋子,黑色和红色。

如果玩家用自己的棋子水平或垂直包围对手的棋子,棋子就会被移走。这里有一些图片来证明这一点:

我的棋盘是一个简单的 2d 整数数组,其值为 0、1 或 2,具体取决于空间是否为空,有红色棋子还是黑色棋子。

这是我到目前为止提出的代码,但是我遇到了超出范围错误的问题,并且它也不能解释捕获多个片段。

static final int EMPTY = 0, BLACK = 1, RED = 2, ROW = 9, COLUMN = 9;
board = new int[ROW][COLUMN];

public void captureRedPieces() {
    for(int i = 0; i < ROW; i++) {
        for(int j = 0; j < COLUMN; j++) {
            if(i <= ROW - 2) {
                if(board[i][j] == 1 && board[i + 1][j] == 2 && board[i + 2][j] == 1) {
                    board[i + 1][j] = EMPTY;
                }
            }
            if(i <= COLUMN - 2) {
                if(board[i][j] == 1 && board[i][j + 1] == 2 && board[i][j + 2] == 1) {
                    board[i][j + 1] = EMPTY;
                }
            }
        }
    }
}

谁能帮我想出一个更好的解决方案来捕捉碎片?

【问题讨论】:

    标签: java chess


    【解决方案1】:

    您正在测试是否i &lt;= ROW - 2,但随后您使用i+2 作为您检查的索引。这意味着如果 i 是 7,等于 ROW - 2 并通过了您的 if 测试,那么 i+2 将是 9,这是超出范围的,因为数组仅从 0 变为 8。

    因此,您应该将其更正为 i &lt; ROW - 2 而不是 &lt;=

    另外,你有这个代码:

          if(i <= COLUMN - 2) {
                if(board[i][j] == 1 && board[i][j + 1] == 2 && board[i][j + 2] == 1) {
                    board[i][j + 1] = EMPTY;
                }
            }
    

    这应该是j 上的一个条件,而不是i 上的一个条件 - 并且它必须以我告诉你i - &lt; 而不是&lt;= 的相同方式修复。

    注意:由于您的规则规定“包围”状态仅在周围颜色移动后才被捕获,也许您应该改变您的方法:您应该只检查黑色形成的位置一个动作,以匹配它周围的位置。当然,你仍然必须确保你不会越界。您当前的方法可能会标记自上次移动以来被“包围”的地方,这根据规则是错误的。

    所以你的方法应该这样声明:

    public void captureRedPieces(int blackMoveRow, int blackMoveCol )
    

    【讨论】:

      【解决方案2】:

      您可能必须将i &lt;= COLUMN - 2 替换为j &lt;= COLUMN - 2。似乎捕获发生在新动作之后。如果您知道新棋子的确切位置,则无需遍历整个棋盘。您只需要在放置新棋子的同一行和同一列中检查附近的棋子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多