c - 十五人游戏中移动方 block 的问题

标签 c

下面是十五人游戏中的一个函数,它应该搜索“0”图 block ,一旦找到,就允许相邻的图 block 移动到它的位置。它适用于前几次移动,但随后不允许当零图 block 位于顶行(它从右下角开始)时应允许的移动。请注意,下面的“0”图 block 被绘制为下划线。例如:

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;
}

最佳答案

只要看看,我就很确定你需要改变:

((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;
}

关于c - 十五人游戏中移动方 block 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23280147/

相关文章:

c++ - Json卡盘事实解析

c++ - FAT 文件系统中的簇、页、扇区

c - 将 Quake 2 中的 MASM5 代码移植到 GAS——意外的渲染结果

c - 在这种情况下,C 是否正确处理了 sizeof(...) 和 sizeof ...?

c - 为什么我不能使用 gcc 生成 "Hello World"可执行文件?

javascript - Node ffi将矩阵作为参数发送到C DLL

c - 如何从最终输出密文中删除空格?

计数 C 指令

c - int 到填充零字符串

c - 如何从不同的函数访问 C 中的变量?