2015-02-02 4 views
0

Я строю текстовую игру на C++ в качестве побочного проекта в своем обучении, и поэтому я пытаюсь найти способ для строки, которая будет оцениваться в двух половинах. Он проверит первое слово, затем, если слово будет распознано, он увидит, что это за слово. Например, если вход в getln(); это «взять яблоко», он распознает «взять», а затем проверяет, что именно вы делаете во второй половине строки. Прямо сейчас единственный способ, которым я могу это сделать, - это игрок, входящий в «take», и это приводит к тонне вложенных операторов if/else.Сравните строку в две половины

+0

Чтобы избежать цепи 'если/else' заявления , используйте 'std :: unordered_map >' для проверки и отправки команд –

ответ

0

Что я хотел бы сделать, это получить данные от пользователя, а затем разбить строку, используя «» в качестве разделителя. У вас все еще есть вложенный оператор if, но это избавит пользователя от необходимости вводить ввод дважды.

См. this post, чтобы узнать больше о разбиении строк на C++.

+0

Спасибо, это большая помощь. –

1

Вы можете попытаться ввести tokenise входную строку в свои компоненты. Тогда, учитывая, что вы используете C++, я хотел бы предложить условную свободной конструкции с polymorphy:

Создать базовый Тип:

class Command { 
    public: 
    virtual void exec(::std::vector<::std::string> parameters) = 0; 
}; 

Затем создать подкомандами, например:

class TakeCommand : public Command { 
    public: 
    virtual void exec(::std::vector<::std::string> parameters); 
}; 

Тогда, во время запуска, строить из себя, словарь (или Trie, если вы чувствуете себя денди) типа

::std::map<::std::string,::std::shared_ptr<Command>> commandProcessor; 

Как это карта, вы можете проверить, если команда существует:

auto const it = commandProcessor.find(tokens[0]); 
if (it != commandProcessor.end()) 
    it->second->exec(tokens); 
    // you might want to strip the first token from the vector first! 

Любой тип/функции вы не знакомы с, вы можете поиска в http://en.cppreference.com/w/

Смежные вопросы