0

我正在开发一个 wordsearch 生成器来更好地学习 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';
    }
}

我所做的是创建一个用 0(零)字符填充的二维数组 [10][11],所以当我遍历它时,所有空格都用 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];

我想要做的是最终让用户给我一个他们想要搜索的单词列表,这个功能会选择其中的一些并在玩游戏时将其呈现给用户。这无法正常工作也会导致重复出现在填字游戏和单词查找列表中。

谢谢您的帮助!

4

1 回答 1

0

您的代码中有两次此错误:

if (flag = true)

不是条件,而是任务。它分配trueflag,并且 if 块将始终执行。您需要通过使用使其成为比较条件==

if (flag == true)

用 C++ 编写的更常见的方法是

if (flag)
于 2013-08-10T20:19:23.657 回答