Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>๊ณ ๊ธ ์ง๋ขฐ์ฐพ๊ธฐ</title> | |
| <style> | |
| :root { | |
| --cell-size: 35px; | |
| --border-color: #7B7B7B; | |
| --cell-bg: #C0C0C0; | |
| --revealed-bg: #E0E0E0; | |
| } | |
| body { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| background: #f0f0f0; | |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | |
| margin: 0; | |
| padding: 20px; | |
| } | |
| /* ์๋จ ๋ฉ์์ง ์คํ์ผ */ | |
| .message-container { | |
| width: 100%; | |
| background: #333; | |
| color: white; | |
| padding: 20px 0; | |
| margin-bottom: 30px; | |
| text-align: center; | |
| box-shadow: 0 2px 5px rgba(0,0,0,0.2); | |
| } | |
| .message-title { | |
| font-size: 24px; | |
| margin-bottom: 10px; | |
| } | |
| .message-subtitle { | |
| font-size: 16px; | |
| margin-bottom: 10px; | |
| color: #ddd; | |
| } | |
| .message-link { | |
| font-size: 14px; | |
| color: #66ccff; | |
| text-decoration: none; | |
| } | |
| .message-link:hover { | |
| text-decoration: underline; | |
| } | |
| /* ๊ฒ์ ์ปจํ ์ด๋ ์คํ์ผ */ | |
| .game-container { | |
| background: var(--cell-bg); | |
| padding: 15px; | |
| border-radius: 8px; | |
| box-shadow: 3px 3px 10px rgba(0,0,0,0.2); | |
| } | |
| .header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| background: var(--cell-bg); | |
| padding: 10px; | |
| margin-bottom: 15px; | |
| border: 3px solid var(--border-color); | |
| } | |
| .display { | |
| background: black; | |
| color: red; | |
| padding: 5px 10px; | |
| font-family: "Digital-7", monospace; | |
| font-size: 24px; | |
| min-width: 70px; | |
| text-align: center; | |
| } | |
| .controls { | |
| margin-bottom: 15px; | |
| } | |
| select { | |
| padding: 5px; | |
| margin-right: 10px; | |
| } | |
| .game-board { | |
| display: grid; | |
| gap: 1px; | |
| background: var(--border-color); | |
| border: 3px solid var(--border-color); | |
| } | |
| .cell { | |
| width: var(--cell-size); | |
| height: var(--cell-size); | |
| background: var(--cell-bg); | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| font-weight: bold; | |
| font-size: 18px; | |
| cursor: pointer; | |
| user-select: none; | |
| transition: background-color 0.2s; | |
| border: 2px solid; | |
| border-color: #fff #7B7B7B #7B7B7B #fff; | |
| } | |
| .cell:hover:not(.revealed) { | |
| background: #d0d0d0; | |
| } | |
| .revealed { | |
| background: var(--revealed-bg); | |
| border: 1px solid #999; | |
| } | |
| .mine { | |
| background: #ff4444 ; | |
| } | |
| .flagged { | |
| background: var(--cell-bg); | |
| } | |
| button { | |
| padding: 8px 16px; | |
| font-size: 14px; | |
| cursor: pointer; | |
| background: var(--cell-bg); | |
| border: 2px solid; | |
| border-color: #fff #7B7B7B #7B7B7B #fff; | |
| } | |
| button:hover { | |
| background: #d0d0d0; | |
| } | |
| .color-1 { color: blue; } | |
| .color-2 { color: green; } | |
| .color-3 { color: red; } | |
| .color-4 { color: darkblue; } | |
| .color-5 { color: darkred; } | |
| .color-6 { color: teal; } | |
| .color-7 { color: black; } | |
| .color-8 { color: gray; } | |
| .smiley { | |
| font-size: 24px; | |
| cursor: pointer; | |
| user-select: none; | |
| padding: 5px 15px; | |
| background: var(--cell-bg); | |
| border: 2px solid; | |
| border-color: #fff #7B7B7B #7B7B7B #fff; | |
| } | |
| .smiley:hover { | |
| background: #d0d0d0; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- ์๋จ ๋ฉ์์ง --> | |
| <div class="message-container"> | |
| <div class="message-title">MOUSE Autonomous "Minesweeper Game"</div> | |
| <div class="message-subtitle">"One-minute creation by AI Coding Autonomous Agent MOUSE"</div> | |
| <a href="https://VIDraft-mouse1.hf.space" class="message-link">https://VIDraft-mouse1.hf.space</a> | |
| </div> | |
| <!-- ๊ฒ์ ์ปจํ ์ด๋ --> | |
| <div class="game-container"> | |
| <div class="controls"> | |
| <select id="difficulty"> | |
| <option value="beginner">์ด๊ธ (9x9, 10์ง๋ขฐ)</option> | |
| <option value="intermediate">์ค๊ธ (16x16, 40์ง๋ขฐ)</option> | |
| <option value="expert">๊ณ ๊ธ (16x30, 99์ง๋ขฐ)</option> | |
| </select> | |
| </div> | |
| <div class="header"> | |
| <div class="display" id="mine-count">010</div> | |
| <div class="smiley" id="smiley">๐</div> | |
| <div class="display" id="timer">000</div> | |
| </div> | |
| <div class="game-board" id="board" oncontextmenu="return false"></div> | |
| </div> | |
| <script> | |
| // ์ด์ JavaScript ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ ์ง | |
| const difficulties = { | |
| beginner: { width: 9, height: 9, mines: 10 }, | |
| intermediate: { width: 16, height: 16, mines: 40 }, | |
| expert: { width: 30, height: 16, mines: 99 } | |
| }; | |
| let board = []; | |
| let revealed = []; | |
| let flagged = []; | |
| let gameOver = false; | |
| let minesRemaining; | |
| let timeElapsed = 0; | |
| let timerInterval; | |
| let firstClick = true; | |
| let currentDifficulty = difficulties.beginner; | |
| // ... (์ด์ ์ ๋ชจ๋ JavaScript ํจ์๋ค์ ๊ทธ๋๋ก ์ ์ง) | |
| document.getElementById('difficulty').addEventListener('change', (e) => { | |
| currentDifficulty = difficulties[e.target.value]; | |
| initGame(); | |
| }); | |
| document.getElementById('smiley').addEventListener('click', initGame); | |
| function formatDisplay(num) { | |
| return String(num).padStart(3, '0'); | |
| } | |
| function updateTimer() { | |
| timeElapsed++; | |
| document.getElementById('timer').textContent = formatDisplay(Math.min(timeElapsed, 999)); | |
| } | |
| function initGame() { | |
| clearInterval(timerInterval); | |
| timeElapsed = 0; | |
| document.getElementById('timer').textContent = '000'; | |
| document.getElementById('smiley').textContent = '๐'; | |
| board = []; | |
| revealed = []; | |
| flagged = []; | |
| gameOver = false; | |
| firstClick = true; | |
| minesRemaining = currentDifficulty.mines; | |
| document.getElementById('mine-count').textContent = formatDisplay(minesRemaining); | |
| for(let i = 0; i < currentDifficulty.height; i++) { | |
| board[i] = []; | |
| revealed[i] = []; | |
| flagged[i] = []; | |
| for(let j = 0; j < currentDifficulty.width; j++) { | |
| board[i][j] = 0; | |
| revealed[i][j] = false; | |
| flagged[i][j] = false; | |
| } | |
| } | |
| const boardElement = document.getElementById('board'); | |
| boardElement.style.gridTemplateColumns = `repeat(${currentDifficulty.width}, var(--cell-size))`; | |
| renderBoard(); | |
| } | |
| function placeMines(firstRow, firstCol) { | |
| let minesPlaced = 0; | |
| while(minesPlaced < currentDifficulty.mines) { | |
| const x = Math.floor(Math.random() * currentDifficulty.height); | |
| const y = Math.floor(Math.random() * currentDifficulty.width); | |
| if(board[x][y] !== -1 && !(Math.abs(x - firstRow) <= 1 && Math.abs(y - firstCol) <= 1)) { | |
| board[x][y] = -1; | |
| minesPlaced++; | |
| } | |
| } | |
| for(let i = 0; i < currentDifficulty.height; i++) { | |
| for(let j = 0; j < currentDifficulty.width; j++) { | |
| if(board[i][j] !== -1) { | |
| let count = 0; | |
| for(let dx = -1; dx <= 1; dx++) { | |
| for(let dy = -1; dy <= 1; dy++) { | |
| const nx = i + dx; | |
| const ny = j + dy; | |
| if(nx >= 0 && nx < currentDifficulty.height && ny >= 0 && ny < currentDifficulty.width) { | |
| if(board[nx][ny] === -1) count++; | |
| } | |
| } | |
| } | |
| board[i][j] = count; | |
| } | |
| } | |
| } | |
| } | |
| function renderBoard() { | |
| const boardElement = document.getElementById('board'); | |
| boardElement.innerHTML = ''; | |
| for(let i = 0; i < currentDifficulty.height; i++) { | |
| for(let j = 0; j < currentDifficulty.width; j++) { | |
| const cell = document.createElement('div'); | |
| cell.className = 'cell'; | |
| cell.dataset.row = i; | |
| cell.dataset.col = j; | |
| if(revealed[i][j]) { | |
| cell.classList.add('revealed'); | |
| if(board[i][j] === -1) { | |
| cell.classList.add('mine'); | |
| cell.textContent = '๐ฃ'; | |
| } else if(board[i][j] > 0) { | |
| cell.textContent = board[i][j]; | |
| cell.classList.add(`color-${board[i][j]}`); | |
| } | |
| } else if(flagged[i][j]) { | |
| cell.classList.add('flagged'); | |
| cell.textContent = '๐ฉ'; | |
| } | |
| cell.addEventListener('mousedown', () => { | |
| if(!gameOver && !revealed[i][j]) { | |
| document.getElementById('smiley').textContent = '๐ฎ'; | |
| } | |
| }); | |
| cell.addEventListener('mouseup', () => { | |
| if(!gameOver) { | |
| document.getElementById('smiley').textContent = '๐'; | |
| } | |
| }); | |
| cell.addEventListener('mouseleave', () => { | |
| if(!gameOver) { | |
| document.getElementById('smiley').textContent = '๐'; | |
| } | |
| }); | |
| cell.addEventListener('click', handleClick); | |
| cell.addEventListener('contextmenu', handleRightClick); | |
| boardElement.appendChild(cell); | |
| } | |
| } | |
| } | |
| function handleClick(e) { | |
| if(gameOver) return; | |
| const row = parseInt(e.target.dataset.row); | |
| const col = parseInt(e.target.dataset.col); | |
| if(flagged[row][col]) return; | |
| if(firstClick) { | |
| firstClick = false; | |
| placeMines(row, col); | |
| timerInterval = setInterval(updateTimer, 1000); | |
| } | |
| if(board[row][col] === -1) { | |
| gameOver = true; | |
| clearInterval(timerInterval); | |
| document.getElementById('smiley').textContent = '๐ต'; | |
| revealAll(); | |
| return; | |
| } | |
| revealCell(row, col); | |
| renderBoard(); | |
| if(checkWin()) { | |
| gameOver = true; | |
| clearInterval(timerInterval); | |
| document.getElementById('smiley').textContent = '๐'; | |
| } | |
| } | |
| function handleRightClick(e) { | |
| e.preventDefault(); | |
| if(gameOver || firstClick) return; | |
| const row = parseInt(e.target.dataset.row); | |
| const col = parseInt(e.target.dataset.col); | |
| if(revealed[row][col]) return; | |
| flagged[row][col] = !flagged[row][col]; | |
| minesRemaining += flagged[row][col] ? -1 : 1; | |
| document.getElementById('mine-count').textContent = formatDisplay(minesRemaining); | |
| renderBoard(); | |
| } | |
| function revealCell(row, col) { | |
| if(row < 0 || row >= currentDifficulty.height || col < 0 || col >= currentDifficulty.width) return; | |
| if(revealed[row][col] || flagged[row][col]) return; | |
| revealed[row][col] = true; | |
| if(board[row][col] === 0) { | |
| for(let dx = -1; dx <= 1; dx++) { | |
| for(let dy = -1; dy <= 1; dy++) { | |
| revealCell(row + dx, col + dy); | |
| } | |
| } | |
| } | |
| } | |
| function revealAll() { | |
| for(let i = 0; i < currentDifficulty.height; i++) { | |
| for(let j = 0; j < currentDifficulty.width; j++) { | |
| revealed[i][j] = true; | |
| } | |
| } | |
| renderBoard(); | |
| } | |
| function checkWin() { | |
| for(let i = 0; i < currentDifficulty.height; i++) { | |
| for(let j = 0; j < currentDifficulty.width; j++) { | |
| if(board[i][j] !== -1 && !revealed[i][j]) return false; | |
| } | |
| } | |
| return true; | |
| } | |
| initGame(); | |
| </script> | |
| </body> | |
| </html> |