/
bukin
/
Test
Обзор
Документация
Войти
/
bukin
/
Test
Код
Запросы
0
Задачи 2.0
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
index.html
292 строки
8 KB
AI Task Bot
feat(index): реализована игра крестики-нолики
14 июл 2026, 10:52
14 июл 2026, 10:52
2cc2fb4
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Крестики-нолики</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .container { background: white; border-radius: 20px; padding: 40px; text-align: center; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); max-width: 500px; width: 100%; } h1 { font-size: 2.5em; color: #667eea; margin-bottom: 30px; font-weight: 700; } .status { font-size: 1.3em; color: #555; margin-bottom: 25px; min-height: 30px; } .status .current-player { font-weight: 700; color: #667eea; } .board { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 0 auto 30px; max-width: 320px; } .cell { background: #f5f5f5; border: 3px solid #e0e0e0; border-radius: 12px; width: 90px; height: 90px; font-size: 3em; font-weight: 700; display: flex; justify-content: center; align-items: center; cursor: pointer; transition: all 0.2s ease; color: #333; } .cell:hover { background: #e8e8e8; border-color: #667eea; transform: scale(1.05); } .cell.x { color: #667eea; } .cell.o { color: #764ba2; } .cell.winning { background: #d4edda; border-color: #28a745; } .controls { display: flex; flex-direction: column; align-items: center; gap: 15px; } .reset-btn { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; padding: 12px 30px; font-size: 1.1em; border-radius: 8px; cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease; font-weight: 600; } .reset-btn:hover { transform: translateY(-2px); box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4); } .reset-btn:active { transform: translateY(0); } .winner-message { font-size: 1.4em; font-weight: 700; padding: 15px; border-radius: 8px; animation: fadeIn 0.3s ease; } .winner-message.x-wins { background: #d1ecf1; color: #0c5460; } .winner-message.o-wins { background: #d4edda; color: #155724; } .winner-message.draw { background: #fff3cd; color: #856404; } @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 400px) { .cell { width: 70px; height: 70px; font-size: 2.2em; } .container { padding: 25px; } h1 { font-size: 2em; } } </style> </head> <body> <div class="container"> <h1>Крестики-нолики</h1> <div class="status" id="status">Ход игрока: <span class="current-player">X</span></div> <div class="board" id="board"> <div class="cell" data-index="0"></div> <div class="cell" data-index="1"></div> <div class="cell" data-index="2"></div> <div class="cell" data-index="3"></div> <div class="cell" data-index="4"></div> <div class="cell" data-index="5"></div> <div class="cell" data-index="6"></div> <div class="cell" data-index="7"></div> <div class="cell" data-index="8"></div> </div> <div class="controls"> <div id="winnerMessage" class="winner-message" style="display: none;"></div> <button class="reset-btn" id="resetBtn">Начать заново</button> </div> </div> <script> const board = document.getElementById('board'); const cells = document.querySelectorAll('.cell'); const statusText = document.getElementById('status'); const winnerMessage = document.getElementById('winnerMessage'); const resetBtn = document.getElementById('resetBtn'); let currentPlayer = 'X'; let gameState = ['', '', '', '', '', '', '', '', '']; let gameActive = true; const winningConditions = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ]; function handleCellClick(event) { const cell = event.target; const index = cell.dataset.index; if (gameState[index] !== '' || !gameActive) { return; } gameState[index] = currentPlayer; cell.textContent = currentPlayer; cell.classList.add(currentPlayer.toLowerCase()); checkResult(); } function checkResult() { let roundWon = false; let winningLine = []; for (let i = 0; i < winningConditions.length; i++) { const [a, b, c] = winningConditions[i]; const valueA = gameState[a]; const valueB = gameState[b]; const valueC = gameState[c]; if (valueA === '' || valueB === '' || valueC === '') { continue; } if (valueA === valueB && valueB === valueC) { roundWon = true; winningLine = [a, b, c]; break; } } if (roundWon) { statusText.innerHTML = `Победил игрок: <span class="current-player">${currentPlayer}</span>!`; winnerMessage.textContent = `Победил игрок ${currentPlayer}! 🎉`; winnerMessage.className = `winner-message ${currentPlayer.toLowerCase()}-wins`; winnerMessage.style.display = 'block'; gameActive = false; winningLine.forEach(index => { cells[index].classList.add('winning'); }); return; } if (!gameState.includes('')) { statusText.textContent = 'Ничья!'; winnerMessage.textContent = 'Ничья! 🤝'; winnerMessage.className = 'winner-message draw'; winnerMessage.style.display = 'block'; gameActive = false; return; } currentPlayer = currentPlayer === 'X' ? 'O' : 'X'; statusText.innerHTML = `Ход игрока: <span class="current-player">${currentPlayer}</span>`; } function resetGame() { currentPlayer = 'X'; gameState = ['', '', '', '', '', '', '', '', '']; gameActive = true; statusText.innerHTML = `Ход игрока: <span class="current-player">X</span>`; winnerMessage.style.display = 'none'; winnerMessage.className = 'winner-message'; cells.forEach(cell => { cell.textContent = ''; cell.classList.remove('x', 'o', 'winning'); }); } cells.forEach(cell => cell.addEventListener('click', handleCellClick)); resetBtn.addEventListener('click', resetGame); </script> </body> </html>