2016-03-12 134 views
0

我和我的兄弟正在制作扫雷游戏。我们已经做出了几乎所有的事情,但是我们在找到旁边有多少个地雷时遇到了问题。我的兄弟试图用if和else来表达,但我认为使用循环更好。我做了一个循环,但我有一个问题。它计数左侧和右侧。我应该如何解决它。这里是我的代码:C++扫雷艇AjacentMines

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

这种算法有一堆明显的错误,不包括至少一个事实,即,在当前位置是在运动场上的右边缘,它可能会导致不确定的行为由于边界检查失败。

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

  • 从第一环路行1到行+ 1

  • 内环从COL-1至COL + 1

这将循环在单元附近的所有的细胞正在检查。

  • 这也将遍历(行,列),所以你会直接跳过,在循环

  • 和业务的第一顺序的身体,内环内,在检查任何事情之前,检查当前正在检查的坐标是否在实际运动场上。行和列都不是负数(因为循环将从第1行和第1列迭代,其中任何一个可能都是0),并且不会超出游戏区的最大尺寸(因为行和列可以是坐标在右边或底部边缘)。

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

+0

谢谢你的回答。我试过做循环,但是当我运行它时程序没有响应。我调试并发现它是因为它调用[] [ - 1]。我有一个if语句,所以我不知道它为什么会发生。 '对(INT J = 0;Ĵ<3; J ++){ \t \t如果(p_row + J> = 0 && p_col + J <=高度){ \t \t \t的for(int i = 0; I <3;我++){ \t \t \t \t如果(p_col + I> = 0 && p_col + I <=宽度){ \t \t \t \t \t如果(isTileMine(p_col + J,p_row + i))的 \t \t \t \t \t \t矿工++; \t \t \t \t} \t \t \t} \t \t} \t}' – user3604304

+0

我知道我计算发现问题poistion本身 – user3604304

+0

。我以错误的顺序调用了isTileMine – user3604304