首页 > 解决方案 > C++ 播放器创建菜单

问题描述

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

解决方案


我对您的原始代码有几点意见:

  1. 对于这个用例,读取和比较字符串似乎有点复杂。通常将第一个字符用作标识符,以使其更简单。
  2. 该专业是枚举(或枚举类,它是您必须始终与它的名称一起使用的枚举)的经典示例
  3. displayMenu 方法不应该是 Player 类的一部分,因为它不是玩家的行为(动作)。它应该是“游戏”/“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();
}

推荐阅读