C ++扫雷艇AjacentMines

时间:2016-03-12 21:32:21

标签: c++

我和我的兄弟正在进行一场扫雷游戏。我们已经做了几乎所有的事情,但我们遇到的问题是找到它旁边有多少个地雷。我的兄弟尝试使用if和else if stats,但我认为最好使用循环。我做了一个循环,但我有一个问题。它计算左侧和右侧。我应该怎么解决它。这是我的代码:

int p_col = col - 1;
int p_row = row - 1;

for (int j = 0; j < 3; j++){
    if (p_col + j >= 0){
        if (p_row + j >= 0){
            if (row + j <= height){
                if (isTileMine(p_row + j, p_col))
                    miner++;
                if (isTileMine(p_row + j, p_col + 1)){
                    //Teller ikke seg selv
                    if (p_row + j == p_row + 1){}
                    else{
                        miner++;
                    }
                }
                if (isTileMine(p_row + j, p_col + 2))
                    miner++;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这个算法有一堆明显的错误,不包括以下事实:当当前位置位于比赛场的右边缘时,由于边界检查失败,它可能会导致未定义的行为。

你需要两个循环,而不是一个。

  • 第一行从第一行到第一行

  • 从col-1到col + 1的内循环

这将遍历正在检查的单元格附近的所有单元格。

  • 这也会循环(row,col),所以你只需在循环体中跳过它

  • 在检查任何内容之前,内部循环内部的第一个业务顺序是验证当前正在检查的坐标是否实际位于比赛场地上。 row和col都不是负数(因为循环将从第1行和第1行迭代,其中任何一个可能为0),并且不超过游戏区域的最大大小(因为row和col可以是右边或底边的坐标。)

当你在循环体中只有一次isTileMine()的呼叫而不是三次呼叫时,你知道你有正确的答案。