| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Guaranteed Path Maze</title> |
| <style> |
| body { |
| margin: 0; |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| min-height: 100vh; |
| background: #1a1a2e; |
| font-family: Arial, sans-serif; |
| color: #fff; |
| } |
| |
| #game-container { |
| position: relative; |
| padding: 20px; |
| background: rgba(0, 0, 0, 0.8); |
| border-radius: 15px; |
| box-shadow: 0 0 30px rgba(0, 0, 0, 0.5); |
| } |
| |
| #maze-container { |
| position: relative; |
| border: 3px solid #444; |
| } |
| |
| #maze { |
| display: grid; |
| gap: 1px; |
| } |
| |
| .cell { |
| width: 40px; |
| height: 40px; |
| box-sizing: border-box; |
| border: 1px solid #333; |
| } |
| |
| .wall { |
| background: #2c3e50; |
| box-shadow: inset 0 0 10px rgba(0,0,0,0.5); |
| } |
| |
| .path { |
| background: #34495e; |
| } |
| |
| #player { |
| width: 30px; |
| height: 30px; |
| background: #2ecc71; |
| border-radius: 50%; |
| position: absolute; |
| transition: all 0.2s ease; |
| box-shadow: 0 0 15px #2ecc71; |
| z-index: 2; |
| } |
| |
| .goal { |
| background: #e74c3c !important; |
| animation: pulse 1.5s infinite; |
| } |
| |
| #hud { |
| display: flex; |
| justify-content: space-between; |
| padding: 10px; |
| background: rgba(0, 0, 0, 0.5); |
| border-radius: 10px; |
| margin-bottom: 20px; |
| } |
| |
| #timer { |
| font-size: 24px; |
| color: #e74c3c; |
| } |
| |
| #level-display { |
| font-size: 24px; |
| color: #3498db; |
| } |
| |
| .modal { |
| position: absolute; |
| top: 50%; |
| left: 50%; |
| transform: translate(-50%, -50%); |
| padding: 20px; |
| border-radius: 10px; |
| text-align: center; |
| display: none; |
| z-index: 100; |
| } |
| |
| #success-modal { |
| background: rgba(46, 204, 113, 0.9); |
| } |
| |
| #fail-modal { |
| background: rgba(231, 76, 60, 0.9); |
| } |
| |
| @keyframes pulse { |
| 0% { transform: scale(0.95); } |
| 50% { transform: scale(1.05); } |
| 100% { transform: scale(0.95); } |
| } |
| |
| button { |
| padding: 10px 20px; |
| margin: 5px; |
| border: none; |
| border-radius: 5px; |
| background: #3498db; |
| color: white; |
| cursor: pointer; |
| transition: background 0.3s; |
| } |
| |
| button:hover { |
| background: #2980b9; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="game-container"> |
| <div id="hud"> |
| <div id="level-display">Level: 1</div> |
| <div id="timer">Time: 30</div> |
| </div> |
| <div id="maze-container"> |
| <div id="maze"></div> |
| <div id="player"></div> |
| </div> |
| <div id="success-modal" class="modal"> |
| <h2>Level Complete!</h2> |
| <button onclick="nextLevel()">Next Level</button> |
| </div> |
| <div id="fail-modal" class="modal"> |
| <h2>Time's Up!</h2> |
| <button onclick="restartLevel()">Try Again</button> |
| </div> |
| <div style="text-align: center; margin-top: 10px;"> |
| <button onclick="restartLevel()">Restart Level</button> |
| </div> |
| </div> |
|
|
| <script> |
| const mazes = [ |
| |
| [ |
| [1,1,1,1,1,1,1,1,1,1], |
| [1,0,0,0,0,0,1,0,0,1], |
| [1,1,1,1,1,0,1,0,1,1], |
| [1,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,1], |
| [1,1,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,2,1], |
| [1,1,1,1,1,1,1,1,1,1] |
| ], |
| |
| [ |
| [1,1,1,1,1,1,1,1,1,1,1,1], |
| [1,0,0,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,1,1,0,1], |
| [1,0,1,0,0,0,0,0,0,0,0,1], |
| [1,0,1,0,1,1,1,1,1,1,1,1], |
| [1,0,1,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,1,0,1], |
| [1,1,1,1,1,1,1,1,0,1,0,1], |
| [1,0,0,0,0,0,0,0,0,1,0,1], |
| [1,0,1,1,1,1,1,1,1,1,2,1], |
| [1,1,1,1,1,1,1,1,1,1,1,1] |
| ], |
| |
| [ |
| [1,1,1,1,1,1,1,1,1,1,1,1,1,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,1,1,1,1,1,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,1,1,1,1,1,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,1,1,1,1,1,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,1,1,1,1,1,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,1,1,1,1,1,1,1,1,1,1,1,0,1], |
| [1,0,0,0,0,0,0,0,0,0,0,0,0,1], |
| [1,0,1,1,1,1,1,1,1,1,1,1,2,1], |
| [1,1,1,1,1,1,1,1,1,1,1,1,1,1] |
| ] |
| ]; |
| |
| let currentLevel = 0; |
| let timeLeft = 30; |
| let timerInterval; |
| let playerPos = { x: 1, y: 1 }; |
| const player = document.getElementById('player'); |
| |
| function createMaze() { |
| const maze = document.getElementById('maze'); |
| const currentMaze = mazes[currentLevel]; |
| maze.style.gridTemplateColumns = `repeat(${currentMaze[0].length}, 40px)`; |
| |
| maze.innerHTML = ''; |
| for(let y = 0; y < currentMaze.length; y++) { |
| for(let x = 0; x < currentMaze[y].length; x++) { |
| const cell = document.createElement('div'); |
| cell.className = 'cell'; |
| if(currentMaze[y][x] === 1) cell.classList.add('wall'); |
| if(currentMaze[y][x] === 0) cell.classList.add('path'); |
| if(currentMaze[y][x] === 2) cell.classList.add('goal'); |
| maze.appendChild(cell); |
| } |
| } |
| } |
| |
| function updatePlayerPosition() { |
| player.style.left = `${playerPos.x * 40 + 5}px`; |
| player.style.top = `${playerPos.y * 40 + 5}px`; |
| } |
| |
| function startTimer() { |
| clearInterval(timerInterval); |
| timeLeft = 30; |
| updateTimer(); |
| timerInterval = setInterval(() => { |
| timeLeft--; |
| updateTimer(); |
| if(timeLeft <= 0) { |
| clearInterval(timerInterval); |
| document.getElementById('fail-modal').style.display = 'block'; |
| } |
| }, 1000); |
| } |
| |
| function updateTimer() { |
| document.getElementById('timer').textContent = `Time: ${timeLeft}`; |
| } |
| |
| function handleMovement(e) { |
| if(timeLeft <= 0) return; |
| |
| const oldPos = {...playerPos}; |
| const currentMaze = mazes[currentLevel]; |
| |
| switch(e.key) { |
| case 'ArrowUp': playerPos.y--; break; |
| case 'ArrowDown': playerPos.y++; break; |
| case 'ArrowLeft': playerPos.x--; break; |
| case 'ArrowRight': playerPos.x++; break; |
| } |
| |
| if(currentMaze[playerPos.y][playerPos.x] === 1) { |
| playerPos = oldPos; |
| } |
| |
| updatePlayerPosition(); |
| checkWin(); |
| } |
| |
| function checkWin() { |
| const currentMaze = mazes[currentLevel]; |
| if(currentMaze[playerPos.y][playerPos.x] === 2) { |
| clearInterval(timerInterval); |
| document.getElementById('success-modal').style.display = 'block'; |
| } |
| } |
| |
| function nextLevel() { |
| currentLevel++; |
| if(currentLevel >= mazes.length) { |
| alert('Congratulations! You completed all levels!'); |
| currentLevel = 0; |
| } |
| document.getElementById('success-modal').style.display = 'none'; |
| document.getElementById('level-display').textContent = `Level: ${currentLevel + 1}`; |
| resetLevel(); |
| } |
| |
| function restartLevel() { |
| document.getElementById('fail-modal').style.display = 'none'; |
| resetLevel(); |
| } |
| |
| function resetLevel() { |
| playerPos = { x: 1, y: 1 }; |
| createMaze(); |
| updatePlayerPosition(); |
| startTimer(); |
| } |
| |
| document.addEventListener('keydown', handleMovement); |
| createMaze(); |
| updatePlayerPosition(); |
| startTimer(); |
| </script> |
| </body> |
| </html><script async data-explicit-opt-in="true" data-cookie-opt-in="true" src="https://vercel.live/_next-live/feedback/feedback.js"></script> |