0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
1

Консольная РПГ. (MUD-подобная).

29.04.2012, 23:38. Показов 8683. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Недавно я начал изучать C++. И для хорошего усвоения пройденного материала решил написать консольную MUD-подобную РПГ. Кто не знаком с таковыми, и лень читать на wiki, объясню На примере:

Вы очнулись в страшной темной комнате.
Что предпринять?
1. Выйти через дверь.
2. Вылезти через окно.


Так вот, все это дело что написано курсивом отображается в консоли. Человек вводит цифру выбранного им варианта и переходит в новую "локацию", в которой также несколько вариантов действий. И таким образом мне хотелось бы описать целый мир.
Вот код который я написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* 
Консольная РПГ. Название неизвестно.
location+number() - функция локации "number"
location+number+view() - функция осмотра на локации "number"
*/
 
#include<iostream>
#include <stdlib.h>
using std::cout;
using std::endl;
using std::cin;
 
class Environment
{
public:
    void location1()
    {
        cout << "У вас раскалывается голова. Вы открываете глаза, и видете перед собой лишь засыпанное мелкими облачками голубое небо. "
             << "Приподнявшись вы понимаете что находитесь на побережье. При попытке что либо вспомнить отдает легкой болью в висках.\n\n"
             << "Ваши действия:\n1.Осмотреться.\n\nВвод: ";
    }
 
    void location1view()
    {
        cout << "Осмотревшись вы увидели что на севере, в воде, не далеко от берега виднеется потерпевший крушение корабль."
             << " На западе расположены огромные скалы. В свою очередь на востоке виден лишь уходящий за горизонт пляж."
             << " На юге начинается тропинка ведущая прямиком в джунгли.\n"
             << "Ваши действия:\n1.Идти на запад\n2.Идти на юг\n3.Направиться на восток\n4.Идти на север\n"
             << "\nВвод: ";
    }
    void location2()
    {
        cout << "Вы подплыли к кораблю. Забравшись на его остатки после крушения вам в глаза сразу же бросился средних размеров сундучок."
             << " Вот только без ключа он не откроется.\n"
             << "Ваши действия:\n1.Осмотреться.\n2.Поиск предметов на локации.\n3.Плыть обратно.\n\nВвод: ";
    }
};
 
int main()
{
    int Entered; // Вводимые данные
    setlocale(LC_ALL,"Russian");
 
    Environment locations;
    locations.location1();
    cin >> Entered;
    if (Entered=1)
    {
        system("cls");
        locations.location1view();
        cin >> Entered;
        if (Entered=4)
        {
            system("cls");
            locations.location2();
        }
    }
    else 
    {
        cout << "Ошибка ввода" << endl;
    }
    system("PAUSE");
    return 0;
}
Как вы наверное поняли, если читали код что на этом этапе кода - доступен только один путь (Начало - оглядеться - север). Так вот, при всем этом возник вопрос. Как организовать обратный путь с "севера" в "начало"? Если писать if'ами то это будет продолжатся до бесконечности. Если не понимаете о чем я то привожу опять же пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
...
if (Entered=4) //Если пользователь выбирает идти на север (по условию location2view)
    {
        system("cls");
        locations.location2();
                cin >> Entered;
                if (Entered=3) // Если игрок выбирает плыть обратно
                {
                     locations.location1();
                     cin >> Entered;
                     //...и дальше тут пойдут бесконечные if'ы
                }
    }
Помогите реализовать вот это перемещение между локациями... ума не приложу как это сделать. Большая просьба писать подробно так как я ещё совсем новичок, а лучше с примерами. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2012, 23:38
Ответы с готовыми решениями:

Разработка MUD игры
Здравствуйте, уважаемые товарищи-программисты. Пишу сюда с целью попросить у вас помощи в решении...

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

MUD Игра на Delphi... Реальность или фантастика? О_о
Реально ли MUD Игру сделать на делфи?)) Тока не текстовую, а с графикой, карта клеточками,...

РПГ
Доброго времени и суток ! Я взялся писать текст рпг игру на турбо паскаль . Помогите !!! У...

19
Заблокирован
30.04.2012, 00:46 2
Напиши двухмерный массив, который будет твоей картой. Каждая ячейка массива = локация.
Каждая ячейка уже имеет уникальный индекс массива, если надо больше чем индекс - сделай массив на базе структуры, содержащий все необходимые данные

при движении на север индекс по вертикали декрементируется
на юг инкрементируется

при движении на запад индекс по горизонтали декрементируется
на восток инкрементируется

по аналогии северо-запад и так далее.

