чтение и запись файла для игры

#c #fstream #ifstream #ofstream #turbo-c

#c #fstream #ifstream #ofstream #turbo-c

Вопрос:

Я создаю игру со случайными инициализированными буквами (напр. B A S T E N), и пользователь введет как можно больше слов, используя только эти буквы. У меня есть файл, в котором есть правильные слова с соответствующими точками. Моя проблема в том, как мне запретить пользователю использовать одни и те же слова снова и снова?

Я пытаюсь использовать ofstream, чтобы всякий раз, когда пользователь вводит правильное слово, оно добавлялось в пустой файл

 void start()
{
    char ch;
    do {
        clrscr();
        long* newptr = 0;
        time_t start = time(newptr);
        char arr[10][50] = {" B A N S E T ", " R E D G A E ", " S A H L E S ", " P R G N I S ",
                            " A L E R L Y ", " L A C S A U ", " A C Q U K Y ", " M B L U E J ",
                            " Z E D Z U B ", " L E A Z D Z "};
        int i = 0, sum, x;
        while (i != 2) {
            clrscr();
            sum = 0;
            do {
                clrscr();
                cout << "t**********************************************n";
                cout << "t*             W O R D  S E E K E R           *n";
                cout << "t**********************************************n";
                cout << "nttttt SCORE: " << sum << " /50 pts"
                     << "n                  ******************************n";
                cout << "                  *       " << arr[i] << "        *n";
                cout << "                  ******************************nn";
                cout << " 6 letter=10pts, 5 letter=8pts, 4 letters=6pts, 3 letter=4ptsnn";
                char a[20], b[20];
                int c;

                // this is where I have my problem
                if (i == 0) {
                    ifstream fin;
                    fin.open("lvl1.txt");
                    if (fin.fail()) {
                        cout << "File doesn't exist!";
                        exit(1);
                    }
                    ofstream fout;
                    fout.open("trial.txt");
                    if (fout.fail()) {
                        cout << "Output file opening failed.n";
                    }
                    cout << "tEnter word: ";
                    cin >> a;

                    do {
                        fout << a;
                        fin >> b >> c;
                        if (fin.eof() == 1) {
                            cout << "Incorrect! Try Again!";
                            delay(1000);
                            exit(1);
                        }
                    } while (strcmp(a, b) != 0);
                    fin.close();
                    if (strcmp(a, b) == 0) {
                        sum  = c;
                    }
                }
            } while (sum < 50);
            i  ;
        }
        x = time(newptr) - start;
        cout << "ntGood Job! Your time is " << x << " secondsn";
        cout << "tDo you want to continue?(Y/N): ";
        cin >> ch;
    } while (ch != 'n' || ch != 'N');
}
 

Комментарии:

1. Пожалуйста, представьте свой код в удобочитаемом формате. Я не собираюсь читать ваш хаотичный код. Один оператор на строку, правильный отступ и так далее. Есть даже программы, которые выполняют форматирование за вас. Используйте их.

2. @RolandIllig Я отредактировал ту часть, где находятся ifstream и ofstream, извините, если это беспорядок.

3. Я прогнал его через clang-format для вас. Если вы сами не используете clang-format, то вы можете (в будущем) использовать для этого онлайн-сервис .

4. @NikosC. большое вам спасибо, извините, я все еще нуб, когда дело доходит до такого рода вещей.

Ответ №1:

Вопрос в том, хотите ли вы запоминать слова во время выполнения или после завершения программы.

Чтобы запомнить слова после завершения программы, запишите их в файл.

Чтобы запомнить слова, введенные пользователем во время выполнения, используйте контейнер, например std::vector . Добавьте слово в контейнер, затем отсортируйте контейнер. Вы можете использовать std::binary_search , чтобы найти слово в контейнере перед добавлением.

Комментарии:

1. Предпочтительно последнее, чтобы мне не нужно было удалять слова из файла каждый раз, когда новый пользователь пытается играть. Также я забыл сказать вам, что мне разрешено использовать turbo c только для проекта

2. Спросите своего преподавателя, почему вы должны использовать Turbo C , очень старый компилятор, когда вы можете бесплатно скачать современный бесплатный компилятор (или использовать онлайн-компилятор для небольших проектов). Школе действительно нужно изменить свою учебную программу.

3. Хорошим решением для рассматриваемой проблемы было бы std::unordered_set вместо std::vector .

4. Если у вас его нет std::vector , вам нужно будет написать его самостоятельно. Динамически выделите массив размером N. Когда массив заполнится, выделите новый, больший массив; скопируйте старый массив в новый массив, затем удалите старый массив.

5. Еще одно предложение — написать свой собственный связанный список и использовать сортировку вставки со словами.