M.A.X.    Вы вошли как гость
Российский Клуб игроков M.A.X.
 
[Новости]   [Новичку]   [Энциклопедия]   [Документы]   [Файлы]   [Игроки]   [Архивы]   [Архив форума]  
[Новый сайт]   [M.A.X. Gold]   [Партии]  

 
 
 
Архив форума  МаксГолд
[Основной форум] [Голосования] [МаксГолд] [Off-Topic]
 


Вторая ревизия, исправленная и додуманная  -  Artlav,  08.02.2011  11:50:07

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

 


Предпосылки:
-Юниты на сетке, связность заранее не известна
-Поиск связности идёт рекурсивно по карте присутствия (unu)
-Обрабатывается по одному ресурсу за раз без приоритетов
-Обработка возможно как по временной схеме, без изменеий (для запросов), так и по постоянной
-Потребляющий юнит не может быть невыключаемым
-Производящий юнит может быть невыключаемым
-У юнита есть единое состояние включенности, при котором он потребляет и производит
-Хранение и долги юнит даёт всегда, отказаться нельзя
-Проводимость у юнита постоянная

Шахта:
-Производство фиксируется при создании и перерассчитывается при распределении
-Производство не может превышать 16 единиц в сумме добываемых материалов



События игры:
-Создан юнит
--=Выключенный или постоянно производящий.
--=Может изменить связность, но не влияет на распределение
--=Ничего менять не надо

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

-Запущен юнит
--=Запросить возможность включения, запрос идёт по временной схеме
--=В случае успеха повторить на основной схеме или скопировать в неё
--=В случае неуспеха не запускать

-Остановлен юнит
--=Запросить возможность остановки, по временной схеме
--=В случае успеха повторить на основной схеме или скопировать в неё
--=В случае неуспеха не останавливать

-Изменено потребление/производство юнита
--=Запросить разницу как запрос добавления/остановки, по временной схеме. Один ресурс за событие
--=В случае успеха повторить на основной схеме или скопировать в неё

-Заменён юнит (удалён-создан без изменения связности, например здание построено на коннекторе)
--=Ресурсы не задействованны, удалить и создать без запросов к распределителю

-Передача материалов
---Проверить на связность, если да - то передать долг вместе с материалом, если нет, то следующий такт.
--=Если долг превышает остаток+производство, то сделать долг равным производству и обновить, иначе ничего не делать



Обновление:
-Возможные конечные ситуации:
--=Всё ОК
--=Долги остались, потребитель пропал
--=Потребление осталось, долги пропали
-Решение:
--=Обойти всё, суммировать потребление и суммировать долги
--=Вычесть из долгов потребление, остаток долга освободить или избыток добавить


Рекурсивность:
-При запуске может понадобиться запустить производителя, приводя к рекурсивному запросу
-Временная схема одна.
-Как делать?

Раздельность:
-Если обновлять ресурсы по отдельность, то как гарантировать то, что обновление одного не угробит обновление другого?
-Рекурсивность по разным ресурсам?



Конец хода:
-Требования:
--=Нужно удовлетворить потребности
--=Нужно остановить тех, кто не получил по потребностям
--=Нужно положить избыток в хранилища (возможно, что произведено больше, чем влезет, но будет потрачено и влезет)
--=Нужно обновить потребления у производителей
--=Всё должно быть целостным
-Решения:
--=Предположить, что всё обновлено, либо вызвать обновление?
--=Произвести всё, положить в хранилища не учитывая ограничения
--=Вычесть все долги, из хранилищ. Производство учитывается переполнением хранилищ
--=Отсечь избыток из хранилищ, распределив его по остальным и выбросив невлазящее (запрос на немедленную клажу в себя, что не влезло - удалить)
--=Пересчитать потребление - продвинуть строительство, и т.п.
--=Обновить



Данные:
-Для каждого ресурса хранится рабочая и рассчётная структура:
--=num Суммарное число
--=use Потребить в этом ходу
--=now Имеется на борту
--=pro Произвести за этот ход
--=dbt Долг за этот ход, необходим чтобы определить, а можем ли мы включить что-то


Функции:
-Обновить
-Конец хода
-Передача

-Добавить ресурс немедленно, рекурсивно, не меняет балансировку
--=Обойти всех, кладя по мере нахождения пустот, выйти при иссякании запроса, или вернуть недоложенное как результат

-Запрос наличия:
--наличия ресурса (сумма хранения)
--наличия свободного места (сумма пустоты)
--наличия свободного долга (сумма производства и хранения)
--наличия свободного ресурса (хранение минус max(0,(долг минус производство)))
--=Обойти всех, суммируя требуемое, и вернуть сумму как результат

-Запрос на добавление долга
--=Обойти всех по временной схеме, добавляя долг
--=Если не хватате, то откатить и начать поиск объекта для запуска, запустить его, и вернуться в начала
--=Если хватило, то перенести временное в постоянное, иначе вернуть отказ
--=Что если хватило одного ресурса, но не второго? Электры останутся запущенными, и всё?

-Запуск юнита:
--=Проверить необходимость потребления, если нет, то всё
--=Если есть потребление, то по отдельности на каждый ресурс запросить долг по временной схеме (кто её инициализирует?)
--=Если хватило, то запросить долг по основной

-Остановка юнита:
--=Если нет производства, то освободить потребление и всё
--=Если есть производство, то по временной схеме запросить эквивалентное число долгов (исключая себя)
--=Если хватило, то выключится и запросить по основной схеме, освободить потребление, и готово



В диалоге передачи делать функцию отображения только незаблокированных ресурсов?
т.е., есть полный склад и завод, съедающий 9 материалов.
Показывать, что можно передать безопасные 41 или все 50?