Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/84: Рейтинг темы: голосов - 84, средняя оценка - 4.62
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41

Написать игру, в которой главный герой ходит по лабиринту и ищет клад

12.10.2021, 14:08. Показов 20115. Ответов 130

Студворк — интернет-сервис помощи студентам
Нужна помощь по решению задачи.
Задача крайне непосильна для меня. Я был бы признателен если вы мне поможете, но если честно то крайне стыдно просить помощи.
Вот текст задачи: "Написать игру, в которой главный герой ходит по лабиринту и ищет клад. Игровой мир представляет
собой прямоугольную матрицу связанных между собой комнат. У каждой комнаты есть от одной
до четырёх дверей (соответствующих сторонам света). В каждой комнате может быть несколько
игровых объектов, с которыми игрок может взаимодействовать по некоторым игровым правилам.
Цель – найти ключ и сундук, открыть сундук ключом и получить священный Грааль. Игра выполнена
в виде консольного приложения, игрок управляет персонажем, вводя текстовые команды."

Детальное описание хода игры.

Сначала игрок вводит количество комнат, и программа генерирует лабиринт. Игрок оказывается
в одной из комнат лабиринта. При попадании в каждую комнату выводится текст:
You are in the room [x,y]. There are [N] doors: [directions]. Items
in the room: [items list].
Вместо текста в квадратных скобках выводятся, соответственно, координаты комнаты, количество
дверей, направления дверей и список предметов в комнате. После этого игроку предлагается ввести
команды:
— N, S, W и E перемещают игрока в соответствующем направлении;
— get [item] поднимает предмет в комнате и кладет его в инвентарь (кроме сундука);
— drop [item] бросает предмет в комнате, убирая его из инвентаря.
К объекту chest можно применить команду open, которая сработает только в том случае, если
в инвентаре игрока есть объект key. Удачное выполнение этой команды приведет к выигрышу.
Проигрыш происходит в случае, когда у игрока кончается лимит шагов, и он умирает от голода
в мрачных застенках драконьей пещеры. В дополнительных заданиях понятия «жизненная сила»,
«здоровье» и «лимит шагов» по сути означают одно и то же.
Важно: лабиринт не должен быть непроходимым. Не должно быть ситуаций, когда ключ или сундук
находятся в изолированной от игрока части лабиринта, или путь из начальной позиции до ключа
и сундука больше лимита шагов.
Надеюсь на вашу понимание. Есть ещё дополнительные , но можно и без них обойтись.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2021, 14:08
Ответы с готовыми решениями:

Мы создаем игру, в которой главный герой маг. Он может убивать монстров заклинаниями, но для каждого монстра треб
Мы создаем игру, в которой главный герой маг. Он может убивать монстров заклинаниями, но для каждого монстра требуется заклинание разной...

Андрей играет в новую игру, в которой герой сражается с монстрами
Андрей играет в новую игру, в которой герой сражается с монстрами. Герой наносит монстру удары. Один удар отнимает у монстра одну единицу...

Вы пишете игру, в которой герой перемещается по экрану только влево и вправо
Вы пишете игру, в которой герой перемещается по экрану только влево и вправо, а его положение записывают как положение на числовой прямой. ...

130
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41
19.10.2021, 19:49  [ТС]
Студворк — интернет-сервис помощи студентам
Думаю да, то что покупается за три доставляется тем что ниже в массиве. Как я понял снегурочка толжна сделать быстро чтоб дед полетел развозить. Ну и снегурочка должна ещё посылку быстро наделать чтобы дед вторую забрал тогда когда вернётся. Если дед долго летит то снегурочка может и два подарака сделать, или как я понял долгий подарок. В общем ничего толком не понятно, но очень интересно.

Добавлено через 2 минуты
Время позднее, мне кажется лучше делать что-то делать утром чем ночью, полусонным.

Добавлено через 1 минуту
Ааа разобрать игру на объекты ? Я всё правильно понимаю ?
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
19.10.2021, 19:53
Цитата Сообщение от Forest155 Посмотреть сообщение
Ааа разобрать игру на объекты ? Я всё правильно понимаю ?
да.

этот процесс называется Проектированием Сверху-Вниз.

образец кода есть в "С++ Точка старта".

ваш черновик должен быть с++ компилируемым.
0
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41
20.10.2021, 19:22  [ТС]
Это моя первая попытка. И эксперимент получается не не неудачный.
Какие-то цифры и эти штуки которые табуляцию делают и перенос строки работают, но почему-то выводятся.
Я же всё правильно понял , мысли в правильном направление или фигня получается ?

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
#include <iostream>
#include <string>
#include <vector>
 
