JSFiddle - React, Tailwind, and code Playground
by Konstantin Cryman
HTML
<canvas id="dungeonCanvas" width="800" height="400"></canvas>
<script src="dungeon.js"></script> <!-- Підключити ваш скрипт тут -->
JavaScript
function generateDungeon(gridWidth, gridHeight, maxRoomSize) {
const dungeon = Array(gridHeight).fill(null).map(() => Array(gridWidth).fill(0)); // Сітка для підземелля (0 — пусте місце)
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function createRoom(centerX, centerY) {
const roomWidth = getRandomInt(3, maxRoomSize);
const roomHeight = getRandomInt(3, maxRoomSize);
const roomX = centerX - Math.floor(roomWidth / 2);
const roomY = centerY - Math.floor(roomHeight / 2);
// Перевірка, чи може бути створена кімната, залишаючи одну клітину стінки
for (let y = roomY - 1; y <= roomY + roomHeight; y++) {
for (let x = roomX - 1; x <= roomX + roomWidth; x++) {
if (dungeon[y] && dungeon[y][x] !== undefined && dungeon[y][x] !== 0) {
return null; // Якщо є накладення, повертаємо null
}
}
}
// Створюємо кімнату на сітці
for (let y = roomY; y < roomY + roomHeight; y++) {
for (let x = roomX; x < roomX + roomWidth; x++) {
dungeon[y][x] = 1; // 1 — це частина кімнати
}
}
return { roomX, roomY, roomWidth, roomHeight };
}
function canCreateCorridor(x1, y1, x2, y2) {
// Перевірка, чи можуть бути створені коридори між двома кімнатами
if (x1 === x2) {
const minY = Math.min(y1, y2);
const maxY = Math.max(y1, y2);
for (let y = minY; y <= maxY; y++) {
if (dungeon[y][x1] === 1) { // Якщо під коридором є кімната
return false;
}
}
} else {
const minX = Math.min(x1, x2);
const maxX = Math.max(x1, x2);
for (let x = minX; x <= maxX; x++) {
if (dungeon[y1][x] === 1) { // Якщо під коридором є кімната
return false;
...