Pull to refresh

Экономическая стратегия или 4200 байт за 10 лет

Reading time4 min
Views26K
Мой предыдущий пост "Как сделать 3D шутер на JavaScript за пару дней" показал, что тема разработки браузерных игр весьма интересна и по этому я решил очередные выходные посвятить еще одной моей задумке.

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

2002 год. Лето

Десять лет назад я работал ночным сторожем, но сторож из меня был не совсем обычный. Так как я был с детства помешан на компьютерах (в семь лет первый раз познакомился с Агатом), то на работу я приходил со своим ноутбуком и модемом и действительно не спал до 10 утра следующего дня.

Всю ночь я проводил в сети. Мне было очень удобно так «работать», ведь по сути я получал деньги за то, что и так делал чаще всего по ночам, только в этом случае не надо с кем-то делить телефонную линию и по темной квартире за кружкой чая ходить очень тихо. И все было здорово и гладко, пока вдруг не начались достаточно частые перебои у провайдера, которого, по ряду причин, я не мог сменить. Так как к работе я всегда отношусь достаточно серьезно, а не спать без коннекта было тяжело, срочно нужна была замена в виде «оффлайн» развлечения.

Вот именно тогда я и скачал где-то довольно интересную «игрушку». Я к сожалению не могу сейчас точно вспомнить ее название, вероятнее всего «Fish Tycoon», написал ее русский программист (это точно). В игре предлагалось построить свою империю основанную на торговле рыбой (ну да, а почему бы и нет), постепенно расширяя торговую сеть необходимо было освоить весь рынок, что являлось результатом и могло в теории привести к победе в игре (так и не получилось). Сторожем я работал примерно пол года и за это время успел наиграться.

Шли года, я сменял места работы, занимался своим бизнесом, нанимался снова, переезжал в другой город, создавал различные проекты, но частенько с теплом вспоминал те пол года и «ту самую» игру. Скажу честно, идея написать аналог поселилась в голове наверное года два назад, но я всегда отодвигал эту затею по ряду обстоятельств. К тому же мне всегда казалось, что там будет уйма кода.

2013 год. Зима

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

Я почти сразу решил не акцентироваться на рыбе, хотя ностальгия и заставила сначала дать проекту кодовое название «fish», я затем решил абстрагироваться от названия товара, оставив собственно только слово «товар».
И вот в ночь с первого на второе я уселся за свой ноутбук и сделал первые наброски. Во первых я четко решил, что у меня будет удобный график, отражающий ситуацию на рынке в режиме реального времени и он точно будет на SVG. Вот такой:



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

Итак, что же в итоге получилось

Не имея знаний в экономике и финансах, я строил модель по свои правилам. Самая главная цифра — стоимость товара в конкретный промежуток времени (закупочная стоимость), я рассчитываю ее с помощью времени суток и синуса, а так же некоторого количества вызовов Math.random().
Имея эту цифру, как отправную точку, довольно легко придумать вариант расчета цены для продажи, а уж получив пару этих значений и сдобрив их некоторым количеством «случайностей» можно выудить коэффициент активности покупателей.

Для того что бы продавать закупленный товар, нам необходимо иметь место сбыта и сотрудника, который будет этим заниматься.
Для этого я реализовал модель маленького магазинчика, которую легко можно трансформировать в склад, другие варианты магазинов или офис. Так же можно добавить несколько вариантов сотрудников — менеджеров для увеличения рентабельности торговых операций и бухгалтеров, которые помогут оптимизировать налогообложение.

Весь код очень прост, менять различные формулы и коэффициенты можно до бесконечности, признаюсь, я залип на этом деле как-то раз до 5 утра. Получилась игра в игре.

Вернемся к процессу. Игровой цикл рассчитывается по 24-часовому принципу, с 23:00 до 5:00 следующего дня, любые торговые операции прекращены, а в выходные не работает рынок, по этому закупить новую партию товара нельзя. В остальное время автоматически происходит процесс торговли, в цикле просчитывается вероятность продаж, ее объем с учетом количества продавцов в магазине.
Кстати продавцы знают сколько времени они уже работают, какое количество товара уже реализовали, это можно будет использовать в дальнейшем для моделирования процесса увеличения опыта в торговле или например что бы требовать повышения зарплаты угрожая владельцу увольнением.

Что бы не ждать долго пока пройдет ночь или выходные, можно использовать различные варианты ускорения процесса х5 и х10 для того, что бы сутки пробегали незаметно.

При запуске выдается небольшая справка по игровому процессу и список кнопок, которыми пользоваться удобнее, чем мышью.

Покупая и продавая товар, мы постепенно упираемся в потолок размера запасов товара, тогда нужно арендовать еще магазины и нанимать продавцов, ежесуточно выдается расчет, сколько продано, на какую сумму, подсчитываются расходы на аренду, оплату продавцов и подводится итог.
Кстати все события транслируются в лог и всегда можно нажать паузу и вникнуть в детали происходящего.

Можно достаточно долго рассказывать о том, какие еще моменты поджидают в процессе игры, но тогда будет не так интересно играть.

Чуть не забыл, в названии топика фигурирует «4200 байт» — это размер после упаковки и сжатия gzip всех .js файлов проекта.

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

Прошлый раз много вопросов было написано лично, предлагаю в этот раз все писать в комментариях к посту.
Tags:
Hubs:
Total votes 59: ↑53 and ↓6+47
Comments38

Articles