在十五岁的游戏中移动瓷砖的麻烦

时间:2014-04-24 21:24:09

标签: c

下面是十五的游戏中的一个功能,它应该搜索“0”图块,一旦找到,允许相邻图块移动到其位置。它适用于前几个移动,但是当零瓦片位于顶行时(它从右下角开始),它不允许移动。请注意下面的“0”磁贴绘制为下划线。例如:

8  7  6 
5  4  3 
2  1  _
Tile to move: 3

8  7  6 
5  4  _
2  1  3 
Tile to move: 6

8  7  _
5  4  6 
2  1  3 
Tile to move: 7

Illegal move.

以下是代码:

bool move(int tile)
{
int blankrow;
int blankcol;
for (int i = 0; i < d; i++)
{
    for (int j = 0; j < d; j++)
    {
        if (board[i][j] == 0)
        {
            blankrow = i;
            blankcol = j;
        }

    }
}  

for (int i = 0; i < d; i++)
{
    for (int j = 0; j < d; j++)
    {
        if ((board[i][j] == tile) && ((board[i+1][j] == 0 || board[i-1][j] == 0) &&
             (board[i][j+1] == 0 || board[i][j-1] == 0)))
        {
            int swapped = board[i][j];
            board[blankrow][blankcol] = swapped;
            board[i][j] = 0;
            return true;
        }
    }
}             
return false;
}

3 个答案:

答案 0 :(得分:4)

只是通过观察,我很确定你需要改变:

((board[i+1][j] == 0 || board[i-1][j] == 0) &&
         (board[i][j+1] == 0 || board[i][j-1] == 0))

要:

(board[i+1][j] == 0 || board[i-1][j] == 0 ||
 board[i][j+1] == 0 || board[i][j-1] == 0)

编辑:我同意以下用户评论。更好的代码看起来像:

bool move(int tile)
{
    int blankrow, blankcol, tilerow, tilecol;
    for (int i = 0; i < d; i++) {
        for (int j = 0; j < d; j++) {
            if (board[i][j] == 0) {
                blankrow = i;
                blankcol = j;
            }
            else if (board[i][j] == tile) {
                tilerow = i;
                tilecol = j;
            }
        }
    }

    if( (blankrow == tilerow && abs(blankcol - tilecol) == 1) ||
        (blankcol == tilecol && abs(blankrow - tilerow) == 1) ) {
        board[blankrow][blankcol] = board[tilerow][tilecol];
        board[tilerow][tilecol] = 0;
        return true;
    }
    return false;
}

答案 1 :(得分:0)

您找到了blankrowblankcol。找同样的事情找tilerowtilecol。然后验证

((blankrow == tilerow) && (abs(blankcol - tilecol) == 1))

((blankcol == tilecol) && (abs(blankrow - tilerow) == 1))

如果满足其中任何一个条件,则交换。现有代码的问题是您可以使数组访问超出范围。例如,如果i0,则board[i-1][j]是一个越界访问。

答案 2 :(得分:0)

我认为您应该从

更改第二个循环中的if语句
if ((board[i][j] == tile) &&
    ((board[i+1][j] == 0 || board[i-1][j] == 0) &&
     (board[i][j+1] == 0 || board[i][j-1] == 0)))

if ((board[i][j] == tile) &&
    ((i+1==blankrow && j==blankcol) ||
     (i-1==blankrow && j==blankcol) ||
     (i==blankrow && j+1==blankcol) ||
     (i==blankrow && j-1==blankcol)))

在原始版本中,您需要行偏移为1,列偏移为零,行偏移为零,列偏移为同时。此外,您可能会对数组中的负索引或读取结束。