struct GlavnoeM
{
    void nazv() const 
    {
        std::cout <<  '/t'<< "----SIMPL CASTLE---- / n" << std::endl;
 
    }
    char menu() const
    {
        std::cout << "Главное Меню /n" << std::endl;
        std::cout << "1. Новая игра /n" << std::endl;
        std::cout << "0. Выход /n"  << std::endl;
        char vibor;
        std::cin >> vibor;
        return vibor;
    }
};
 
int main()
{
    setlocale(LC_ALL, "ru");
    char num;
    GlavnoeM game;
    game.nazv();
    num = game.menu();
    if (num != 1)
    {
        std::cout << "Ухади, не плачь" << std::endl;
    }
    else
        std::cout<< "Начинается игра, а пока её нет, вот так"<< std::endl;
 
 
    return 0;
}
1
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
20.10.2021, 19:27
Forest155, ескейп последовательности используют бэкслеш, а не прямой. И пробел не нужен:

\n
\t

Цитата Сообщение от Forest155 Посмотреть сообщение
перенос строки работают
это срабатывает std::endl
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
20.10.2021, 21:12
Цитата Сообщение от Folian Посмотреть сообщение
Вот и поди знай теперь кто тут верблюд.
Цитата Сообщение от Folian Посмотреть сообщение
А может я и лажанул тут, да.
Я тут верблюд.

Короч поковырялся.
Изначально виделась задача коммивояжёра, но, видев краем глаза решение из #46, - думалось что чёт слишком лаконично там для этого. Отмёл комм~ и стал ковыряться дальше.

Сначала понял каким должен быть задовый элемент.
Потом, проанализировав некоторую кучу рандома, всплыли две простые разные закономерности-стратегии для остального:
0) отправлять деда как можно дальше
1) давать снегурке как можно проще

Я решил не мудрить с их объединением и использовал обе по разу сразу:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
int main()
{
    size_t n {};
    std::cin >> n;
 
    std::vector<std::pair<int, int>> vec(n);
 
    for(auto & i : vec)
        std::cin >> i.first;
    for(auto & i : vec)
        std::cin >> i.second;
 
    auto last { std::max_element(vec.begin(), vec.end(), 
        [](auto a, auto b)
        {
            if(a.second == b.second) return a.first < b.first;
            return a.second > b.second;
        }) 
    };
 
    std::swap(*last, vec.back());
 
    auto count { [&vec]()
        {
            int result { vec.front().first + vec.back().second };
            int shift { 0 };
            for(auto it { vec.begin() }; it != vec.end() - 1; ++it)
            {
                result += it->second;
                if(int diff { it->second + shift - (it + 1)->first }; diff < 0)
                {
                    result -= diff;
                    shift = 0;
                } else {
                    shift = diff;
                }
            }
            return result;
        }
    };
 
    std::pair<int, int> result;
    std::sort(vec.begin(), vec.end() - 1, 
        [](auto a, auto b)
        { 
            if(a.first == b.first) return a.second > b.second;
            return a.first < b.first; 
        }
    );
    result.first = count();
 
    std::sort(vec.begin(), vec.end() - 1, 
        [](auto a, auto b)
        {
            if(a.second == b.second) return a.first < b.first;
            return a.second > b.second; 
        }
    );
    result.second = count();
 
    std::cout << std::min(result.first, result.second);
 
    return 0;
}


И это сработало! (для тестилки по крайней мере)

Вот тут вообще не уверен в правильности, т.к. решение только на основе анализа не особо-то и большой выборки. Я вообще не мастер доказательств, но если будет опровержение - это будет хорошо.

