【发布时间】:2020-03-06 07:25:56
【问题描述】:
我的任务是为 C/C++ 类创建一个简单的扫雷克隆。它需要使用 10x10 char 2D 数组作为雷区。
我需要在场地上随机放置 5 个地雷。空的地方应该用空格(' ')填充,而有地雷的地方应该用井号('#')填充。
这里是创建二维数组的代码。该数组在 main() 函数外部(上方)声明,但在 main() 函数内部进行了初始化:
...
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
static char minefield[10][10];
main(){
for (int row = 0; row < 10; row++){
for (int colm = 0; colm < 10; colm++){
minefield[row][colm] = ' ';
}
}
...
这样,我声明了数组并用空格填充了所有空格。我有一些代码可以打印出数组,它似乎包含其他字符。 但是,我无法判断这段代码是用空格填充数组还是用 null 之类的东西填充数组。
接下来,我认为问题出在的部分:种植地雷。地雷将被放置在阵列中的五个随机位置,这是处理的通过 for 循环。循环还会检查空间是否被占用,并将继续循环直到成功放置五个地雷。
...
srand(time(0)); //Defining seed for random
int randRow;
int randColm;
for (int count = 0; count < 5;){
randRow = rand() % 10;
randColm = rand() % 10;
if (minefield[randRow][randColm] != ' '){ //tests if space is occupied
continue;
}
minefield[randRow][randColm] = '#'; //planting the mine
count++;
}
...
通过一些调试,我发现代码似乎停止/挂起
minefield[randRow][randColm] = '#';
此时,程序只是终止并打印了几秒钟的执行时间。
我的 IDE 似乎没有报告任何错误(我正在使用代码块)。
我做错了什么?
【问题讨论】:
-
您提供的代码很好。错误在其他地方。最好是
int main(),而不是main()。 -
考虑在 valgrind 下运行。它会标记许多内存访问错误,希望能给你一些关于如何继续的提示。或者,只需单步执行代码。使用 gdb。
-
@Kamil Cuk 似乎更改 int main() 并不能解决问题。不过,我确实发现了一些新东西!我尝试运行该程序几次,当循环尝试检查 minefield[0][0] 并分配“#”时,它没有挂起!事情还没有发生,我不知道出了什么问题......
-
@MikeCAT 除了调试代码之外,我在此处提到的内容之外没有其他任何内容。因此,提供整个代码可能会非常混乱,而且有点无益。
标签: c arrays multidimensional-array codeblocks minesweeper