потом можно все одним switch описать, который будет только определять в каком направлении решил пойти игрок.

Попдаешь в локацию - получаешь новые условия для направления

Ну это так, в общих чертах. Короче, фантазируй и все получится!!!

Добавлено через 6 минут
И вообще пользуйся золотым правилом информатики, которое я придумал:

Математика пытается сделать сложное простым
Инофматика пытается сделать простое элементарным

Короче, не усложняй. Делай как можно проще!!!
2
Заблокирован
30.04.2012, 00:47 3
Что такое "локация" с точки зрения ООП?

Это объект, который имеет свойства: описание локации, список возможных действий внутри локации, и тп.

Каждое "действие", которое может выбрать пользователь, находясь внутри локации на самом деле так же является объектом, имеющим свойства: идентификатор локации, которая будет запущена в случае, если пользователь выберет это действие.

Локаций может быть множество, но принцип их обработки один и тот же.

Что такое мир? Мир, это объект, который по сути является массивом локаций.

Где локации имеют текстовые описания, и наборы действий (содержат массивы действий).

Активация действия приводит к тому, что персонаж оказывается в другой локации.
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
30.04.2012, 02:47 4
Если честно, то я не понял, зачем для одного cout создавать целый метод класса.
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
30.04.2012, 02:51  [ТС] 5
Как то думал о том что бы локации расписывать в массивах. Спасибо большое за подсказку. Начал реализовывать - и сразу же столкнулся с проблемой. Создал массив map[10][10], в нем элементу map[5][5] пытался присвоить функцию локации. Не получилось, так как тип массива - int, а тип функции void. Как с этим быть? Может быть это глупые вопросы, но я ещё совсем новичек.
0
5 / 5 / 0
Регистрация: 04.01.2012
Сообщений: 41
30.04.2012, 02:57 6
Сделайте map классом, а не переменной.
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
30.04.2012, 03:07  [ТС] 7
Цитата Сообщение от volchonokilli Посмотреть сообщение
Если честно, то я не понял, зачем для одного cout создавать целый метод класса.
В учебнике по плюсам - был пример того что в методе класса находится cout. Вот я от туда идею и подцепил.

Помогите:
Сделал массив не переменной а классом. Теперь компилятор ругается на что то другое.
Вот, делал этот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>
using namespace std;
class world
{
public:
    void location1()
    {
        cout << "olololo";
    }
    void location2()
    {
        cout << "fuck yeah!";
    }
};
int main()
{
    world locations;
    const int mapH = 10;
    const int mapV = 16;
    class map[mapH][mapV];
    map[2][2] = locations.location1();
    map[2][3] = locations.location2();
    system("PAUSE");
    return 0;
}
Исправьте что нитак. Уж очень хочется во всем разобраться.
0
Заблокирован
30.04.2012, 03:13 8
Цитата Сообщение от TrueOman Посмотреть сообщение
map[5][5]
Концепт идеи может быть таким:

map[x][y]; //где x и y - координаты локации, тогда значение ячейки массива - это индекс локации в массиве локаций.

Итого:

location[количество_локаций]; //массив локаций
map[x][y]; //карта

А работа с этими двумя массивами выполняется следующим образом:

C++ (Qt)
1
2
3
4
while(индекс_локации!=-1)
{
    индекс_локации = location[индекс_локации].Work();
}
где, location[индекс_локации].Work(); будет возвращать индекс локации, куда должен попасть персонаж после того, как локация отыгралась. Если он внутри локации сходит на север, то вернется индекс северной локации, или юг - южной и тд.

Если вернется -1, значит игрок решил закончить игру.

В цикле тупо запускается та, или иная локация, которая тупо возвращает индекс следующей локации, которая будет запущена при очередной итерации цикла.

Данный подход прост, но не вполне корректен. При этом подходе, каждая конкретная локация знает индексы соседних локаций. Что не есть хорошо. Но для начального уровня вполне приемлемо. И главное - очень просто реализуется.

Добавлено через 4 минуты
Цитата Сообщение от TrueOman Посмотреть сообщение
map[2][2] = locations.location1();
Что именно ты пытался добиться этой записью?
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
30.04.2012, 03:24  [ТС] 9
Цитата Сообщение от Bers Посмотреть сообщение
Что именно ты пытался добиться этой записью?
Хах. Пытался присвоить функцию элементу массива.

