【问题标题】:C - Loop to "plant mines" in a 2D Array Minesweeper doesn't workC - 在二维阵列扫雷器中循环“种植地雷”不起作用
【发布时间】: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


【解决方案1】:

注意:

我在未显示的代码中犯了一个错误。我将变量直接放在 puts() 函数中(例如 puts(variable)),而不是使用导致程序挂起的 printf(例如 printf("%c", variable))。

直到我看到一个名为 repl.it 的网站,它有一个调试器可以告诉我哪里出了问题。

抱歉,如果这给任何人带来不便。不过还是谢谢你帮助我!

附:可能有人知道我如何在我的 Codeblocks IDE 中拥有此功能吗?当我使用 Java 的 Eclipse IDE 时包含此调试,但由于某种原因不在 Codeblocks 中。我没有使用 IDE 的经验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多