Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 18:34   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Движок для текстового квеста

Я самоучка. Вообще-то учусь на факультете лигвистики, ну а С++ - тоже ж ведь язык ))) Вот и интересуюсь.
Горит энтузиазм, изучаются библиотеки Qt и SDL. Но толку-то, если, зная синтаксис, спотыкаешься на простых вещах?
Я пытаюсь написать движок для текстового квеста. Мысль пришла на фонетике, мне она показалась довольно здравой. Значит, излагаю.

Команда делится на две части - action (действие) и object (предмет, над которым это действие совершается)
Есть несколько функций, обозначающих какое-либо действие:

void Take(object); //Взять предмет
void Look(object); //Посмотреть на предмет

Сами части команды представляют собой символьные массивы:

char action[];
char object[];

Мы их вводим, и после ввода вызывается функция void Analysis(action), которая анализирует действие с помощью оператора switch и выбирает то, что подходит.

switch(action){
case "возьми": {Take(object); break;}
case "посмотри": {Look(object);break;}
default: {cout << "Неправильная команда"; break;}

Затем в соответствие с действием вызывается одна из вышеописанных функций действия, которая совершает надругательство над предметом, тем же образом при помощи switch:

void Take(object){
switch(object){
case "гитара": {cout << "Вы взяли гитару."; break;}
case "медиатор": {cout << "Вы взяли медиатор."; break;}
default: {cout << "Неверная команда.";break;}
}
Всё это, конечно, схематично, но в любом случае я написал исходник правильно с точки зрения синтаксиса. Но не работает. Ошибки при компиляции. Все перечилсять лень, честное пионерское. Здесь я полагаюсь на ваш здравый смысл.
Ошибка в алгоритме, быть может, неправильное использование операторов и т.д.
Скажите, в чём я ошибаюсь?
Кипящий чайник вне форума Ответить с цитированием
Старый 17.12.2009, 18:56   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Действительно есть ошибки )
Во-первых нельзя объявлять массив без размера
Код:
char action[]; // Нельзя :)
char object[];

char* action; // Можно :)
char* object;
Во-вторых, в switch могут присутствовать только интегральные типы
Код:
switch(object) { // Нельзя :)
case "гитара":...
case "медиатор":...
}

int digit;
switch(digit) { // Можно :)
    case 0: ...
    case 1: ...
}

char Char;
switch(Char) { // Можно :)
    case 'a':...
    case 'b':...
}
А вообще я бы советовал поучить классы, с их использованием всё можно сделать гораздо красивее и проще
netrino вне форума Ответить с цитированием
Старый 17.12.2009, 19:24   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

С классами я хотел бы повременить пока. а точнее, реализовать с помощью них инвентарь.
Возвращаясь к switch, выходит, что только один символ может в нём учавствовать?
Кипящий чайник вне форума Ответить с цитированием
Старый 17.12.2009, 19:25   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

#2 А я думал что, например,

case "гитара": {cout << "Вы взяли гитару."; break;}

Это тоже схематика, в смысле именно "Гитара", что в реальном коде это заменит какое - нибудь перечисление, потому что это совсем несерьезно ...
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 17.12.2009, 21:56   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
С классами я хотел бы повременить пока. а точнее, реализовать с помощью них инвентарь.
Возвращаясь к switch, выходит, что только один символ может в нём учавствовать?
Да, один символ, или ещё какое-нибудь число. По-моему тут нужно классами реализовывать и инвентарь и объект и ГГ(главного героя), у которого будут методы "подобрать", "бросить" и т.д. Хотя играми я не занимался, может кто-то другой посоветует чего лучше, можете обратится в соответствующий раздел этого форума в поисках других идей )
netrino вне форума Ответить с цитированием
Старый 18.12.2009, 06:08   #6
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Хм... Весьма интересно. Оставим пока обсуждение классов, обратимся к их методам.
Возможно ли при помощи enum пронумеровать, преположим, предметы и команды, а потом заставить программу распозновать уже цифры вместо этих команд? Если можно, можете подсказать, как правильно это реализовать?
Кипящий чайник вне форума Ответить с цитированием
Старый 18.12.2009, 17:19   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Безусловно можно
Код:
enum Objects {
    Obj_Guitar,
    Obj_Table,
    Obj_Apple
...
};
void touch(Objects o)
{
     switch(o) {
         case Obj_Guitar: cout << "You get the guitar" << endl; break;
         case Obj_Table: cout << "You get the table" << endl; break;
         case Obj_Apple: cout << "You get the apple" << endl; break;
...
     }
}
netrino вне форума Ответить с цитированием
Старый 18.12.2009, 18:22   #8
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Да, я сегодня на экономике учебник листал, сам понял, что можно. Но вот в чём беда. Я хочу реализовать предметы в игре с помощью класса:

class Item{
char* name[]; //Название
char* description[]; Описание предмета
};

Возможно ли, если объект уже пронумерован в enum, чтобы он обладал ещё какими-то полями?
Кипящий чайник вне форума Ответить с цитированием
Старый 18.12.2009, 18:32   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

То есть? enum, на деле, это лишь численные константы, то есть
Код:
enum Nums {
    One, 
    Two, 
    Three
};
эквивалентно записи:
Код:
const int One = 0;
const int Two = 1;
const int Three = 2;
классы в перечисление не получится добавлять.
char* name[] - массив указателей. Пишите просто:
Код:
class Item {
    char* name;
    char* description;
};
В данном случае я бы советовал сделать класс Item абстрактным, содержащим общий набор методов для всех объектов, а потом уже порождать от него специфические классы
netrino вне форума Ответить с цитированием
Старый 18.12.2009, 19:24   #10
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Если честно, я подзабыл, что значит "абстрактный". Это класс-прародитель, сам по себе ничего не значащий, но ведущий целую цепочку наследников, имеющих уже определённые свойства?
Кипящий чайник вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движок для игрового портала. Extreme WordPress и другие CMS 5 07.01.2011 18:46
Движок для сайта. artem1989 Помощь студентам 1 05.10.2009 20:25
код для текстового редактора Михаил Юрьевич Общие вопросы Delphi 9 08.03.2008 20:11
Бесплатный движок для САЙТА на Java Script для Бесплатных Хостингов антигерой HTML и CSS 0 15.04.2007 21:39