Anyway, щас уже буду смотреть в "ответы" (т.е. в решение в #46) и изучать/сравнивать. //да, до этого не изучал - сам хотел решить сначала
1
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
20.10.2021, 21:44
Forest155, если актуально, то могу скинуть ссылку на свой репозиторий, где лежит вот прям практически то, что нужно по заданию. Если вкратце, то наткнулся я пару лет назад в ютубе на видео - проект лабиринт, там мужик как раз показывал, как сделать уровни. Их связать друг с другом чтоб своеобразная заготовка под игру получилась.
Я всё хотел этот проект допилить напильником и сделать более менее нормальным (через буфер консольный и ООП прикрутить, ну чтоб совсем всё по феншую было) и в будущем планирую дальше развить его (если совсем лень не поборет меня - сейчас банально некогда)
0
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41
21.10.2021, 09:05  [ТС]
Скидывайте, посмотрим
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 09:59
Цитата Сообщение от Forest155 Посмотреть сообщение
Это моя первая попытка
ок, это хорошо.
вы всё же взялись проектированием снизу вверх,
что не есть хорошо.

а хорошее проектирование это сверху вниз.

И всё же сделайте это:
Цитата Сообщение от XLAT Посмотреть сообщение
и далее сделайте следующее:
перечислите все объекты игры, для которых вам придётся описать Типы(они же классы или структуры).
Желательно сделать это в код, который бы можно скомпилировать.
я вам помогу:
согласно заданию из вашего первопоста вам понадобятся следующие объекты:
1. комната.
2. лабиринт.
3. гуй.
4. игра.
5. система визуализации(просто набор статических функций инкапсулированных в структуре - вариант для консоли).

я хотел бы чтобы такое перечисление сделали вы, а не я ....

для всех этих объектов сделайте типы(структуры - они же классы),
из которых уже можно будет создавать сами объекты.

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


Добавлено через 5 минут
Цитата Сообщение от Recrut_rf Посмотреть сообщение
могу скинуть ссылку на свой репозиторий, где лежит вот прям практически то, что нужно по заданию
так вроде готове решение уже дал уважаемый Annemesski

смысл же совсем в другом.

или что не так?

я, например, тоже могу дать готовое свое решение,
и что? автор будет смотреть на код, как из из народной поговорки: "как баран на новые ворота".

0
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41
21.10.2021, 10:09  [ТС]
Мне почему-то казало это и есть верх, так как из главного файла всё обычно происходит. Видимо я ошибался.
По поводу создания объектов я начал с первого, как мне казалось это главное меню,
именно потому что когда включается игра первое что появляется это главное меню.
Потом я думал что нужна будет лабиринт с комнатами, её наполнение и гг уже под конец.
А что значит гуй (он четвертым пунктом) ?
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 10:26
Цитата Сообщение от Forest155 Посмотреть сообщение
А что значит гуй (он четвертым пунктом) ?
гуй это как раз все менюшки, которые понадобятся изеру, шоп искать клад.
или:
гуй - GUI :
Графи́ческий интерфе́йс по́льзователя,
(англ. graphical user interface, GUI) — система средств для взаимодействия пользователя с электронными устройствами,
основанная на представлении всех доступных пользователю системных объектов и
функций в виде графических компонентов экрана...


Цитата Сообщение от Forest155 Посмотреть сообщение
так как из главного файла всё обычно происходит
вам нужно ещё выяснить, что именно будет происходить из главной функции, которая есть int main();

сделайте этот шаг.

Добавлено через 3 минуты
Forest155, было бы хорош, чтобы я как попугай не повторял одно и тоже.

Forest155, Прочитайте записку "С++ Точка старта" Пункт 0.
Прочитайте 7 раз.
1
13 / 13 / 0
Регистрация: 22.09.2021
Сообщений: 41
21.10.2021, 10:34  [ТС]
Я и до этого читал. И кажется понял что не умею им (интернетом я имею в виду) пользоваться, надо учится. Просто гуи может всё что угодно означать, ну тогда мне так казалось. Извините меня если достал, я правда не хотел никого доставать вопросами.
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 10:39
Цитата Сообщение от XLAT Посмотреть сообщение
"Уровни Проектирования" стр.79
0
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 11:16
Цитата Сообщение от Forest155 Посмотреть сообщение
не умею им (интернетом я имею в виду) пользоваться
1. установите яндекс-браузер.
2. в адресной строке вбивайте запрос - буквально по буквам, то что вам неясно.

справочная информация по деталям ищется лёгко,
и если для понимания там чаво то не будет хватать,
то пишите вопрос сюда - на форум:

если вопрос без упоминания этой(#1) задачи, то лучше в вашей созданной новой теме.

Forest155,
С++ щас вам нужен в объеме 0.001%
щас вам нужно сделать общую декомпозицию.

что именно - см. выше мои посты.


Например,
если вам нужно спроектировать лес,
то вы видите, что лес не является монолитным объектом,
а состоит из деревьев.
Разные деревья имеют разные листья и цвет коры и структуру веток и т.п.
Это и есть декомпозиция.
1
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
21.10.2021, 11:36
Цитата Сообщение от XLAT Посмотреть сообщение
смысл же совсем в другом.
или что не так?
Надо будет посмотреть его решение, возможно оно даже сильно лучше, чем моя поделка.

А смысл - да просто интересно мнение окружающих на счёт моей поделки. Ну и естественно, если у кого-то возникнут вопросы - всегда готов ответить почему сделал так, а не по-другому (да потому что по другому не умею)

вот в общем ссылка https://github.com/Recrut-rf/Labyrinth.git
2
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 12:16
Цитата Сообщение от Recrut_rf Посмотреть сообщение
https://github.com/Recrut-rf/Labyrinth.git
перезалейте исходники в utf-8 кодировке.
меня смущают кракозябры, а вас?

Recrut_rf,
раз там у вас уже "window.h", а файлов много, то хорошо бы, чтобы там был ексешник.
я всегда хочу быстро убедиться в том, что стоит ли мне ваще смотреть код

Цитата Сообщение от Recrut_rf Посмотреть сообщение
интересно мнение окружающих
не вникая, бросается в глаза:
C++
1
COORD getPersonCoord() const;
это метод вашего класса Person.

Имя идентификатора избыточно!

по мне лучше так:
C++
1
COORD getCoord() const;
а кому принадлежат эти Coord будет хорошо видно по объекту к которому этот метод будет вызван:
C++
1
     auto coord = person.getCoord();
Recrut_rf,
C++
1
2
3
4
5
6
7
8
9
10
11
/// main.cpp
#include "Game.h"
 
int main()
{
    Game game;
         game.Initialize();
         game.Run       ();
    
    return 0;
}
+100
отличный код, ибо он мне нравится.

но положить инициализатор в конструктор уж сильно просится...
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
21.10.2021, 12:16
XLAT, за критику спасибо, кодировку подправил. Екзешник чуть позже добавлю
1
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 12:20
Цитата Сообщение от Recrut_rf Посмотреть сообщение
за критику
то была не критика, а тупая констатация визуального опыта
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
21.10.2021, 12:26
Цитата Сообщение от XLAT Посмотреть сообщение
то была не критика, а тупая констатация визуального опыта
один хрен - она говорит мне, что нужно делать и как, а значит это своего рода критика, помогающая мне в итоге стать лучше. Экзешник добавил. Вроде как должен работать без запроса всяких длл и прочего. Разве что запускать его нужно в окружении текстовых файлов проекта. Из них все уровни грузятся, да и вообще вся инфа.
1
Just Do It!
 Аватар для XLAT
4221 / 2686 / 656
Регистрация: 23.09.2014
Сообщений: 9,246
Записей в блоге: 3
21.10.2021, 12:40
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Экзешник добавил
запустил - всё пашет, только последняя 'O' должна быть 'E', так как то был конец... уж больно неожиданный

Добавлено через 4 минуты
Recrut_rf, подсистему движок надо бы положить в неймспейс,
чтобы можно было не гадать, например,
метод addSymbolAndAttributeToBuffer это метод движка или его забыли положить в движок ...

хорошо, когда так, для примера:
C++
1
render::addSymbolAndAttributeToBuffer(...
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
21.10.2021, 12:40
Цитата Сообщение от XLAT Посмотреть сообщение
запустил - всё пашет
еее - отлично

Цитата Сообщение от XLAT Посмотреть сообщение
только последняя 'O' должна быть 'E', так как то был конец...
ну это своеобразная заготовка - над ней можно издеваться как угодно - менять, добавлять, расширять
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2021, 12:40

Вы пишете игру, в которой герой перемещается по экрану только влево и вправо, а его положение записывают как положение н
Вы пишете игру, в которой герой перемещается по экрану только влево и вправо, а его положение записывают как положение на числовой прямой. ...

Главный герой застревает в препятствиях
День добрый, столкнулся с такой проблемой что Гг застревает в препятствиях. BoxCollayder2д есть, все ок. У Гг есть способность с помощью...

Сделать так, чтобы главный герой не проходил сквозь некоторые спрайты C++
Всем привет. Я 4-5 недель назад начал изучать OpenGL и разработку игр на С++. Начал изучать SFML и читать статьи на kychka-pc. В общем...

Написать игру в которой имитируется бросание кубиков
Этап первый Написать игру в которой имитируется бросание кубиков игроком. Игра должна представлять собой консольное приложение. В игре 2...

Написать игру, в которой имитируется бросание кубиков
Написать игру, в которой имитируется бросание кубиков компьютером и пользователем. В игре 2 кубика и на каждом из них может выпасть...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru