IT Notes

Игровой искусственный интеллект: Наращиваем функционал

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

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

Обновление исходников

Как обычно, новую версию проекта можно скачать архивом, или сделать pull.

level-editor-update-v1.5

Новые возможности:

  1. Высоту и ширину игрового уровня можно изменять в определенных промежутках;
  2. Симуляцию можно останавливать и запускать, а также изменять ее скорость;
  3. Для любого Бота можно просмотреть отладочную информацию;
  4. Кнопкам W, A, D и X назначены соответствующие быстрые клавиши.

Увеличивать размер игрового уровня проще, чем уменьшать его. В этом случае достаточно добавить либо строки, либо столбцы в матрицу m_field, представляющую игровой мир. При уменьшении размера приходится наоборот удалять строки или столбцы матрицы. В этом случае мы теряем часть рельефа игрового мира. К тому же, под сокращение могут попасть Боты, выпавшие за границы уровня. Управление изменением размера карты в рамках ГУИ реализовано с помощью слайдеров и спин-боксов.

Запуск и останов симуляции можно реализовать через старт и стоп внутреннего таймера, по сигналам которого живет игровой мир. Но так можно нарваться на проблемы, связанные с тем, что Представление также перестает обновляться. Поэтому при остановке симуляции таймер не останавливается, но игровой мир замирает, то есть функция-член doStep() Модели перестает вызываться, а Представление все еще находится в активном состоянии. Ускорение симуляции реализуем путем сокращения интервала времени между срабатываниями таймера, а для замедления наоборот - увеличиваем интервал.

aisimulator-bot-debug-info

Информацию о Боте будем показывать в виде полупрозрачного окна рядом с ним. О Боте интересно узнать его идентификационный номер, текущее направление и координаты (в точках и пикселях). Полупрозрачное окно - обычный QLabel. При перемещении Бота этот QLabel двигается за ним. Похожим образом QLabel мы уже использовали, когда говорили об отображении одного QWidget над другим. После добавления нового Бота он становится целью для отслеживания. Переключиться на другого Бота можно с помощью щелчка средней кнопкой мыши по нему. Второй щелчок средней кнопкой мыши по уже выбранному Боту заставляет исчезнуть окошко с информацией (того же эффекта можно добиться нажатием клавиши Esc).

Обработка быстрых клавиш реализована с помощью QShortcut:

// Для кнопки W
connect(
    new QShortcut(
        QKeySequence( Qt::Key_W ), this
    ),
    SIGNAL( activated() ),
    ui->bnWall,
    SLOT( click() )
);

// Для других кнопок аналогично…

Заключение

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

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