Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Совет по организации программы


Автор: G_R_E_M_L_I_N 2.5.2007, 21:43
Доброго всем времени суток.Объясню ситуацию.
Это пока все умозаключительно,в мыслях так сказать,хочу услышать Ваши советы по поводу всего этого.

Итак:
Код

Существует игровой мир,просто статичная картинка,на которой нарисовано 10 дверей,входы в локации.
Открыта только первая дверь,куда и может(пока)зайти главный герой.Каждая локация населена 1 персонажем,который может,
согласно сценария давать ГГ предметы.После посещения ГГ локации,он выходит из нее с какими-то предметами,
на главный экран(тот что с дверьми),причем в зависимости от полученных предметов открываются дополнительные локации.
Потом мы заходим в любую открытую локацию,и начинаем общение с персонажем.Мы можем как дать ему предмет(если он в нем нуждается),
так и получить от него предмет(ну например поменять на какой либо из своих либо уговорить отдать).



Вот в кратце игровой мир и процесс.Все поведение персонажей прописывается в текстовом файле,причем для каждой локации он свой.

Что я думаю.

Мне нужно загрузить эти текстовые файлы в,например, массив loc[10];где они будут у меня храниться и куда я в зависимости от локации смогу обращаться по индексу.
В каждом из текстовых файлов будет стоять метка на выполнения того или иного действия в зависимости от того,какие предметы есть у ГГ.Тоесть,например у ГГ есть топор,и он находится в локации 2,тогда я беру текст из loc[1]-и по тексту ползу до тега [topor/] после чего происходит разговор,обмен предметами,снова разговор до такого тега[/topor].Если же в тексте loc[1] тега [topor/] не встречается то перс говорит фразу по умолчанию.Если у нас например 10 предметов из которых 3 встречаются,то начинается произвольный диалог из этих 3-х.

Посему нам нужен как минимум класс Hero:
Код

class CHero
{
public:
    CHero();
    ~CHero();

    void AddItem(char* name_item);      //Получаем предмет от персонажа
    void  PutItem(char* name_item);     //отдаем предмет персонажу

    void AddLoc(int num_loc);           //получаем номер локации которую открывает персонаж
private:
    std::map<std::string ,bool,std::less<std::string> > map_item_hero;//для хранения предметов
    std::map<std::string ,bool,std::less<std::string> >::iterator iter_item;//итератор

    std::vector<int> loc_open;//локации 0-закрыта,1-открыта
};

я его написал вот так,но думаю что у умных людей будут мысли как улучшить.
Затем нам нужна какая-то структура данных что бы в ней хранить все эти 10 текстовых файлов(ужос)какая - ума не приложу.
С остальным вроде просто,потому как,если заходим в локацию с нужным предметом,то в сценарии получим то что надо,а если пока такового нет,то все равно ничего не получим.
В общем очень нужны Ваши дельные и не очень советы.Голову ломаю уже неделю,не знаю как реализовать. 

Автор: Gelos 5.5.2007, 23:26
G_R_E_M_L_I_N, 
Теги = ключевые слова в файлах? Если да, то просто ищешь в тексте его.  Потом, не совсем понял,зачем хранить  файлы в структуре.  Имеется ввиду имена файлов, или ты хочешь сами файлы в память загнать?

Автор: Жуть 6.5.2007, 04:26
Код

typedef std::string item;
typedef std::vector<item> itemSet;

//Узел диалога
//
class DialogNode
{
    std::string promt;    // реплика "дерева" в данном узле
    std::vector<std::string> answers;    //набор возможных ответов
    std::vector<DialogNode*> subNodes;    //"соседние" узлы, т.е. узлы, в которые возможна навигация
    //std::map<std::string, DialogNode*> answerTable;
public:
    bool isLeaf() const;    //отвечать нельзя, тока бери или давай предмет
    DialogNode* GetItem(item& newItem); //если предмет отдан - указатель на следущий узел диалога, иначе 0
    DialogNode* GiveItem(item);    //если предмет принят - указатель на следущий узел диалога, иначе 0
    DialogNode* ChooseAnswer(int index);    // указатель на узел, соответствуущий данному ответу
    int GetAnswersCount() const;    //кол-во ответов
    const std::string GetAnswerText(int index) const;    // получаем строку варианта ответов
    ~DialogNode();
};

class Room
{
    itemSet &required;    //предмет, необходимый для входа в комнату
    
    //Вместо персонажа в комнате сидит дерево диалогов, по которому можно перемеаться давая ответы.
    std::vector<DialogNode*> nodes;
    DialogNode *rootDialog;    //Корневой узел диалога, с него начинаеться диалог в данной локации
public:
    DialogNode* GetRootDialog();    //начало диалога
    virtual bool isOpen(itemSet &herosInventory) const;    //есть ли у героя в рюкзаке предмет, позволяющий войти в локацию
    virtual ~Room()
    {};
};

В аттаче пример дерева диалога, с переходами. Синий - просто узел. Красный - дать вещь. Зеленый - получить. Черный - выход из комнаты.
В сером прямоугольнике "реплика" данного узла.
Логики в диалогах нет, но у меня уже 4 часа утра, такчто не обессудь  smile .
Тебе нужно будет создавать класс "парсер", который из файла для данной комнаты построит дерево диалога и передаст его "комнате".
Оч. сильно рекомендую создать xml файл для описания локации.
набросок для рисунка:
Код

<items>
       <item id="chocolate" name="Шоколад"/>
       <item id="FlashLight" name="Фонарик"/>
</items>

<room name="Имя" description="Описание">
      <requeres>
                <item id="chocolate"/>
      </requeres>
      <nodes rootId="root" count="10">
             <node id="root">
                   <text>
                         Привет !
                   </text>
                   <options count="2">
                            <action gotoNode="foo" type="select">
                                    Пока
                            </action>
                            <action gotoNode="askForChocolate" type="select">
                                    Привет!
                            </action>
                   </options>
             ...
             ...
             ...
             <node id="askForChocolate">
                   <text>
                         У тебя есть шоколад?
                   </text>
                   <options count="2">
                            <action gotoNode="Sorry" type="select">
                                    Нет
                            </action>
                            <action gotoNode="giveChocolate" type="select">
                                    Да
                            </action>
                   </options>
             </node>
             <node id="giveChocolate">
                   <text>
                         Это мой любимый шоколад !
                   </text>
                   <options count="1">
                            <action gotoNode="takeFlashLight" type="give" item="chocolate">
                                    Дать шоколад
                            </action>
                   </options>
             </node>
             <node id="takeFlashLight">
                   <text>
                         Держи фонарик
                   </text>
                   <options count="1">
                            <action gotoNode="byebye" type="take" item="FlashLight">
                                   Взять фонарик
                            </action>
                   </options>
             </node>
             ...
             ...
             ...
             <node id="exit">
                   <text>
                         приходи в седующий раз
                   </text>
                   <options count="0">
                   </options>
             </node>
             <node id="byebye">
                   <text>
                         Пока ))
                   </text>
                   <options count="0">
                   </options>
             </node>
      </nodes>
</room>

Впринципе никто не мешает сделать более 2х ответов, или цикл в графе дерева...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)