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