用c初始化扫雷舰

用c初始化扫雷舰,c,initialization,minesweeper,C,Initialization,Minesweeper,我目前正在使用CSFML库用C重写一个扫雷舰程序 我在第一次单击之后才管理初始化时遇到了一些问题,更确切地说,在我应该将单击周围的平铺设置为空的部分 我找不到一种方法,在没有拆除炸弹的风险的情况下,让这些瓷砖变空。 下面是我目前的init代码块: int current = 0; temp.bombs = BOMB_EASY; temp.difficulty = EASY; temp.mapEasy = malloc(sizeof(sTILE *) * (Y_EASY

我目前正在使用CSFML库用C重写一个扫雷舰程序

我在第一次单击之后才管理初始化时遇到了一些问题,更确切地说,在我应该将单击周围的平铺设置为空的部分

我找不到一种方法,在没有拆除炸弹的风险的情况下,让这些瓷砖变空。 下面是我目前的init代码块:

int current = 0;

    temp.bombs = BOMB_EASY;
    temp.difficulty = EASY;
    temp.mapEasy = malloc(sizeof(sTILE *) * (Y_EASY + 1));

    for (int i = 0; i < Y_EASY + 1 ; i++)
    {
        temp.mapEasy[i] = malloc(sizeof(sTILE) * (X_EASY + 1));
    }

    for (int i = 0; i < X_EASY + 1; i++)
    {
        temp.mapEasy[Y_EASY][i].type = 0;
    }

    while (current < BOMB_EASY)
    {
        for (int i = 0; i < Y_EASY; i++)
        {
            for (int j = 0; j < X_EASY; j++)
            {
                int isBomb = rand() % 10;
                if (isBomb == 0 && current < BOMB_EASY && temp.mapEasy[i][j].type != 9)
                {
                    temp.mapEasy[i][j].type = 9;
                    current++;
                }
                else if (temp.mapEasy[i][j].type != 9)
                {
                    temp.mapEasy[i][j].type = 0;
                }
            }
        }
    }

    for (int i = 0; i < Y_EASY; i++)
    {
        for (int j = 0; j < X_EASY; j++)
        {
            if (temp.mapEasy[i][j].type == 0)
            {
                temp.mapEasy[i][j].type = HowManyBombs(temp.mapEasy, i, j, Y_EASY, X_EASY);
            }
            temp.mapEasy[i][j].isRevealed = sfFalse;
            temp.mapEasy[i][j].isFlagged = sfFalse;
        }
    }
}
int电流=0;
临时炸弹=炸弹简易;
暂时困难=容易;
temp.mapEasy=malloc(sizeof(sTILE*)*(Y_EASY+1));
for(int i=0;i
我知道我的问题可能看起来很愚蠢,可能有人已经回答了,但我找不到答案,所以感谢那些回答我的人

  • 创建一个空矩阵
  • 在任意位置填充n个地雷。生成(x,y)坐标后,检查是否已获取坐标
  • 如果已经获得坐标,则应将地雷放置在下一个可用位置

    例如,通过将x增加1,检查是否可用,如果不可用,则再次增加x。到达行的末尾时,增加y,然后从x=0开始

    如果你只是简单地生成一个新的随机数,你的算法在理论上可能永远陷入困境。在实践中,它可能会起作用,但我认为这种算法生成网格的速度比只选择下一个空闲点的算法要慢



  • 1) rand()调用开销是该算法中最可能的瓶颈。但是,如果您选择下一个位置而不是再次调用rand(),那么CPU可能会在预取数据缓存中推测性地加载(部分)阵列。如果每次选择内存位置时内存位置都是随机的,那么这是不可能的

    如果你运气不好,你的
    while
    循环将永远运行,即
    rand()%10
    没有足够的次数返回
    0
    。您应该运行
    current
    0
    BOMB\u EASY
    ,并使用
    rand()
    确定炸弹的坐标。还有几句话:1)为什么变量有
    \u EASY
    后缀?2) 你将矩阵分配到
    (Y\u EASY+1)*(X\u EASY+1)
    ,但你只将其索引到
    [Y\u EASY][X\u EASY]
    ,这是为什么?为了回答你的问题,Groo:1)我的变量有_EASY后缀,因为我在其他数组中存储了其他困难,因为我没有找到一种方法来使用单个数组来解决所有困难。2) 为了避免分段错误或堆栈溢出,我分配了超过限制的一个单元,这样可以避免数组填充超出我的电路板,但我承认这并不是真的必要。谢谢你的建议,我还没有想过要这样做,我现在就试试。我想可能是这样,但这表明你有不同的功能,不同的难度,这是不必要的。这些值应该是函数的参数,因为无论电路板大小或炸弹数量如何,算法都应该是相同的。