Замки

Головоломка взлома на основе «Лучей». Поверните зеркала так, чтобы свет зажёг все кристаллы и не задел сигнализацию. Каждый поворот тратит отмычку. У каждого замка своя механика, а не просто поле побольше.

Отмычки Минимум ходов

Как встроить в свою игру

Генератор не зависит от браузера: на входе тип замка и сид, на выходе чистые данные уровня. Один и тот же сид всегда даёт один и тот же замок, удобно для сохранений и для повторной попытки.

const level = BeamLock.generate('safe', 12345);
// level = { N, cells, sources, crystals, alarms, start, groups, par, solution, timeLimit, picks }

const lock = BeamLock.mount(canvas, level, {
  onSolve: ({ moves, timeLeft }) => openDoor(),
  onFail:  (reason) => triggerGuards(),   // 'picks' | 'time'
});

Как работает генератор, если будете переносить на другой движок:

  1. Раскладываем случайные детали: зеркала, делители, стены. У каждой вращающейся детали два положения, спаренные детали делят одну «группу».
  2. Перебираем все 2групп положений (групп не больше 12, это максимум 4096 вариантов) и для каждого трассируем лучи.
  3. Берём одно случайное положение как задуманное решение: кристаллы ставим на клетки, которые оно освещает, а сигнализацию — на клетки, которые оно не освещает, но освещают многие другие положения.
  4. По перебору считаем все решения. Если решений больше заданной доли, замок слишком лёгкий, и мы его отбрасываем.
  5. Стартовое положение выбираем так, чтобы до ближайшего решения было не меньше N поворотов. Это число становится «минимумом ходов», а отмычек выдаём с небольшим запасом.

Решаемость гарантирована построением, а сложность измерена точно, а не на глаз. Перебор занимает миллисекунды.