Предыдущие части:
Как обычно, новую версию проекта можно скачать архивом, или сделать pull
.
Новые возможности:
W
, A
, D
и X
назначены соответствующие быстрые клавиши.Увеличивать размер игрового уровня проще, чем уменьшать его. В этом случае достаточно добавить либо строки, либо столбцы в матрицу m_field
, представляющую игровой мир. При уменьшении размера приходится наоборот удалять строки или столбцы матрицы. В этом случае мы теряем часть рельефа игрового мира. К тому же, под сокращение могут попасть Боты, выпавшие за границы уровня. Управление изменением размера карты в рамках ГУИ реализовано с помощью слайдеров и спин-боксов.
Запуск и останов симуляции можно реализовать через старт и стоп внутреннего таймера, по сигналам которого живет игровой мир. Но так можно нарваться на проблемы, связанные с тем, что Представление также перестает обновляться. Поэтому при остановке симуляции таймер не останавливается, но игровой мир замирает, то есть функция-член doStep()
Модели перестает вызываться, а Представление все еще находится в активном состоянии. Ускорение симуляции реализуем путем сокращения интервала времени между срабатываниями таймера, а для замедления наоборот - увеличиваем интервал.
Информацию о Боте будем показывать в виде полупрозрачного окна рядом с ним. О Боте интересно узнать его идентификационный номер, текущее направление и координаты (в точках и пикселях). Полупрозрачное окно - обычный QLabel
. При перемещении Бота этот QLabel
двигается за ним. Похожим образом QLabel
мы уже использовали, когда говорили об отображении одного QWidget над другим. После добавления нового Бота он становится целью для отслеживания. Переключиться на другого Бота можно с помощью щелчка средней кнопкой мыши по нему. Второй щелчок средней кнопкой мыши по уже выбранному Боту заставляет исчезнуть окошко с информацией (того же эффекта можно добиться нажатием клавиши Esc
).
Обработка быстрых клавиш реализована с помощью QShortcut
:
// Для кнопки W
connect(
new QShortcut(
QKeySequence( Qt::Key_W ), this
),
SIGNAL( activated() ),
ui->bnWall,
SLOT( click() )
);
// Для других кнопок аналогично…
В последних двух статьях мы немного отошли от основной темы - ИИИ. Тем не менее, добавленные функции весьма полезны и пригодятся нам в дальнейшем (на самом деле, хотелось бы еще больше, но на первое время и этого достаточно). В следующий раз мы возвращаемся к алгоритмам ИИИ и посмотрим на применение искусственных нейронных сетей…