Create site free
Симулятор работы общественного транспорта - Общие вопросы разработки игр - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Симулятор работы общественного транспорта (Приглашаю к неспешному рассуждению)
Симулятор работы общественного транспорта
SVR Дата: Суббота, 27.02.2010, 11:27 | Сообщение # 1
Молчун
Группа: Проверенные
Сообщений: 2
Статус: Offline
Друзья, предлагаю подумать над устройством симулятора общественного транспорта.

Давным-давно была такая игра, как Traffic Giant.
http://ttdrussia.net/articles/trafficgiant.php
Ее суть сводилась к прокладке в городе линий общественного транспорта для перевозки пассажиров. Невозможно поверить, но с тех пор не выходило ничего подобного, ни одного клона ! Хотя игра была очень и очень недурна. Разные вариации на тему Transport tycoon, Railroad tycoon не в счет, потому как расчета пассажиропотоков (а это главное в нашей игре) там не было.
У меня периодически возникают мысли сделать симулятор работы общественного транспорта, ибо в Traffic giant можно было многое улучшить.
Как работал Traffic giant ? Игровое поле представляло из себя двумерную матрицу. Дороги шли под углом 90 градусов друг к другу. На карту было нанесено 4 типа построек: жилые дома, школы, предприятия и магазины. К каждому дому были приписаны своя школа, свое предприятие и свой магазин. Т.е. жители каждого дома нуждались в перевозке по трем направлениям. Все действие происходило в режиме реального времени: на остановке собирался народ, потом подъезжал трамвай и народ (если этот трамвай имел нужный номер маршрута) в него загружался. Если маршрут шел прямо до точки назначения, люди выходили на нужной им остановке. Если нет, то делали пересадку на другой маршрут. Всего за поездку они могли сделать три пересадки.
Похожий принцип мне и хотелось бы реализовать, внеся свои коррективы. И сразу возникают вопросы: как сделать удобную привязку между жилым домом и, например, магазином. Пусть жилой дом – это двухмерный массив,

Dom[x,y]=250;

где x и y – координаты дома на карте, а 250 – количество жителей. Как будет лучше к этому дому привязать магазин при условии, что к магазину могут быть привязаны еще несколько домов ? Жду мнений.
Например, с этой задачей мы справились. Т.е. знаем, что пассажир из точки x,y нуждается в перевозке к точкам x1,y1; x2,y2; x3,y3. Как научить пассажиров подбирать оптимальный маршрут ? Мне видится такой способ. Создаем двумерную матрицу, где ходы – это существующие маршруты транспорта. Т.е. получается своего рода лабиринт. Если начальная и конечная точки находятся в пределах маршрутов, то ищем оптимальный путь (есть такая функция). Дальше переносим событие в реальное время. Вот пассажир желает прокатиться по своему пути. Он ждет транспорт. Если транспорта долго нет, то назначаются штрафные очки. Приходит, скажем, трамвай. Если он старый и неудобный – то это еще штрафные очки. Если там много пассажиров – то тоже штраф. Дальше пассажир едет. Тут, кстати, необходимо завести двухмерную матрицу штрафных очков. Пока пассажир едет, он собой эту матрицу заполняет. Представьте, что за трамваем рисуется хвостик, цвет которого соответствует удовлетворенности пассажира. Зеленый – все в порядке. Чем краснее – тем хуже. Нужно сделать пересадку – это тоже штрафные очки. Пассажиров ездит много, и матрица штрафных очков заполняется, переливается цветами. Ясно, что наиболее сложными участками будут станции крупных пересадок. Если некий участок становится абсолютно неудобным, наиболее красным, то в другой матрице, по которой строятся маршруты, на этом месте ставится блок. Пассажиру приходится искать другой маршрут поездки, и матрица штрафов со временем видоизменяется.
На словах все хорошо, но на деле это осуществить так трудно, что я даже не знаю, к чему подступиться. Может, есть способы оптимизации моей схемы ? Я очень жду ваших рассуждений.
Предлагаю также поразмыслить вот над чем. Пусть у нас не будет конкретной связки между жилыми домами и школами, заводами и т.д. Например, есть здание-производитель (жилые дома) и здание-потребитель (завод, магазин, офис, вокзал). Т.е. всего типов построек в городе две. Пассажиры между ними перемещаются случайно. Чем выше «уровень» здания, тем больший пассажиропоток он может образовать. Ну, например, у завода индекс 1000. Это значит, что 1000 человек со всего города готова ехать на завод. А у сельского дома индекс 10. Т.е. только 10 пассажиров могут ехать из него в любую точку города. Перемещение лишь между производителем и потребителем. Т.е. из дома в дом, с завода на завод пассажиры не ездят. А из дома на завод – ездят.
Какая из двух схем удачнее ? Как реализовать вторую схему ?

 
SpectruM Дата: Суббота, 27.02.2010, 13:13 | Сообщение # 2
Болтун
Группа: Проверенные
Сообщений: 216
Статус: Offline
Возможно, чем-то тебе поможет этот материал:

