【问题标题】:Function returning a number of 2D array locations in C doesn't work在 C 中返回多个二维数组位置的函数不起作用
【发布时间】:2014-03-22 12:05:02
【问题描述】:

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

【问题讨论】:

  • 什么不起作用?
  • 如果xy 永远为0,那么x-1y-1 不会给你-1,因为它们是未签名的。相反,它将滚动成为INT_MAX
  • 您能详细说明一下吗?你有什么样的问题?您是否尝试过在调试器中逐行执行代码?
  • 当我把我的车开到商店时,我从不说“它不工作,请修理它”。我说“它不起作用。当我踩刹车时,它并没有减速。请修复它。”在这里应用,“它不起作用。当我输入 X 时,结果应该是 Y,但我得到的是 Z。”

标签: c structure type-conversion minesweeper


【解决方案1】:

代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2021-12-04
    • 1970-01-01
    • 2012-12-08
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多