Инициализировать тральщик в c - PullRequest
0 голосов
/ 06 февраля 2020

В настоящее время я переписываю программу тральщика в C с использованием библиотеки CSFML.

У меня возникают некоторые проблемы с управлением инициализацией только после первого щелчка, точнее в той части, где я ' Я должен установить плитки вокруг клика пустыми.

Я не могу найти способ сделать эти плитки пустыми, не рискуя убрать некоторые бомбы. Вот мой блок кода инициализации на данный момент:

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;
        }
    }
}

Я знаю, что мой вопрос может показаться глупым, и кто-то, возможно, уже ответил на него, но я не смог найти ответ, так что спасибо тем, кто ответит мне.

1 Ответ

0 голосов
/ 06 февраля 2020
  1. Создать пустую матрицу
  2. Заполните ее n минами в случайных местах. После генерации (x, y) координат проверьте, были ли они уже взяты.
  3. Если координаты уже взяты, вы должны поместить мину в следующую доступную позицию.

    Например, увеличив х на 1, проверьте, свободен ли, если нет, увеличьте х снова. Достигнув конца строки, вместо этого увеличьте y и начните с x = 0.

    Если вы просто сгенерируете новое случайное число, ваш алгоритм теоретически может застрять. На практике это, вероятно, будет работать, но я ожидаю, что такой алгоритм будет генерировать сетку медленнее 1) , чем алгоритм, который просто выбирает следующую свободную точку.


1) Затраты на вызов rand () являются наиболее вероятным узким местом в этом алгоритме. Но также, если вы выберете следующую точку вместо повторного вызова rand (), ЦП может спекулятивно загружать (части) массив в кэш данных предварительной выборки. Это было бы невозможно, когда ячейка памяти буквально случайна каждый раз, когда вы ее выбираете.

...