Предыдущие части:
Не забудьте обновить версию проекта, сделав pull
(тэг v1.4
) или скачав архив с исходниками.
Основные изменения:
Раньше при щелчке левой кнопкой мыши на виджете Представления в игровой мир добавлялся зеленый Бот-цель. Теперь появилась возможность выбрать на панели инструментов элемент, который мы хотим добавить:
W
- добавляем стены;A
- добавляем желтых Атакующий Ботов;D
- добавляем зеленых Защищающихся Ботов.Убрать любой элемент из игрового мира можно путем щелчка по нему правой кнопкой мыши. Если же требуется удалять только Ботов, но не затрагивать стены, то достаточно выбрать режим, соответствующий кнопке X
. Также обратите внимание на кнопку Kill Bots
. Она позволяет мгновенно убить всех Ботов.
Реализация описанного функционала не представляет особых сложностей, поэтому мы на ней останавливаться не будем. К тому же, эта часть проекта является скорее побочной и интересна нам в первую очередь с прикладной точки зрения, как пользователям.
Одна из базовых возможностей большинства программ - сохранение/загрузка результатов работы. И в нашем приложении она тоже окажется крайне полезной. Но как лучше хранить карту уровня? В Модели игровое поле представляет собой двумерную матрицу. Ее нам и нужно сохранить. Выбор заключается в том, что это можно сделать в виде текстового или двоичного файла. Такой вопрос мы затрагивали, когда говорили о сериализации данных в 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
Получилось неплохо, но функционал все еще довольно бедный. Хотелось бы добавить возможность изменения размеров игрового поля, просмотр отладочной информации о состоянии ботов, а также функции управления скоростью симуляции игрового мира. Этим мы и займемся в следующий раз…