Новый ИИ

Создавать новый ИИ я решил с алгоритмов связанных с городами.
ИИ создавался больше полугода. Первый месяц я пытался что-то делать, но хорошие идеи не приходили, поэтому результата не было. Но хорошая идея все таки появилась и я начал воплощать ее в жизнь. И тут появились первые проблемы: оказалось что для такой простой вещи как выбор ИИ лучшего места для города, требуется создание больших, очень сложных и запутанных алгоритмов, над написание которых я просидел четыре месяца. После этого я вздохнул с облегчением и принялся за компиляцию. И тут оказалось что основные проблемы только начинаются: сначала я два дня (по 4 часа в день) просидел над исправлением ошибок, найденных компиляторов, затем игра стала зависать, даже не начавшись, после исправления зависания (на которое ушло несколько дней) игра началась но сразу вылетела, после исправления первых вылетов (опять несколько потраченных дней), стало ясно что мой ИИ очень медленный и сильно примитивный и мои сложные алгоритмы (в которых я сам уже начал запутываться) надо еще усложнять и оптимизировать. На усложнение и оптимизацию кодов, которые постоянно сопровождались вылетами и зависаниями, а иногда и вообще непонятным поведением ИИ, ушел месяц.
И вот новый ИИ готов. Сделано пока что не очень много, только выбор места для будущего города, планирование улучшений вокруг города и порядок застройки улучшениями. Еще хотелось новые алгоритмы для управления рабочими, но учитывая количество потраченого времени, решил этим не заморачиватся.
Для нового ИИ были сделаны следующие параметры в GlobalDefinesAlt.xml:
AI_MIN_CITY_POPULATION - минимальное количество жителей в планируемом городе, при котором город может быть построен. При наличии ресурса этот параметр игнорируется.
AI_NUM_WORK_CITY_PLOTS - количество рабочих тайлов в планируемом ИИ городе. (влияет на плотность расположения городов)
AI_NUM_CITY_SPECIALISTS - минимальное количество спецов в городе при заполнении всех тайлов. (влияет на планирование улучшений)
AI_MIN_PRODUCTION_PER_CITY - количество молотков в планируемом городе. (влияет на планирование улучшений)

Выбор места для города

Старый ИИ выбирает так:
Берутся все тайлы в пределах радиуса будущего города (независимо от того принадлежат они другому городу этого игрока или нет). За каждый тайл начисляется определенное количество балов (за каждую еду — 60, молоток — 40, монету — 20, за ресурс, за доступ к пресной воде и т. д. тоже свое количество балов). Балы сумируются и теоретический город с наибольшим количеством балов считается лушим.
В моем ИИ выбор делается так:
Из всех тайлов в пределах радиуса будущего города выбираются те, которые не планируются вводить в состав других городов этого игрока (реальных или спланированых) и чтоб и количество, по возможности было AI_NUM_WORK_CITY_PLOTS. Потом на этих тайлах планируются улучшения (независимо от того знает он нужные технологии или нет (с расчетом на будущее)). Лучшее место для города зависит от очерёдности проверок по таким параметрам как: наличие ресурсов в городе, возможность устраивать переправы, удовлетворенность условиям AI_NUM_WORK_CITY_PLOTS, AI_NUM_CITY_SPECIALISTS, AI_MIN_PRODUCTION_PER_CITY и т.д.

Выбор и порядок застройки улучшениями

В старом ИИ выбор и порядок застройки улучшениями зависил от текущего состояния города: нехватает еды — строим улучшения на еду, построили улучшение на еду — стало мало денег — значит строим улучшение на деньги. Это приводило к тому, что на тайле с фермой ИИ строил коттедж, а на соседнем тайле с коттеджем строил ферму. После этого все повторялось заново.
В новом ИИ выбор улучшений выполняется тем же алгоритмом, которым выбираются улучшения при выборе места для города. Только на этот раз планируются возможные к постройке улучшения. Улучшения всегда планируются на одном и том же месте (места могут меняться при изменении границ города). Порядок застройки зависит не только от ситуации в городе, но и от ситуации в стране (во время войны улучшения увеличивающие молотки, по возможности, строятся раньше других).