在C中返回多个2D阵列位置的函数不起作用

时间:2014-03-22 12:05:02

标签: c structure type-conversion minesweeper

我是c的新手并试图制作扫雷游戏。我认为我的代码在数据类型转换方面存在一些问题,但我不明白为什么。检查此链接

How to cast or convert an unsigned int to int in C?

并尝试在我的代码中实现信息。

我试图实现一个函数,该函数返回具有地雷的x,y协调2D阵列的相邻位置的数量。

int neighbours(const Field *f, unsigned int x, unsigned int y)
{
    int z = 0;
    int i,j;
    unsigned int a = y-1;
    j =(int)a;
    unsigned int b =x-1;
    i = (int)b;

    for(; j<=(a+2); j++){
        if(j>=0 && j<=f->ysize){
            for (; i<=(b+2); i++){
                if ( i>=0 && i<=f->xsize && (f->places[j][i] == UNKNOWN_MINE ||f->places[j][i] == KNOWN_MINE)){
                    z++;
                 }

             }
            i = b;
        }  
    }
    return z;
 }

1 个答案:

答案 0 :(得分:0)

代码

unsigned a = y-1;
如果y == 0

会给你一个== UINT_MAX

条件

  j >= 0

只是说“如果这个非负整数不是负数”,所以不是很有帮助。

一个好主意是使用一些填充来存储数据,其中矩形贴图在每一边填充一个整数宽度,所有都具有一个值,你会称之为PADDING_FIELD

这样你的功能会更简单,更有效:

int neighbours(const Field *f, unsigned int x, unsigned int y)
{
  int z = 0;

  assert(x > 0 && x < UINT_MAX);
  assert(y > 0 && y < UINT_MAX);

  for(unsigned int j = y-1; j <= y+1); j++) {
        for (unsigned int i = x-1; i <= x+1; i++) {
            if ((f->places[j][i] == UNKNOWN_MINE ||f->places[j][i] == KNOWN_MINE)){
                z++;
            }
        }
  }
  return z;
}

这样你就不需要检查是否超出界限,如果你要解决外面的问题,你只需得到f-&gt; places [j] [i] == PADDING_FIELD,它与任何东西都不匹配。 类型转换也没问题,你知道x或y不能为零或UINT_MAX。

修改

如果你仔细选择UKNOWN_MINE和KNOWN_MINE的值,你也可以删除小循环中的一个检查。可以这样做:

    static const field mine = 4;
    static const field known = 8;

    inline bool is_mine(field f)
    {
            return (f & mine) != 0;
    }

    inline bool is_knownmine(field f)
    {
            return (f & mine & known) != 0;
    }

    inline bool is_unknownmine(field f)
    {
            return is_mine(f) && !is_knownmine(f);
    }

    int neighbors(....)
    {
     .....
      if (is_mine(f->places[j][i]) {
          ++z;
      }
     .....
    }