函数返回C';行不通
我是c语言的新手,正在尝试创建扫雷游戏。我认为我的代码在数据类型转换方面有一些问题,但我不明白为什么。选中此链接 并试图在我的代码中实现这些信息 我正在尝试实现一个函数,该函数返回具有地雷的x,y坐标2D阵列的相邻位置数函数返回C';行不通,c,structure,type-conversion,minesweeper,C,Structure,Type Conversion,Minesweeper,我是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;
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;
}
int邻域(常量字段*f,无符号整数x,无符号整数y)
{
int z=0;
int i,j;
无符号整数a=y-1;
j=(int)a;
无符号整数b=x-1;
i=(int)b;
对于(;j=0&&jysize){
对于(;i=0&&ixsize&&(f->places[j][i]==未知矿| f->places[j][i]==已知矿)){
z++;
}
}
i=b;
}
}
返回z;
}
代码
unsigned a = y-1;
如果y==0,则为您提供一个==UINT\u MAX
状况
j >= 0
只是说“如果这个非负整数不是负的”,所以不是很有帮助
一个好主意是使用一些填充来存储数据,在矩形映射的每一侧填充一个宽度的整数,所有这些整数都有一个uniqe值,您可以称之为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;
}
什么不起作用?如果
x
或y
始终为0,则x-1
和y-1
将不会为您提供-1
,因为它们没有签名。取而代之的是,它将变成INT\u MAX
,您能详细说明一下吗?你有什么问题?你有没有试过在调试程序中一行一行地调试代码?当我开车去商店时,我从来不会说“它坏了,请修理一下”。我说“它不起作用。当我踩到刹车时,它不会减速。请修复它。”在这里应用“它不起作用。当我输入X时,结果应该是Y,但我得到Z。”
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;
}
.....
}