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

程序设计棋车运动

潘志国
2023-03-14
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个答案

万俟震博
2023-03-14

尝试下面的代码。它很天真(也没有经过测试),但我认为它应该像现在这样工作。而且我认为它很好地说明了这个想法(见评论)。它是用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;
}
 类似资料:
  • 本文向大家介绍C++程序设计-五子棋,包括了C++程序设计-五子棋的使用技巧和注意事项,需要的朋友参考一下 前言:很多刚刚接触编程的人都不知道怎么下手编写程序,特别是学习了新的知识点,不知道有什么用,那么本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能,还有好多地方需要补全,如边界问题,设计问题,游戏逻辑

  • 我列出了这两种游戏的相似之处,目的是可能将其扩展到国际象棋,但对我的设计提出质疑。 相似点 件-物料(行、列)在板上的位置 板-nxn片格 游戏-包含棋盘和玩家列表 播放机-播放机名称 差异 在checkers中,您可以在不同的方向上移动,因此我创建了一个名为Checker的独立抽象类,它继承了Piece,并实现了一个返回pieces移动的Moveable接口。所以棋子和国王必须实施这个方法,提供

  • Javascript 程序设计以 ECMAScript 5.1 为标准,从基本语法到原理深入,理解和编写Javascript程序。核心内容有语言简介、调试器、类型系统、内置对象、基本语法、变量作用域、闭包、面向对象编程等。

  • C 程序设计

  • Microsoft Windows操作系统是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

  • 我用Java编写国际象棋程序时,有一个GameLauncher类和一个包含所有其他类的Game类,因为所有这些类都需要访问表示棋盘上棋子的Game实例变量。这些内部类是Player、BoardPanel(一个JPanel)、Piece和所有其他Piece子类(Rook、Horse、Bishop、King等)。 我想知道实现这一点的标准方法是将类作为游戏的内部类(从而允许它们直接访问游戏的对象)还是