(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);
})();