let currentLevel = 1; let score = 0; let moves = 0; let board = []; let selectedCell = null; let isProcessing = false; // Набір фруктів для гри const emojis = ['🍎', '🍌', '🍇', '🍓', '🍒', '🥝']; function navigateTo(screenId) { document.querySelectorAll('.screen').forEach(s => s.classList.remove('active')); document.getElementById(screenId).classList.add('active'); } function startGame(level) { currentLevel = level; score = 0; const target = 12; // Ваша ціль для 1 рівня document.getElementById('level-title').innerHTML = `Рівень ${level}
Ціль: зберіть ${target} ягід`; const boardElement = document.getElementById('game-board'); // Налаштування сітки 9x9 const size = 9; boardElement.style.gridTemplateColumns = `repeat(${size}, 1fr)`; boardElement.innerHTML = ''; // Створюємо логічну сітку createBoard(size); navigateTo('game-screen'); } function createBoard(size) { board = []; const boardElement = document.getElementById('game-board'); // Адаптивний розмір клітинки для 9x9 const cellSize = Math.floor((window.innerWidth > 500 ? 400 : window.innerWidth - 60) / size); for (let r = 0; r < size; r++) { board[r] = []; for (let c = 0; c < size; c++) { // Рандомний фрукт let randomEmoji = Math.floor(Math.random() * emojis.length); board[r][c] = randomEmoji; const cell = document.createElement('div'); cell.id = `cell-${r}-${c}`; cell.className = 'cell'; cell.style.width = `${cellSize}px`; cell.style.height = `${cellSize}px`; cell.style.display = 'flex'; cell.style.alignItems = 'center'; cell.style.justifyContent = 'center'; cell.style.fontSize = `${cellSize * 0.7}px`; cell.style.cursor = 'pointer'; cell.style.border = '1px solid #ddd'; cell.style.backgroundColor = '#fff'; cell.innerText = emojis[randomEmoji]; cell.onclick = () => handleCellClick(r, c); boardElement.appendChild(cell); } } } async function handleCellClick(r, c) { if (isProcessing) return; const currentCellElement = document.getElementById(`cell-${r}-${c}`); if (!selectedCell) { selectedCell = { r, c, el: currentCellElement }; currentCellElement.style.outline = "3px solid #ff4757"; currentCellElement.style.zIndex = "10"; } else { const rDiff = Math.abs(r - selectedCell.r); const cDiff = Math.abs(c - selectedCell.c); // Перевірка, чи клітинки сусідні if ((rDiff === 1 && cDiff === 0) || (rDiff === 0 && cDiff === 1)) { await swapGems(selectedCell.r, selectedCell.c, r, c); } selectedCell.el.style.outline = "none"; selectedCell = null; } } async function swapGems(r1, c1, r2, c2) { isProcessing = true; // Міняємо місцями в масиві let temp = board[r1][c1]; board[r1][c1] = board[r2][c2]; board[r2][c2] = temp; updateVisualBoard(); if (hasMatches()) { await processMatches(); } else { // Якщо збігів немає — повертаємо назад await new Promise(r => setTimeout(r, 300)); let temp = board[r1][c1]; board[r1][c1] = board[r2][c2]; board[r2][c2] = temp; updateVisualBoard(); } isProcessing = false; checkWinCondition(); } function hasMatches() { const size = 9; for (let r = 0; r < size; r++) { for (let c = 0; c < size; c++) { if (c < size - 2 && board[r][c] === board[r][c+1] && board[r][c] === board[r][c+2]) return true; if (r < size - 2 && board[r][c] === board[r+1][c] && board[r][c] === board[r+2][c]) return true; } } return false; } async function processMatches() { const size = 9; let matched = true; while (matched) { let toClear = Array.from({ length: size }, () => Array(size).fill(false)); matched = false; // Пошук горизонтальних і вертикальних ліній for (let r = 0; r < size; r++) { for (let c = 0; c < size; c++) { if (c < size - 2 && board[r][c] !== -1 && board[r][c] === board[r][c+1] && board[r][c] === board[r][c+2]) { toClear[r][c] = toClear[r][c+1] = toClear[r][c+2] = true; matched = true; } if (r < size - 2 && board[r][c] !== -1 && board[r][c] === board[r+1][c] && board[r][c] === board[r+2][c]) { toClear[r][c] = toClear[r+1][c] = toClear[r+2][c] = true; matched = true; } } } if (matched) { for (let r = 0; r < size; r++) { for (let c = 0; c < size; c++) { if (toClear[r][c]) { board[r][c] = -1; // Позначаємо як видалене score++; } } } updateVisualBoard(); await new Promise(r => setTimeout(r, 400)); fillEmpty(); updateVisualBoard(); await new Promise(r => setTimeout(r, 400)); } } } function fillEmpty() { const size = 9; for (let c = 0; c < size; c++) { for (let r = size - 1; r >= 0; r--) { if (board[r][c] === -1) { // Зсуваємо верхні вниз for (let k = r - 1; k >= 0; k--) { if (board[k][c] !== -1) { board[r][c] = board[k][c]; board[k][c] = -1; break; } } // Якщо все ще порожньо, створюємо нову ягоду if (board[r][c] === -1) { board[r][c] = Math.floor(Math.random() * emojis.length); } } } } } function updateVisualBoard() { const size = 9; for (let r = 0; r < size; r++) { for (let c = 0; c < size; c++) { const cell = document.getElementById(`cell-${r}-${c}`); if (board[r][c] === -1) { cell.innerText = ''; cell.style.backgroundColor = '#eee'; } else { cell.innerText = emojis[board[r][c]]; cell.style.backgroundColor = '#fff'; } } } } function checkWinCondition() { if (score >= 12) { navigateTo('victory-screen'); } }