c - 我怎么只交换一个值而不是两个值



我正在做一个练习,在这个练习中,我必须编写一个"瓷砖"游戏。此函数应该在多维数组中查找空白图块。然后,用户通过传入称为"tile"的整数来选择磁贴。如果用户输入的"磁贴"与空白磁贴相邻,则需要交换

然而,现在,这并没有发生。有人告诉我,"问题是你正在用可变图块交换板上单个项目的价值。可变磁贴可能与看板中的项目具有相同的值,但它不是看板中的项目。你需要交换板上的两个项目。

另外,显然:"但是我if语句的第二部分只检查该磁贴是否不在棋盘右下角后面。你不是更想知道blankCol - 1是否小于零吗?

"d"是用户先前在程序开始时选择的电路板的大小。如果他们选择 3,d = 3,因此多维数组将等于 3x3 (d * d)。然而,我无法弄清楚这意味着什么:

bool move(int tile)
{
    int temp;
    int didSwap;
    int blankRow;
    int blankCol;
    // search for blank tile
    for (int row = 0; row < d; row++) {
        for (int col = 0; col < d; col++) {
            if (board[row][col] == 0) {
                blankRow = row;
                blankCol = col;
            }
        }
    }
    // check that tile is not too big or too small
    if (tile > d * d - 1 || tile < 1) {
        return false;
    }
    // search for blank tile
    for (int row = 0; row < d; row++) {
        didSwap = 0;
        for (int col = 0; col < d; col++) {
            if (tile == board[blankRow + 1][blankCol] &&
                tile != board[d + 1][d]) {
                temp = board[blankRow][blankCol];
                board[blankRow][blankCol] = tile;
                tile = temp;
                didSwap = 1;
                return true;
            }
            else if (tile == board[blankRow - 1][blankCol] &&
                     tile != board[d - 1][d]) {
                temp = board[blankRow][blankCol];
                board[blankRow][blankCol] = tile;
                tile = temp;
                didSwap = 1;
                return true;
            }
            else if (tile == board[blankRow][blankCol + 1] &&
                     tile != board[d][d + 1]) {
                temp = board[blankRow][blankCol];
                board[blankRow][blankCol] = tile;
                tile = temp;
                didSwap = 1;
                return true;
            }
            else if (tile == board[blankRow][blankCol - 1] &&
                     tile != board[d][d + 1]) {
                temp = board[blankRow][blankCol];
                board[blankRow][blankCol] = tile;
                tile = temp;
                didSwap = 1;
                return true;
            }
            else {
                return false;
            }
        }
    }
    return false;
}

你能就我应该从这里去哪里提出一些建议吗?

谢谢

本质上,问题在于您只设置了一个板图的值:在您的函数中只执行一个board[(row)][(col)] = (value)语句。

例如:

       if (tile == board[blankRow + 1][blankCol] &&
            tile != board[d + 1][d]) {
            temp = board[blankRow][blankCol];
            board[blankRow][blankCol] = tile;
            tile = temp;
            didSwap = 1;
            return true;
        }

注意到只有一个 board[...][...] = - 类型语句?因此,它只在板上设置一个图块值。

tile = temp;语句(您似乎认为它应该更改第一个磁贴并因此完成交换操作)只是分配给局部变量。它不会更改 board 数组中记录的值。

但是,我相信您的代码中还有其他问题。您有两个注释说"搜索空白磁贴",但显然第一个注释是正确的,第二个注释是复制粘贴的,但现在不准确:代码改为搜索要移动的磁贴。但是,在整个板上搜索必须位于特定磁贴旁边的磁贴(充其量)效率低下。为什么不只搜索空白磁贴周围的方块?您还需要确保不会超出数组范围,请考虑:

        else if (tile == board[blankRow - 1][blankCol] &&
                 tile != board[d - 1][d]) {

。如果blankRow为 0 怎么办?- 然后您正在访问board[-1][blankCol]这将调用未定义的行为,并可能导致您的程序失败或表现出奇怪的行为。

问题太多:

  1. 假设d=5,检查磁贴超出范围,用户输入25,就会显示超出范围。

将代码更改为 :

if Tile>d*d
  1. 还可以尝试以下步骤:

    1. 查找空白磁贴
    2. 查看用户是否输入了相邻的磁贴。这不需要循环,只有4 如果 stmta 表示向上、向下、向左右。
    3. 如果确实相邻,则交换值。

相关内容

  • 没有找到相关文章

最新更新