Добавлено (27.02.2010, 13:13)
---------------------------------------------
Не выходит прикрепить файл, сейчас залью на депозит

http://depositfiles.com/files/1dvw38anw (131 кб)

В архиве 2 файла:
"Построение оптимального маршрута в линейном программировании" - теория
А также пример построения оптимального маршрута.

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



"Мне снилось, что жизнь прекрасна. Неужто сон мой был туманной ложью?" - Э.С. Хупер

мой мега-сайт: www.spectrum.at.ua


Сообщение отредактировал SpectruM - Суббота, 27.02.2010, 13:17
 
WertyXBOCT Дата: Суббота, 27.02.2010, 13:41 | Сообщение # 3
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
SVR, а как же твой поезд?..

Обе твои теории вполне реальны и реализуемы. Но я бы не стал использовать матрицы.



Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Ang3L Дата: Воскресенье, 28.02.2010, 02:30 | Сообщение # 4
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Ну первое что надо понять, что если делать доскональный симулятор, то всё это упадёт ещё в первом шаге. Я не говорю, какой-то супер-пупер симуляторный симулятор, просто обработка каждого человечка. Как я уже неоднократно говорил: игры не то что кажется.

В играх информация обрабатывается "оптом". Т.е. не человечек стремится куда-то, а станция может генерировать человечков с опред. скоростью. Допустим есть путь: (1)->(2)->(3)->(4). Цикличный. В станций (1) генерируется опред. кол-во человечков. Допустим +5 для станций (2) в период, +2 для (3) и +10 для (4). Прошло 3 игровых периода (1 период может быть час, а может день). Подъезжает автобус который вмещает 50 челов. На станций (1): 15 челов на (2), 6 на (3), 30 на (4). Часть загружаем в автобус (как загружать - дело десятое), т.е. + автобусу и - станций, 8 пассажиров остаётся. На станций (2) -15 пассажиров станций (2) автобусу и загружаем автобус снова столько сколько сгенерировалось в (2) и столько сколько вмещает автобус. И так с каждой след. станцией. С одной стороны кажется что пассажиры куда-то стремятся, с другой простое сложение и вычитание чисел. И дополнение: станция не "плюсует" пассажиров своего "типа". Ну это понятно.

Ситуацию можно усложнить до нескольких путей.
(1)->(2)->(3)(7)->(4)
(5)->(6)->(3)(7)->(8)
2 пути пересекаются в точке (3)(7). Теперь они как бы одно целое. (3)(7) - общий узел который может генерировать числа на любой путь который он образует. Остальные только на свой путь. И т.д. усложняя на столько насколько нужно. И ещё один нюанс, тут получается цикличный обход, и все автобусы попадают на все станции своего пути и поэтому "пассажирам" пофиг в какой автобус сесть, они в любом случае доедут. Этот нюанс также можно усложнить.

В TTD ещё проще. Каждая станция генерирует опред. кол-во "товара" в зависимости от популярности. Приезжает транспорт и забирает всё что может, это кол-во отбавляется от станций. Затем на след. станций выгружаем всё и сколько нужно было станций получаем за это бабло. Т.е. пассажиры были одного типа "перевези в след. станцию".

По способу маршрутизаций. Используем смешанные графы. Ребро - длина графа (просчитанная на этапе завершения строительства пути, т.е. когда не менее чем 2 станции связаны непрерывным путём). Ищем путь по А*. Искомый путь: минимальная сумма рёбр графа. Profit! happy Опять таки никаких сложных вычислений, единственная сложность, сложность графа зависит от размера мира, причём в геом. прогрессий. Ща не могу показать на пальцах, хочу спать... tongue

Не используем матрицы для экономии памяти. Т.е. каждое здание имеет "шанс" перевозки опред. кол-ва пассажиров. И когда уже проводишь путь (т.е. создаёшь тут граф), то активируешь здание и инициализируешь его, до этого это всего лишь пустышка (спрайт).

Т.е. нужно абстрагироваться от графики и сделать акцент на математической модели. Это будет не только точнее, но и намного быстрее. Просчитывать каждого человечка это круто и реалистично, но очень затратно. В начале когда создаётся карта в TTD там по моему около 10000челов, а к концу около полумиллиона. В TrafT "всего" 5000-6000, но с более глубокой моделью.

То что я описал похоже на второй метод у тебя и списано с TTD. biggrin

Но задача очень интересная (всегда любил TTD, ну и аналоги типа Traffic Giant, Transport Giant, Industry Giant, ну и помелочи) и нахрапом, за раз, её не решить.



Blogpost
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Симулятор работы общественного транспорта (Приглашаю к неспешному рассуждению)
Страница 1 из 11
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход