【问题标题】:C++ Player Creation MenuC++ 播放器创建菜单
【发布时间】:2020-07-09 06:15:28
【问题描述】:

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

    }
}

【问题讨论】:

  • std::string 没有名为 lower 的方法。
  • 这能回答你的问题吗? How to convert std::string to lower case?
  • 您可能需要考虑为菜单使用表格。条目可以包括指向要为选择执行的函数的指针。还可以在互联网上搜索“c++ 状态设计模式”。
  • @Ayxan 是的,但我怎么编码呢?这太疯狂了,就像我如何逐个字符地检查并确保它是正确的??
  • 不确定什么对你来说很疯狂。链接的副本通过代码示例有一个很好的答案。但是遍历一个字符串并对每个字符应用一个函数无论如何都应该是一项基本任务。把它当作一个挑战;)

标签: c++ string class


【解决方案1】:

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

  1. 对于这个用例来说,读取和比较字符串似乎有点复杂。通常将第一个字符用作标识符,以使其更简单。
  2. 该专长是枚举的经典示例(或枚举类,即您必须始终使用其名称的枚举)
  3. displayMenu 方法不应该是 Player 类的一部分,因为它不是玩家的行为(动作)。它应该是“Game”/“UI”类的一部分。

如果你真的想使用完整的字符串来识别专业,你可以使用第一个答案中的代码示例链接Ayxan放入cmets。

这是我建议的代码:

#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();
}

【讨论】:

  • 有没有可以私信给我解释一下代码?
  • 据我所知,没有办法通过 SO 进行通信。如果连接到这个代码,你可以在这里询问是否需要。
  • 好吧,我有很多问题。我将如何开始制作基于文本的游戏?我应该从哪里开始?有哪些好的做法?我觉得我开始了一个项目,然后我碰壁了,然后我觉得我的方向完全错误,没有编写正确的代码来完成项目。感觉我已经很远了..
  • 从设计项目开始——在开始编程之前,您必须知道要做什么。当你知道你想做什么时,想想你将如何把它写下来(这并不意味着你需要 100% 知道它)。主要是如何将代码划分为类(并始终记住规则 - 1 类 1 责任!)。你甚至可以画出项目的类图。然后,当您遇到困难时,请查看 SO 中已回答的问题。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多