我正在尝试用 C 语言编写扫雷程序。我首先将值分配给二维数组,然后打印它。我尝试了一切,但没有成功。
这发生在我的示例输出中:
代码是:
#include <stdio.h>
#include <stdlib.h>
struct Tile {
unsigned char isMine : 1;
char status;
};
int main() {
struct Tile arr[9][9];
unsigned char i;
unsigned char c;
unsigned char count = 10;
srand((unsigned)time(0));
for (i = 0; i < 9; i++) {
for (c = 0; i < 9; i++) {
if(rand() % 81 + 1 < count && arr[i][c].isMine == 0 && count > 0) {
arr[i][c].isMine = 1;
arr[i][c].status = 'X';
count--;
} else if (arr[i][c].isMine == 0) {
arr[i][c].status = '.';
}
}
if (count == 0) {
break;
} else {
continue;
}
}
for (i = 0; i < 9; i++) {
for (c = 0; c < 9; c++) {
printf("%c", arr[i][c].status);
}
printf("\n");
}
return 0;
}
请帮忙。
最佳答案
由于循环标题不正确,您永远不会访问循环中除第一列之外的任何字段:
for (i = 0; i < 9; i++) {
for (c = 0; i < 9; i++) {
if(rand() % 81 + 1 < count && arr[i][c].isMine == 0 && count > 0) {
arr[i][c].isMine = 1;
arr[i][c].status = 'X';
count--;
} else if (arr[i][c].isMine == 0) {
arr[i][c].status = '.';
}
}
if (count == 0) {
break;
} else {
continue;
}
}
这将使所有其他字段未初始化,当您尝试打印它时,可能会出现奇怪的事情。
此外,由于您只访问每个字段一次(或者至少这似乎是您的意图),因此无需检查 isMine
根本不。如果初始化正确的话,无论如何它一定是0。
这当然要求您正确初始化,正如大卫的回答中已经提到的那样。
条件可以稍微减少一点,因为第一部分 ( ..+1<count
) 已经暗示 count>0
。无需再次检查。
最后,continue
因为循环的最后一条指令并不是很有用。
您的代码可能如下所示:
struct Tile arr[9][9] = {{0}};;
...
for (i = 0; i < 9; i++) {
for (c = 0; c < 9; c++) {
if(rand() % 81 + 1 < count) {
arr[i][c].isMine = 1;
arr[i][c].status = 'X';
count--;
} else {
arr[i][c].status = '.';
}
}
if (count == 0) {
break;
}
}
关于c - 为什么编写这个程序会输出奇怪的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64338507/