Мне нужна помощь с C ++, пожалуйста!
Я пишу синтаксический анализатор команд для небольшой текстовой игры, и у меня возникли некоторые проблемы. Парсер должен читать и анализировать команды, введенные игроком.
Наиболее очевидным и простым решением может быть что-то вроде этого (написано псевдокодом):
command <- read input from the player
if command == COMMAND1
do command1
else if command == COMMAND 2
do command2
...
Я пишу на C ++, поэтому я подумал, что могу решить эту проблему, используя ассоциативную карту и указатели функций . Я не так хорошо знаком с использованием указателей функций, поэтому, возможно, поэтому у меня проблемы. Что я хочу сделать, так это создать какой-то цикл, который ожидает ввода, анализирует ввод, который вставлен, и вызывает функцию в зависимости от заданной команды. Вот некоторый псевдокод C ++, описывающий то, о чем я думаю:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
... // here, I get stuck on what to do..
}
Итак, я надеюсь, что я в некоторой степени прояснил, что я хочу сделать. Игрок мог ввести что-то вроде
> go south
, и я мог бы закончить код чем-то вроде:
destination = strtok(NULL, " ");
fptr(destination);
По сути, значение, возвращаемое с карты, будет функцией, которая выполняет команду "go", и эта функция, очевидно, принимает один аргумент, место назначения. Опять же, это некий C ++ - псевдо-код. Так что я получил команду "идти". Но теперь скажите, что я хочу получить следующую команду:
> attack troll with sword
Теперь я чувствую, что мне нужно сделать что-то вроде:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
if(tok == "go"){
destination = strtok(NULL, " ");
fptr(destination);
} else if (tok == "attack") {
target = strtok(NULL, " ");
weapon = strtok(NULL, " ");
fptr(target, weapon);
}
}
Опять же, это псевдокод. Вы, наверное, видите, на чем я зацикливаюсь: у меня есть карта указателей функций, но поскольку у меня есть переменное количество аргументов и тип аргументов, потому что я хочу вызывать разные функции в зависимости от того, что я получил в качестве входных данных, я мог бы просто сделать это без карты и указателей функций, как я показал вам сначала. Есть ли способ сделать это более общим, не прибегая к условию if-else, чтобы выяснить, сколько аргументов нужно передать?
Надеюсь, вы понимаете, с чем мне нужна помощь :) Спасибо за чтение!