Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
TrueOman
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 19
#1

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

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

Здравствуйте. Недавно я начал изучать 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2012, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Консольная РПГ. (MUD-подобная). (C++):

Собираю команду для создания текстовой рпг - C++
Всем привет! Я собираю людей в команду, для разработки текстовой рпг, может быть, в дальнейшем графической)) Я недавно начал...

Игра, подобная шашкам. Оптимизация кода - C++
Добрый вечер. У меня маленькая проблема: пишу игру, наподобие шашек. Почти готово, потом выложу исходники для критики. Сейчас делаю...

Если функция, подобная getline, которая может читать очень большие строчки из файла? - C++
Если функция, подобная getline, которая может читать очень большие строчки из файла?

Консольная графика - C++
Здравствуйте, я написал этот код в Борланд С++ (пример нашел в книге): #include &lt;graphics.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; ...

Консольная графика - C++
Доброго времени суток!!! Как под DOS рисовать примитивные обьекты линии, квадраты, круги? Для Turbo C++, Но если возможно то для C++...

Консольная команда и С++ - C++
Добрый вечер. Что использовать в С++ чтобы запустить Java приложение таким кодом( какую функцию ): Код: #!/bin/bash cd...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 22 часа 4 минуты
Все пытаюсь разобраться в наставлениях. Никак не получается сделать это передвижение по локациям. Не понимаю где хранить все описание локаций. В массиве не получается. Я начинаю все больше путаться. Дайте пример люди добрые.
0
IFree Host
Заблокирован
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
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
02.05.2012, 16:37 #15
IFree Host,
Когда с С++ разберешься, сделаешь вместо стуктуры класс. Хотя стуктуры экономнее по памяти.
Бред. Давно-ли?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2012, 16:37
Привет! Вот еще темы с ответами:

Консольная змейка - C++
Написал консольную змейку, но почему-то не работает управление :) Ну, как не работает, цвет на пробел то меняется, но W, A, S, D чтоб...

Консольная графика - C++
Наверное будет звучать грубо, но как мне нарисовать в консоли квадратик, выбрав его цвет и размер?

Консольная программа - C++
Здравствуйте... Я уже немного научился программировать на C++ и тут наткнулся на консольную программу где был создан вот такой...

Консольная змейка - C++
Добрый день. С недавнего времени я пишу в консоли игру с одноименным названием. Занятие, прошу заметить, довольно увлекательное :) ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
02.05.2012, 16:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru