[C ++ Player创建菜单

问题描述 投票:-1回答:1

我正在尝试制作基于文本的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;

    }
}
c++ string class
1个回答
0
投票

我对您的原始代码有几点评论:

  1. 在此用例中,读取和比较字符串似乎有些复杂。通常会看到使用第一个字符作为标识符,以使其更简单。
  2. 专业是枚举(或枚举类,必须始终使用其名称的枚举)的经典示例)
  3. displayMenu方法不应属于Player类,因为它不是播放器的行为(动作)。它应该是“ Game” /“ UI”类的一部分。

如果您真的想使用完整的字符串来识别专业,则可以在注释中链接Ayxan的第一个答案中使用代码示例。

这是我建议的代码:

#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();
}
© www.soinside.com 2019 - 2024. All rights reserved.