Буду разбираться с вашими наставлениями. Спасибо.
0
Заблокирован
30.04.2012, 03:46 10
Цитата Сообщение от TrueOman Посмотреть сообщение
Хах. Пытался присвоить функцию элементу массива.
Чем ты руководствуешься, когда пишешь исходный код?
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
30.04.2012, 03:57  [ТС] 11
Цитата Сообщение от Bers Посмотреть сообщение
Чем ты руководствуешься, когда пишешь исходный код?
По моей логике это должно было сработать. Увы, не вышло. Видимо у меня не самая лучшая логика.
0
Заблокирован
30.04.2012, 04:06 12
Цитата Сообщение от TrueOman Посмотреть сообщение
По моей логике это должно было сработать. Увы, не вышло. Видимо у меня не самая лучшая логика.
Есть такая штука, называется "правила языка". Вот в русском языке есть свои правила правописания, и в английском. И у языков программирования так же.

Рекомендую тебе начать писать свою игру с изучения правил правописания языка с++.
Особенное внимание удели теме "массивы на языке с++". Потом "структуры на языке с++", затем "классы на языке с++".
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
01.05.2012, 14:06  [ТС] 13
Цитата Сообщение от Bers Посмотреть сообщение
Есть такая штука, называется "правила языка". Вот в русском языке есть свои правила правописания, и в английском. И у языков программирования так же.

Рекомендую тебе начать писать свою игру с изучения правил правописания языка с++.
Особенное внимание удели теме "массивы на языке с++". Потом "структуры на языке с++", затем "классы на языке с++".
Да, я понимаю что ошибся. Особое внимание уделяю всему что встречается в учебнике. Объясняете как маленькому, зачем так тонко троллить?) И спасибо за помощь. Буду разбираться.

Добавлено через 22 часа 4 минуты
Все пытаюсь разобраться в наставлениях. Никак не получается сделать это передвижение по локациям. Не понимаю где хранить все описание локаций. В массиве не получается. Я начинаю все больше путаться. Дайте пример люди добрые.
0
Заблокирован
02.05.2012, 00:25 14
TrueOman, вот, я тебе по быстрому нацарапал простейший рабочий пример на чистом С
Это только костяк, чтобы тебе был понятен принцип. А дальше - просто фантазируй. Как простые функции можно комбинировать для твоих задач.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// MUD-RPG.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int posX,posY;
    int newDirection;
 
    struct Location
    {
        int lastDirection;
        
        void chooseDirection()
        {
            int newDirection;
        
            printf("На 0 нажмешь, на север пойдешь\n На 1 нажмешь на северо-восток пойдешь...  и так далее\n\n");
            newDirection = 0;
            scanf("%i", &newDirection);
            fflush(stdin);
            lastDirection = newDirection;
        };
    };
 
    Location map[5][5];
 
    newDirection = 0;
    posX = 3;
    posY = 3;
    
    while(true)
    {
        map[posX][posY].chooseDirection();
        newDirection = map[posX][posY].lastDirection;
 
        switch(newDirection)
        {
        case 0: printf("Nord\n"); --posY; break;
        case 1: printf("Nord-Ost\n"); --posY; ++posX; break;
        case 2: printf("Ost\n"); ++posX; break;
        case 3: printf("Süd-Ost\n"); ++posY; ++posX; break;
        case 4: printf("Süd\n"); ++posY; break;
        case 5: printf("Süd-West\n"); ++posY; --posX; break;
        case 6: printf("West\n"); --posX; break;
        case 7: printf("Nord-West\n"); --posY; --posX; break;
        }
 
        printf("Ты попал в локацию %i%i\n\n", posX, posY); // это строка просто для проверки координат
    }
    return 0;
}
Добавлено через 3 минуты
Когда с С++ разберешься, сделаешь вместо стуктуры класс. Хотя стуктуры экономнее по памяти. И в структуру можешь еще кучу всяких функций напихать и вызывать по мере необходимости как в примере показано.

Потом когда перейдешь к перехвату событий будешь тоже самое уже по стрелкам делать.

Добавлено через 10 минут
Правда забыл добавить, что там в коде нет проверки выхода за пределы массива. Это вообщето обязательная штука. А то будет ошибками тебя валить. Ну это то ты и сам можешь написать.
Придумаешь еще к этому какое-нибудь ограничение локаций. Типа: "Ты дошел до дремучего леса, дальше живут только тонкие толли. Они запарят своими занудными высказываниями до смерти"

