IT Notes

Игровой искусственный интеллект: Редактор уровней

Предыдущие части:

  1. Игровой искусственный интеллект: Введение
  2. Игровой искусственный интеллект: Тестовая площадка
  3. Игровой искусственный интеллект: Простейшие алгоритмы
  4. Игровой искусственный интеллект: Поиск пути
  5. Игровой искусственный интеллект: Убегающий Бот

Не забудьте обновить версию проекта, сделав pull (тэг v1.4) или скачав архив с исходниками.

aisimulator-level-editor-empty

Основные изменения:

  1. Добавлена панель инструментов для переключения между режимом вставки (удаления) стен или ботов;
  2. Реализованы функции сохранения и загрузки карты уровня;
  3. Исправлены мелкие ошибки.

Раньше при щелчке левой кнопкой мыши на виджете Представления в игровой мир добавлялся зеленый Бот-цель. Теперь появилась возможность выбрать на панели инструментов элемент, который мы хотим добавить:

  1. Кнопка W - добавляем стены;
  2. Кнопка A - добавляем желтых Атакующий Ботов;
  3. Кнопка D - добавляем зеленых Защищающихся Ботов.

Убрать любой элемент из игрового мира можно путем щелчка по нему правой кнопкой мыши. Если же требуется удалять только Ботов, но не затрагивать стены, то достаточно выбрать режим, соответствующий кнопке X. Также обратите внимание на кнопку Kill Bots. Она позволяет мгновенно убить всех Ботов.

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

aisimulator-editing

Одна из базовых возможностей большинства программ - сохранение/загрузка результатов работы. И в нашем приложении она тоже окажется крайне полезной. Но как лучше хранить карту уровня? В Модели игровое поле представляет собой двумерную матрицу. Ее нам и нужно сохранить. Выбор заключается в том, что это можно сделать в виде текстового или двоичного файла. Такой вопрос мы затрагивали, когда говорили о сериализации данных в Qt, а также о сохранении данных в файл средствами Qt. С учетом всех преимуществ и недостатков выбираем вариант на основе текстового файла. В этом случае представленный на скриншоте уровень сохраняется в следующий map-файл:

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0
0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0
0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0
0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0
0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0
0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0
0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

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

Похожие публикации