提问者:小点点

程序设计棋车运动


int[][] board;

public boolean validMove(int fromRow, int fromCol, int toRow, int toCol) {
    if (pieceAt(toRow, toCol) != EMPTY) {
        return false;
    } else if (fromRow - toRow == 0 && fromCol - toCol != 0) {
        return true;
    } else if (fromCol - toCol == 0 && fromRow - toRow != 0) {
        // Trying to add piece collision code
        for (int i = fromRow; i < toRow; i++) {
            if (pieceAt(toCol, i) != EMPTY)
                return false;
        }
        return true;
    } else {
        return false;
    }
}

我的问题是试图创建碰撞检测,如果另一个片段是在它不应该能够通过它的方式,但我的代码目前可以。有人能帮我做这个吗?


共1个答案

匿名用户

尝试下面的代码。它很天真(也没有经过测试),但我认为它应该像现在这样工作。而且我认为它很好地说明了这个想法(见评论)。它是用C语言编写的,但我相信您可以很容易地将其转换为Java(或您使用的任何语言)。

bool validMove(int fromRow, int fromCol, int toRow, int toCol)
{
    int i;

    // Attempt to move to the same cell
    if (fromRow == toRow && fromCol == toCol)
        return false;

    // Collision detection
    if (fromRow == toRow) {
        // Horizontal move
        if (fromCol < toCol) {
            // Move right
            for (i = fromCol + 1; i <= toCol; ++i)
                if (pieceAt(fromRow, i) != EMPTY)
                    return false;
        } else {
            // Move left
            for (i = fromCol - 1; i >= toCol; --i)
                if (pieceAt(fromRow, i) != EMPTY)
                    return false;
        }
    } else if (fromCol == toCol) {
        // Vertical move
        if (fromRow < toRow) {
            // Move down
            for (i = fromRow + 1; i <= toRow; ++i)
                if (pieceAt(i, fromCol) != EMPTY)
                    return false;
        } else {
            // Move up
            for (i = fromRow - 1; i >= toRow; --i)
                if (pieceAt(i, fromCol) != EMPTY)
                    return false;
        }
    } else {
        // Not a valid rook move (neither horizontal nor vertical)
        return false;
    }

    return true;
}

编辑

您还可以使用Toon Krijthe提出的方法,通过减少条件语句计数来优化代码。其主要思想是使用“delta”值(dx/dy)来递增或递减单元格索引。在这种情况下,应该显式地检查目标单元格。

bool validMove(int fromRow, int fromCol, int toRow, int toCol)
{
    int i;

    // Attempt to move to the same cell
    if (fromRow == toRow && fromCol == toCol)
        return false;

    // Collision detection
    if (fromRow == toRow) { // Horizontal move
        int dx = (fromCol < toCol) ? 1 : -1;

        for (i = fromCol + dx; i != toCol; i += dx)
            if (pieceAt(fromRow, i) != EMPTY)
                return false;
    } else if (fromCol == toCol) { // Vertical move
        int dy = (fromRow < toRow) ? 1 : -1;

        for (i = fromRow + dy; i != toRow; i += dy)
            if (pieceAt(i, fromCol) != EMPTY)
                return false;
    } else { // Not a valid rook move
        return false;
    }

    // Return true if destination cell is free
    return pieceAt(toRow, toCell) == EMPTY;
}