Помогите исправить код( нужно чтобы код содержал две функции по мимо main())

91
14 августа 2019, 05:10

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

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

while 
    ((wrong < MAX_WRONG) && (soFar != THE_WORD))
            {
                cout << "\n\nYou have " << (MAX_WRONG - wrong);
                cout << " incorrect guesses left.\n";
                cout << "\nYou've used the following letters:\n" << used << endl;
                cout << "\nSo far, the word is:\n" << soFar << endl;
                char enter_guess(string);
                int check_guess(vector<string>words);
            }

КОД:

   #include "pch.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
using namespace std;
char guess;
int wrong = 0;
const string THE_WORD;
string soFar;
string used;
char enter_guess();
int check_guess(vector<string>words);
int main()
{
    const int MAX_WRONG = 8;
    vector<string> words;
    words.push_back("GUESS");
    words.push_back("HANGMAN");
    words.push_back("DIFFICULT");
    string answer;
    cout << "Welcome to Hangman.  Good luck!\n";
    while ((answer != "No") || (answer != "no"))
    {

        while ((wrong < MAX_WRONG) && (soFar != THE_WORD))
        {
            cout << "\n\nYou have " << (MAX_WRONG - wrong);
            cout << " incorrect guesses left.\n";
            cout << "\nYou've used the following letters:\n" << used << endl;
            cout << "\nSo far, the word is:\n" << soFar << endl;
            char enter_guess(string);
            int check_guess(vector<string>words);
        }

        if (wrong == MAX_WRONG)
            cout << "\nYou've been hanged!";
        else
            cout << "\nYou guessed it!";
        cout << "\nThe word was " << THE_WORD << endl;

        cout << "\nDo you want to play again?(Enter: Yes or No) " << endl;
        cin >> answer;
    }
    return 0;
}
char enter_guess()
{
    cout << "\n\nEnter your guess: ";
    cin >> guess;
    guess = toupper(guess);
    return guess;
}
int check_guess(vector<string>words)
{
    srand(static_cast<unsigned int>(time(0)));
    random_shuffle(words.begin(), words.end());
    const string THE_WORD = words[0];
    string soFar(THE_WORD.size(), '-');
    string used = "";
    while (used.find(guess) != string::npos)
    {
        cout << "\nYou've already guessed " << guess << endl;
        cout << "Enter your guess: ";
        cin >> guess;
        guess = toupper(guess);
    }
    used += guess;
    if (THE_WORD.find(guess) != string::npos)
    {
        cout << "That's right! " << guess << " is in the word.\n";
        // update soFar to include newly guessed letter
        for (unsigned int i = 0; i < THE_WORD.length(); ++i)
        {
            if (THE_WORD[i] == guess)
            {
                soFar[i] = guess;
            }
        }
    }
    else
    {
        cout << "Sorry, " << guess << " isn't in the word.\n";
        ++wrong;
    }
    return wrong;
}

Вот этот код но без использования функций. И тут код работает. Так в чем проблема?

#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>
using namespace std;
int main()
{
    const int MAX_WRONG = 8;  
    vector<string> words;  
    words.push_back("GUESS");
    words.push_back("HANGMAN");
    words.push_back("DIFFICULT");
    string answer;
    while ((answer!="No")||(answer!="no"))
    {
        srand(static_cast<unsigned int>(time(0)));
        random_shuffle(words.begin(), words.end());
        const string THE_WORD = words[0];            
        int wrong = 0;                               
        string soFar(THE_WORD.size(), '-');          
        string used = "";                            
        cout << "Welcome to Hangman.  Good luck!\n";

        while ((wrong < MAX_WRONG) && (soFar != THE_WORD))
        {
            cout << "\n\nYou have " << (MAX_WRONG - wrong);
            cout << " incorrect guesses left.\n";
            cout << "\nYou've used the following letters:\n" << used << endl;
            cout << "\nSo far, the word is:\n" << soFar << endl;
            char guess;
            cout << "\n\nEnter your guess: ";
            cin >> guess;
            guess = toupper(guess); 
            while (used.find(guess) != string::npos)
            {
                cout << "\nYou've already guessed " << guess << endl;
                cout << "Enter your guess: ";
                cin >> guess;
                guess = toupper(guess);
            }
            used += guess;
            if (THE_WORD.find(guess) != string::npos)
            {
                cout << "That's right! " << guess << " is in the word.\n";
                // update soFar to include newly guessed letter
                for (unsigned int i = 0; i < THE_WORD.length(); ++i)
                {
                    if (THE_WORD[i] == guess)
                    {
                        soFar[i] = guess;
                    }
                }
            }
            else
            {
                cout << "Sorry, " << guess << " isn't in the word.\n";
                ++wrong;
            }
        }

        if (wrong == MAX_WRONG)
            cout << "\nYou've been hanged!";
        else
            cout << "\nYou guessed it!";
        cout << "\nThe word was " << THE_WORD << endl;

        cout << "\nDo you want to play again?(Enter: Yes or No) " << endl;
        cin >> answer;
    }
    return 0;
}
Answer 1

Вы пытаетесь в пустой строке искать какой то символ .. когда есть такая ошибка:

string used = "";
while (used.find(guess) != string::npos) {
  //...

На остальной код можно не смотреть.

Именно из за этой ошибки вы не получаете результат. Другое дело, что сама программа логически неверна. Так что это как-раз ответ, хоть и может казаться неполным

READ ALSO
Как работает метод insert в в классе Vector в с++?

Как работает метод insert в в классе Vector в с++?

В методе insert класса Vector нужно передать итератор указывающий на позицию в которую ты хочешь поместить элемент, я правильно понимаю что для...

159
Работа с указателями в С++

Работа с указателями в С++

Извините за глупый вопрос, но я только начал осваивать С++Нашел в интернете код, где написана строка, но так и не смог понять, что она означает

95
Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты?

134
Как в CMake подключить библиотеку libbacktrace?

Как в CMake подключить библиотеку libbacktrace?

Пишу проект под linux с использованием GCC и CMakeДля правильной работы boost::stacktrace понадобилось подключить библиотеку libbacktrace

98