Добавлено через 9 часов 1 минуту
Ну дык что? Получается у тебя что-то? Или как?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.05.2012, 16:37 15
IFree Host,
Когда с С++ разберешься, сделаешь вместо стуктуры класс. Хотя стуктуры экономнее по памяти.
Бред. Давно-ли?
0
Заблокирован
02.05.2012, 19:09 16
Цитата Сообщение от ForEveR Посмотреть сообщение
Бред. Давно-ли?
Давно при давно. И даже не требуется объяснения почему! “Куча”, “сборщик мусора”, “неопределенные временные интервалы прохода”, сложность “ручного” управления кучей и сборщиком мусора. Про такое слышал когда-нибудь?
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.05.2012, 20:41 17
IFree Host,
Давно при давно. И даже не требуется объяснения почему! “Куча”, “сборщик мусора”, “неопределенные временные интервалы прохода”, сложность “ручного” управления кучей и сборщиком мусора. Про такое слышал когда-нибудь?
Какой нафиг сборщик мусора в плюсах? Ты о чем? Структуры от классов в С++ отличаются ТОЛЬКО доступом к полям по умолчанию.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
02.05.2012, 22:10 18
Цитата Сообщение от IFree Host Посмотреть сообщение
Хотя стуктуры экономнее по памяти.
Цитата Сообщение от IFree Host Посмотреть сообщение
Давно при давно. И даже не требуется объяснения почему! “Куча”, “сборщик мусора”, “неопределенные временные интервалы прохода”, сложность “ручного” управления кучей и сборщиком мусора. Про такое слышал когда-нибудь?
Ну это просто бред. Позволю себе сделать предположение, что Вы, совсем недавно, где то, возможно случайно, прочитали данные термины и решили "блеснуть".
2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.05.2012, 23:33 19
А вот пример как это вижу я.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <string>
#include <map>
#include <memory>
 
class Location;
 
class NextLocations
{
public:
    typedef std::shared_ptr<Location> location_t;
    typedef std::map<int, location_t> locations_t;
    NextLocations(const locations_t& locs):locations(locs)
    {
    }
    location_t get_next(const int choice)
    {
        locations_t::iterator iter = locations.find(choice);
        if (iter != locations.end())
        {
            return iter->second;
        }
        return location_t();
    }
    bool empty() const { return locations.empty(); }
private:
    locations_t locations;
};
 
class Location
{
public:
    Location(const std::string& desc, const NextLocations& locs):
        description(desc), locations(locs)
    {
    }
    const std::string get_description() const { return description; }
    bool has_next() const { return !locations.empty(); }
    NextLocations::location_t get_next(const int choice)
    {
        return locations.get_next(choice);
    }
private:
    std::string description;
    NextLocations locations;
};
 
class World
{
public:
    World(Location& start_loc):start_location(start_loc)
    {
    }
    virtual ~World()
    {
    }
    virtual void start() = 0;
protected:
    Location& start_location;
};
 
class ConsoleInterfaceWorld : public World
{
public:
    ConsoleInterfaceWorld(Location& start_loc):World(start_loc)
    {
    }
    virtual ~ConsoleInterfaceWorld()
    {
    }
    virtual void start() 
    {
        Location& current_loc = start_location;
        std::cout << current_loc.get_description() << std::endl;
        while (current_loc.has_next())
        {
            std::cout << "Enter your decision: ";
            int choice = 0;
            std::cin >> choice;
            NextLocations::location_t loc = current_loc.get_next(choice);
            if (!loc)
            {
                std::cerr << "Invalid choice. No such location" << std::endl;
                continue;
            }
            current_loc = *loc;
            std::cout << current_loc.get_description() << std::endl;
        }
    }
};
 
int main()
{
    NextLocations::locations_t locations;
    locations.insert(std::make_pair(1, NextLocations::location_t(new Location("end of path1", NextLocations::locations_t()))));
    locations.insert(std::make_pair(2, NextLocations::location_t(new Location("end of path2", NextLocations::locations_t()))));
    Location loc("1 for go ahead, 2 for go right", locations);
    ConsoleInterfaceWorld world(loc);
    world.start();
}
0
silent_1991
03.05.2012, 06:45     Консольная РПГ. (MUD-подобная).
  #20
 Комментарий модератора 
Если тут продолжится то, что было вычищено - тему закрою, участников накажу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2012, 06:45

текстовая рпг
Всем привет!Подскажите пожалуйста как создается Телефонная текстовая Рпг игра? Вот напишу пример...

Текстовый рпг-квест
Доброго всем времени суток. С недавних пор (по просьбе пары друзей и знакомых) взялся разрабатывать...

Задача на создание игры РПГ
Герой игры обладает никнеймом, силой, ловкостью и интеллектом, помимо этого у него есть здоровье,...

Разработка кроссплатформенной простой РПГ
Здравствуйте! Я новичок в создании игр... И хотелось бы от более просвещенных пользователей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru