Урок 12 · Слайд 1
🤖

AI в играх — это не ChatGPT

Умные противники без нейросетей

Когда в играх говорят "AI противника" — это не нейросеть! Это код, который принимает решения по правилам. Например:

  • Призраки в Pac-Man — простые правила движения
  • Враг в шутере — следить за игроком, прятаться
  • Противник в шахматах — перебор ходов

Виды игрового AI:

  • Random AI — случайные решения
  • Chasing AI — преследование игрока
  • FSM — конечный автомат состояний
  • Pathfinding — поиск пути (A*)
📖 Словарик
AI (искусственный интеллект в играх)
Алгоритмы, управляющие поведением персонажей.
"AI противника в Minecraft обходит препятствия"
NPC
Non-Player Character — персонаж, управляемый компьютером.
"Торговец, враг, союзник — всё это NPC"
Урок 12 · Слайд 2
🎲

Random AI: случайные решения

Простейший AI — но может удивить!

ai.js — случайный враг
const ХОДЫ = [
  {dx: 1, dy: 0}, // вправо
  {dx: -1, dy: 0}, // влево
  {dx: 0, dy: 1}, // вниз
  {dx: 0, dy: -1}, // вверх
];

function randomAI(враг) {
  // Случайный ход из 4 направлений
  const ход = ХОДЫ[Math.floor(Math.random() * 4)];
  враг.x += ход.dx;
  враг.y += ход.dy;
}

// С вероятностью 20% меняем направление
function wanderAI(враг) {
  if (Math.random() < 0.2) {
    враг.ход = ХОДЫ[Math.floor(Math.random() * 4)];
  }
  враг.x += враг.ход.dx;
  враг.y += враг.ход.dy;
}
📖 Словарик
Math.random()
Случайное число от 0 до 1 (не включая 1).
"random() < 0.2 — 20% шанс что-то сделать"
Wander (блуждание)
AI движется прямо, иногда случайно меняет направление.
"Призраки в ранних играх используют wander"
Урок 12 · Слайд 3
🎯

Chasing AI: преследование игрока

Враг движется к тебе!

ai.js — преследование
function chaseAI(враг, игрок) {
  // Расстояние по X и Y
  const dx = игрок.x - враг.x;
  const dy = игрок.y - враг.y;
  
  // Двигаемся по большей разнице
  if (Math.abs(dx) > Math.abs(dy)) {
    // Двигаемся по X
    враг.x += dx > 0 ? 1 : -1;
  } else {
    // Двигаемся по Y
    враг.y += dy > 0 ? 1 : -1;
  }
}

// Расстояние до игрока (для радиуса агрессии)
function расстояние(a, b) {
  return Math.sqrt((a.x-b.x)**2 + (a.y-b.y)**2);
}

// Агрессивный только вблизи
if (расстояние(враг, игрок) < 200) {
  chaseAI(враг, игрок);
} else {
  wanderAI(враг);
}
📖 Словарик
Chasing AI (преследование)
Враг движется к позиции игрока каждый кадр.
"Blinky (красный призрак Pac-Man) — чистый chasing AI"
Радиус агрессии
Расстояние, на котором враг "замечает" игрока.
"Ближе 200px — преследует, дальше — блуждает"
Урок 12 · Слайд 4
🗺️

Pathfinding: поиск пути (A*)

Как обходить препятствия

ai.js — идея A*
// A* = поиск кратчайшего пути на графе
// f(n) = g(n) + h(n)
// g = стоимость пути от старта до n
// h = эвристика (расстояние до цели)

// Манхэттенское расстояние (эвристика)
function manhattan(a, b) {
  return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
}

// Открытый список = клетки для проверки
// Закрытый список = уже проверенные
// На каждом шаге выбираем клетку с
// наименьшим f = g + h

// Результат A*: список клеток — маршрут!
// Враг идёт по этому маршруту

В реальных играх: Minecraft, Age of Empires, StarCraft — все используют A* или его улучшения для поиска пути. Это один из самых важных алгоритмов в геймдеве!

📖 Словарик
A* (A-star)
Алгоритм поиска кратчайшего пути с эвристикой.
"A* быстрее Dijkstra за счёт эвристики"
Эвристика
Приближённая оценка расстояния до цели.
"Манхэттенское расстояние |dx|+|dy| — эвристика для сеток"
Урок 12 · Слайд 5
🔄

FSM: состояния врага

Конечный автомат — мозг персонажа

😴 Патруль
Движется по маршруту
👀 Тревога
Заметил игрока
🏃 Атака
Преследует игрока
ai.js — FSM
const СОСТОЯНИЯ = {
  ПАТРУЛЬ: 'patrol',
  ТРЕВОГА: 'alert',
  АТАКА: 'chase'
};

враг.состояние = СОСТОЯНИЯ.ПАТРУЛЬ;

function обновитьAI(враг, игрок) {
  const dist = расстояние(враг, игрок);
  
  switch (враг.состояние) {
    case СОСТОЯНИЯ.ПАТРУЛЬ:
      патрулировать(враг);
      if (dist < 200) враг.состояние = СОСТОЯНИЯ.ТРЕВОГА;
      break;
    case СОСТОЯНИЯ.ТРЕВОГА:
      if (dist < 100) враг.состояние = СОСТОЯНИЯ.АТАКА;
      if (dist > 300) враг.состояние = СОСТОЯНИЯ.ПАТРУЛЬ;
      break;
    case СОСТОЯНИЯ.АТАКА:
      chaseAI(враг, игрок);
      break;
  }
}
📖 Словарик
FSM (Finite State Machine)
Конечный автомат: набор состояний и правил переходов между ними.
"Враг переходит: ПАТРУЛЬ → ТРЕВОГА → АТАКА"
Переход состояния
Условие, при котором AI переходит в другое состояние.
"dist < 200 — переход в ТРЕВОГА"
Урок 12 · Слайд 6
⚖️

Балансировка сложности

Игра должна быть интересной, не злой

ai.js — динамическая сложность
let уровень = 1;
let счёт = 0;

// Параметры AI зависят от уровня
function параметрыAI() {
  return {
    скорость: 1 + уровень * 0.3,
    радиусАгрессии: 100 + уровень * 20,
    шансРандома: 0.4 - уровень * 0.05,
  };
}

// Повышаем уровень каждые 10 очков
function обновитьУровень() {
  уровень = Math.floor(счёт / 10) + 1;
}

// Иногда AI делает "ошибку" (не слишком умный)
function aiСОшибкой(враг, игрок, шанс = 0.2) {
  if (Math.random() < шанс) {
    wanderAI(враг); // иногда плутает
  } else {
    chaseAI(враг, игрок); // обычно преследует
  }
}
📖 Словарик
Балансировка
Настройка параметров для комфортного уровня сложности.
"Слишком лёгко — скучно, слишком сложно — злит"
Динамическая сложность
AI усиливается по мере роста счёта или уровня.
"Каждые 10 очков враг становится быстрее"
Урок 12 · Слайд 7
🎮

Мини-проект: враг с AI

Добавь умного врага в свою игру!

1
Создай Canvas-игру: игрок управляется стрелками, перемещается по полю
2
Добавь врага с wanderAI — он блуждает случайно
3
Добавь радиус агрессии — если игрок близко, враг переходит к chaseAI
4
Реализуй FSM: PATROL → ALERT → CHASE (3 состояния)
5
★ Бонус: добавь несколько врагов с разными параметрами 🏆