Меню создания C ++ плеера - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь создать текстовую игру для C ++.

У меня настроен класс игрока, и сейчас я работаю над методом внутри этого класса, называемым displayMenu (), который запрашивает у пользователя различные варианты. вопросов, основанных на их проигрывателе, и отправьте данные в основной / клиентский код, а затем эти данные создадут объект класса проигрывателя через конструктор класса проигрывателя.

Мой главный вопрос ...

  1. Я пытаюсь сравнить ввод (строку) от пользователя с (строкой), которая ему нужна для ввода, но я получаю ошибка, которая говорит "lower ()", не может быть решена. Я считаю, что вы должны сравнивать каждый символ, но я думаю, что может быть более эффективный способ кодирования этого, чтобы обеспечить простоту и удобочитаемость. Что именно я делаю не так? Как лучше всего это кодировать?

Вот мой код ...

void Player::displayMenu(std::string& PlaName, std::string& cName, int& lvl, int& HP)
{
    std::cout << "Player Creation Menu" << std::endl;
    std::cout << "====================" << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << "What is your name? " << std::endl;
    std::cin >> PlaName;
    std::cout << "What is your specitality? " << std::endl;
    std::cin >> cName;
    while(cName.lower() != "brawler" || cName.lower() != "thief" || cName.lower() != "persuader" || cName.lower()
            != "gunman")
    {
        std::cout << "That is not your true specitality..." << std::endl;
        std::cout << "You must pick from { 'Brawler', 'Thief' , 'Persuader', 'Gunman' }" << std::endl;
        std::cin >> cName;

    }
}

1 Ответ

0 голосов
/ 28 марта 2020

У меня есть несколько замечаний относительно вашего исходного кода:

  1. Чтение и сравнение строк кажется немного сложным для этого варианта использования. Распространено видеть использование первого символа в качестве идентификатора, чтобы упростить его.
  2. Специальность - пример classi c для enum (или enum class, который является enum, который вы должны использовать всегда с его именем )
  3. Метод displayMenu не должен быть частью класса Player, поскольку он не является поведением (действием) игрока. Он должен быть частью класса "Game" / "UI".

Если вы действительно хотите использовать полную строку для определения специальности, вы можете использовать примеры кода в первом ответе в ссылке Айксан поставить в комментариях.

Вот мой предложенный код:

#include <iostream>

constexpr char INVALID_CHARACTER_INPUT = '@';

enum class CharacterSpecialty 
{
    BRAWLER,
    THIEF,
    PERSUADER,
    GUNMAN,
    NUM_OF_SPECIALITY_TYPES
};
`
class Player
{
    public:
        Player(const std::string& player_name, CharacterSpecialty char_specialty) :
            name(player_name),
            specialty(char_specialty)
        {
        }
    private:
    std::string name;
    CharacterSpecialty specialty;
};

Player displayMenuAndCreatePlayer()
{
    std::cout << "\nPlayer Creation Menu\n"  << "====================\n\n" << std::endl;

    std::cout << "Enter your name: " << std::endl;
    std::string player_name{};
    std::cin >> player_name;

    CharacterSpecialty char_specialty = CharacterSpecialty::NUM_OF_SPECIALITY_TYPES;

    while(char_specialty == CharacterSpecialty::NUM_OF_SPECIALITY_TYPES)
    {
        std::cout << "What is your specialty?\n" << "[B]rawler, [T]hief, [P]ersuader or [G]unman"<< std::endl;
        std::string char_type_input;
        std::cin >> char_type_input;

        char input = char_type_input.size() == 1 ? char_type_input[0] : INVALID_CHARACTER_INPUT;

        switch(char_type_input)
        {
            case 'b':
            case 'B':
                char_specialty = CharacterSpecialty::BRAWLER;
                break;
            case 't':
            case 'T':
                char_specialty = CharacterSpecialty::THIEF;
                break;
            case 'p':
            case 'P':
                char_specialty = CharacterSpecialty::PERSUADER;
                break;
            case 'g':
            case 'G':
                char_specialty = CharacterSpecialty::GUNMAN;
                break;
            default:
                std::cout << "Invalid Specialty Entered!\n" << std::endl;
                break;
        }
    }

    return Player(player_name, char_specialty);
}

int main()
{
    Player player = displayMenuAndCreatePlayer();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...