首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >国际象棋Rook移动编程

国际象棋Rook移动编程
EN

Stack Overflow用户
提问于 2015-05-03 05:24:36
回答 3查看 10K关注 0票数 2

我正在尝试创建一个棋盘游戏,其中所有的棋子都能够像国际象棋中的车一样移动。(即水平或垂直方向的空格数量随他们的需要而定)

我的棋盘是一个简单的二维整数数组,取值为0,1,2取决于空间是空的,是红色的还是黑色的。

到目前为止,我的移动代码如下所示,无论移动是否允许,它都会创建一个true或false值:

代码语言:javascript
复制
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;
    }
}

我的问题是试图创建碰撞检测,如果另一块挡住了它,它应该不能通过它,但我的代码目前可以。有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-03 05:50:59

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

代码语言:javascript
复制
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提出的方法,通过减少conditional statement计数来优化代码。其主要思想是使用“delta值(dx/dy)”来递增或递减单元索引。在这种情况下,应该显式检查目标单元格。

代码:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2015-05-03 05:32:49

你可以有一个2D字符数组,每个单元代表电路板上的位置。在那里,你可以有一个字符的位置的三个状态(白/红/空)。

我能想到的另一种方法是在每次移动之前检查startPosition,直到endPosition定位它们的状态。但在性能方面,我认为某种类型的数组会更好

票数 0
EN

Stack Overflow用户

发布于 2015-05-03 05:53:21

您可以简单地“遍历”每个字段,以检查它是否为空。例如:

代码语言:javascript
复制
int[][] board;

public boolean validMove(int fromRow, int fromCol, int toRow, int toCol) 
{
  if (pieceAt(toRow, toCol) != EMPTY) return false;
  else if (fromRow == toRow) 
  {
    // horizontal move
    if (fromCol == toCol) return false; // same position
    int dx, x;
    if (fromCol < toCol) 
      dx = 1;
    else 
      dx = -1; 

    for (x = fromCol + dx; x != toCol; x += dx) 
    {
      if (pieceAt(toRow, x) != EMPTY) return false; // occupied
    }
  }
  else if (fromCol == toCol) 
  {
    // vertical move
    int dy, y;
    if (fromRow < toRow) 
      dy = 1;
    else 
      dy = -1; 

    for (y = fromRow + dy; y != toRow; y += dy) 
    {
      if (pieceAt(y, toCol) != EMPTY) return false; // occupied

      return true; // free path
    }
  }
  else return false; // no horizontal or vertical move

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30007666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档