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