Проверка на совпадение символов в игре поиска слов

Я разрабатываю генератор поиска слов, чтобы лучше изучать C++, и я застрял в предотвращении перекрытия непересекающихся слов, таких как параллельное написание слова поверх буквы в нисходящем слове. Вот фрагмент кода:

else if (random_choice == 1 && random_word.size() <= 10-j && words_vector.size() != 0) {
    flag = true;
    for (int x = 0; x < random_word.size(); x++) {
        if (wordsearch[i][j+x] != '0') {
            flag = false;
            break;
        }
    }
    if (flag = true) {
        for (int x = 0; x < random_word.size(); x++) {
            wordsearch[i][j] = random_word[x];
            j += 1;
        }
        j -= 1;
        words_found_vector.insert(words_found_vector.begin(),words_vector[random_word_number]);
        //words_vector.erase(words_vector.begin()+random_word_number);
    }
    else {
        wordsearch[i][j] = '1';
    }
}

Что я сделал, так это создал двумерный массив [10][11], заполненный символом 0 (ноль), поэтому, когда я перебираю его, все пробелы заполняются 0, за исключением 11-го пробела в каждой строке с символом новой строки, чтобы сделать сетка 10X10. В моем цикле else if в первой части уже выбрано слово, и оно проверяет, будет ли слово помещаться в нужном месте, проверяя наличие 0. Если он встречается с ненулевым символом (например, если он встречается с буквой из слова сверху вниз или диагонального слова), внутренний цикл завершается, устанавливает логический флаг и вводит 1 (или любую случайную букву) вместо целый мир. Что происходит, так это то, что все слово вставляется в любом случае и перезаписывает одну букву сверху вниз. Что я делаю неправильно? Вот остальная часть кода:

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    srand(time(NULL));
    const char* const a_to_z = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;

    int random_char;

    char wordsearch [10][11] = {0};

    bool flag;

    string words_array[] = {"CAT", "HELLO", "GOODBYE", "DOG", "BAT", "NEW", "SAY", "MAY", "DAY", "HAY"};
    vector<string> words_vector (words_array, words_array + sizeof(words_array) / sizeof(string));

    string words_found_array[] = {};
    vector<string> words_found_vector (words_found_array, words_found_array + sizeof(words_found_array) / sizeof(string));

    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 11; j++) {
            int random_choice = rand() % 5;
            int random_word_number = rand() % words_vector.size();
            string random_word = words_vector[random_word_number];

            if (j == 10) {
                wordsearch[i][j] = '\n';
            }
            else if (random_choice == 1 && random_word.size() <= 10-j && words_vector.size() != 0) {
                flag = true;
                for (int x = 0; x < random_word.size(); x++) {
                    if (wordsearch[i][j+x] != '0') {
                        flag = false;
                        break;
                    }

                }
                if (flag = true) {
                    for (int x = 0; x < random_word.size(); x++) {
                        wordsearch[i][j] = random_word[x];
                        j += 1;
                    }
                    j -= 1;
                    words_found_vector.insert(words_found_vector.begin(),words_vector[random_word_number]);
                    //words_vector.erase(words_vector.begin()+random_word_number);
                }
                else {
                    wordsearch[i][j] = '1';
                }
            }
            else if (random_choice == 2 && random_word.size() <= 10-i && words_vector.size() != 0) {
                int temp_i = i;
                flag = true;
                for (int x = 0; x < random_word.size(); x++) {
                    if (wordsearch[i+x][j] != '0') {
                        flag = false;
                        break;
                    }
                }
                if (flag = true) {
                    for (int x = 0; x < random_word.size(); x++) {
                        wordsearch[i][j] = random_word[x];
                        i += 1;
                    }
                    i = temp_i;
                    words_found_vector.insert(words_found_vector.begin(),words_vector[random_word_number]);
                    //words_vector.erase(words_vector.begin()+random_word_number);
                }
                else {
                    wordsearch[i][j] = '1';
                }
            }
            else {
                int random_char = rand() % 26 + 0;
                wordsearch[i][j] = a_to_z[random_char];
            }
        }
    }
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 11; j++) {
                cout<<wordsearch[i][j];
        }
    }

    cout<<"Your words are:"<<endl;
    for (int x = 0; x < words_found_vector.size(); x++) {
        cout<<words_found_vector[x]<<endl;
    }
}

Еще кое-что:

//words_vector.erase(words_vector.begin()+random_word_number);

вылетает моя программа. Я думаю, что это проблема с этим:

int random_choice = rand() % 5;
int random_word_number = rand() % words_vector.size();
string random_word = words_vector[random_word_number];

В конечном итоге я хочу, чтобы пользователь дал мне список слов, которые он хочет найти, и эта функция выбирает некоторые из них и представляет их пользователю во время игры. Неправильное функционирование также приводит к появлению дубликатов в кроссворде и списке слов для поиска.

Спасибо за помощь!

1 ответ

Решение

У вас есть эта ошибка дважды в вашем коде:

if (flag = true)

Это не условие, это задание. Назначает true в flagи блок if будет выполняться всегда. Вы должны сделать это условие сравнения с помощью ==

if (flag == true)

Более распространенный способ написать это в C++ будет просто

if (flag)
Другие вопросы по тегам