Загрузка данных


(function() {
    console.log("Запуск профессионального алгоритма для игры 'Бит'...");

    const DELAY = 150; 
    
    // Матрица весов: прижимаем всё к правому нижнему углу (самая дорогая клетка)
    const weights = [
        [1, 2, 4, 8],
        [16, 32, 64, 128],
        [256, 512, 1024, 2048],
        [4096, 8192, 16384, 32768]
    ];

    function getGrid() {
        let grid = Array(4).fill(0).map(() => Array(4).fill(0));
        // Ищем все ячейки поля. Судя по видео, они находятся внутри div.cardBody
        const tiles = Array.from(document.querySelectorAll('div')).filter(el => 
            el.innerText && (el.innerText.includes('байт') || el.innerText.includes('бит') || el.innerText.includes('КБ'))
        );

        if (tiles.length === 0) return null;

        // Находим контейнер игры для расчета координат
        const container = tiles[0].parentElement.getBoundingClientRect();
        const cellW = container.width / 4;
        const cellH = container.height / 4;

        tiles.forEach(tile => {
            const rect = tile.getBoundingClientRect();
            // Вытаскиваем только число
            const val = parseInt(tile.innerText.replace(/[^0-9]/g, '')) || 0;
            const col = Math.floor((rect.left - container.left + cellW / 2) / cellW);
            const row = Math.floor((rect.top - container.top + cellH / 2) / cellH);
            
            if (row >= 0 && row < 4 && col >= 0 && col < 4) {
                grid[row][col] = val;
            }
        });
        return grid;
    }

    function evaluate(grid) {
        let score = 0;
        let emptyCells = 0;
        for (let r = 0; r < 4; r++) {
            for (let c = 0; c < 4; c++) {
                if (grid[r][c] > 0) {
                    score += Math.log2(grid[r][c]) * weights[r][c];
                } else {
                    emptyCells++;
                }
            }
        }
        // Бонус за пустые клетки (чтобы выживать дольше)
        return score + (emptyCells * 100);
    }

    function sendKey(dir) {
        const codes = { 'U': 38, 'R': 39, 'D': 40, 'L': 37 };
        const k = 'Arrow' + (dir==='U'?'Up':dir==='R'?'Right':dir==='D'?'Down':'Left');
        const ev = new KeyboardEvent('keydown', { key: k, code: k, keyCode: codes[dir], which: codes[dir], bubbles: true });
        window.dispatchEvent(ev);
        document.dispatchEvent(ev);
    }

    const brain = setInterval(() => {
        const grid = getGrid();
        if (!grid) return;

        // Считаем баллы для каждого направления
        // Мы НЕ используем UP, пока это не станет единственным выходом
        const scoreD = evaluate(grid); // Базовый вес для DOWN
        const scoreR = evaluate(grid) * 0.95; // Чуть меньше для RIGHT
        const scoreL = evaluate(grid) * 0.1; // Огромный штраф для LEFT
        
        const empty = grid.flat().filter(v => v === 0).length;

        // Логика выбора:
        if (empty > 3) {
            // Если места много, просто долбим DOWN и RIGHT
            Math.random() > 0.5 ? sendKey('D') : sendKey('R');
        } else {
            // Если тесно — выбираем лучшее по весу
            if (scoreD >= scoreR) {
                sendKey('D');
            } else {
                sendKey('R');
            }
            
            // Если застряли (совсем нет ходов DOWN/RIGHT), пробуем LEFT
            if (Math.random() > 0.9) sendKey('L');
        }

        if (document.body.innerText.includes("Игра окончена")) clearInterval(brain);
    }, DELAY);
})();