Замки
Головоломка взлома на основе «Лучей». Поверните зеркала так, чтобы свет зажёг все кристаллы и не задел сигнализацию. Каждый поворот тратит отмычку. У каждого замка своя механика, а не просто поле побольше.
Отмычки
Минимум ходов
Как встроить в свою игру
Генератор не зависит от браузера: на входе тип замка и сид, на выходе чистые данные уровня. Один и тот же сид всегда даёт один и тот же замок, удобно для сохранений и для повторной попытки.
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'
});
Как работает генератор, если будете переносить на другой движок:
- Раскладываем случайные детали: зеркала, делители, стены. У каждой вращающейся детали два положения, спаренные детали делят одну «группу».
- Перебираем все 2групп положений (групп не больше 12, это максимум 4096 вариантов) и для каждого трассируем лучи.
- Берём одно случайное положение как задуманное решение: кристаллы ставим на клетки, которые оно освещает, а сигнализацию — на клетки, которые оно не освещает, но освещают многие другие положения.
- По перебору считаем все решения. Если решений больше заданной доли, замок слишком лёгкий, и мы его отбрасываем.
- Стартовое положение выбираем так, чтобы до ближайшего решения было не меньше N поворотов. Это число становится «минимумом ходов», а отмычек выдаём с небольшим запасом.
Решаемость гарантирована построением, а сложность измерена точно, а не на глаз. Перебор занимает миллисекунды.