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;
 ...