一、游戏截图
二、源码
<! DOCTYPE html >
< html lang = " zh-CN" >
< head> < meta charset = " UTF-8" > < meta name = " viewport" content = " width=device-width, initial-scale=1.0" > < title> 离谱贪吃蛇</ title> < style> body { margin : 0; padding : 20px; font-family : 'Arial' , sans-serif; background : linear-gradient ( 135deg, #667eea 0%, #764ba2 100%) ; min-height : 100vh; display : flex; align-items : center; justify-content : center; } .game-container { background : rgba ( 255, 255, 255, 0.1) ; backdrop-filter : blur ( 10px) ; border-radius : 20px; padding : 25px; box-shadow : 0 8px 32px rgba ( 0, 0, 0, 0.3) ; border : 1px solid rgba ( 255, 255, 255, 0.2) ; text-align : center; max-width : 900px; width : 100%; } .game-title { color : white; font-size : 2.8em; margin-bottom : 15px; text-shadow : 2px 2px 4px rgba ( 0, 0, 0, 0.5) ; background : linear-gradient ( 45deg, #ff6b6b, #4ecdc4, #45b7d1) ; -webkit-background-clip : text; -webkit-text-fill-color : transparent; background-clip : text; } .game-header { display : flex; justify-content : space-between; align-items : center; margin-bottom : 20px; flex-wrap : wrap; gap : 15px; } .game-info { display : flex; gap : 20px; background : rgba ( 0, 0, 0, 0.2) ; padding : 12px 20px; border-radius : 15px; color : white; font-weight : bold; font-size : 1.1em; } .info-item { display : flex; align-items : center; gap : 5px; } .grid-container { display : flex; justify-content : center; margin : 20px 0; } .grid { display : grid; grid-template-columns : repeat ( 20, 25px) ; grid-template-rows : repeat ( 15, 25px) ; gap : 1px; background-color : rgba ( 0, 0, 0, 0.3) ; border-radius : 10px; padding : 15px; box-shadow : 0 4px 15px rgba ( 0, 0, 0, 0.2) ; } .cell { width : 25px; height : 25px; display : flex; align-items : center; justify-content : center; font-size : 14px; border-radius : 4px; background-color : rgba ( 0, 0, 0, 0.2) ; transition : all 0.1s ease; } .snake-head { background : linear-gradient ( 135deg, #4ade80, #22c55e) ; color : white; font-weight : bold; box-shadow : 0 0 10px rgba ( 74, 222, 128, 0.5) ; } .snake-body { background : linear-gradient ( 135deg, #22c55e, #16a34a) ; color : white; } .food { background : linear-gradient ( 135deg, #ef4444, #dc2626) ; color : white; animation : pulse 1s infinite; } .power-up { background : linear-gradient ( 135deg, #f59e0b, #d97706) ; color : white; animation : spin 2s infinite linear; } .special-food { background : linear-gradient ( 135deg, #fbbf24, #f59e0b) ; color : white; animation : bounce 1s infinite; } @keyframes pulse { 0%, 100% { transform : scale ( 1) ; } 50% { transform : scale ( 1.1) ; } } @keyframes spin { from { transform : rotate ( 0deg) ; } to { transform : rotate ( 360deg) ; } } @keyframes bounce { 0%, 100% { transform : translateY ( 0) ; } 50% { transform : translateY ( -5px) ; } } .controls { margin : 25px 0; display : flex; justify-content : center; gap : 15px; flex-wrap : wrap; } button { padding : 12px 25px; border : none; border-radius : 25px; background : rgba ( 255, 255, 255, 0.2) ; color : white; font-weight : bold; cursor : pointer; transition : all 0.3s; backdrop-filter : blur ( 5px) ; box-shadow : 0 4px 10px rgba ( 0, 0, 0, 0.2) ; font-size : 1em; } button:hover { background : rgba ( 255, 255, 255, 0.3) ; transform : translateY ( -2px) ; } .instructions { color : white; margin : 20px 0; font-size : 0.95em; line-height : 1.6; background : rgba ( 0, 0, 0, 0.2) ; padding : 20px; border-radius : 15px; } .rules-section { margin : 15px 0; } .rules-section h3 { margin-top : 0; margin-bottom : 10px; color : #4ecdc4; } .power-ups-list, .special-foods-list { display : flex; justify-content : center; gap : 15px; margin : 10px 0; flex-wrap : wrap; } .item { display : flex; align-items : center; gap : 5px; background : rgba ( 255, 255, 255, 0.1) ; padding : 8px 15px; border-radius : 20px; font-size : 0.85em; } .game-over { position : absolute; top : 50%; left : 50%; transform : translate ( -50%, -50%) ; background : rgba ( 0, 0, 0, 0.9) ; color : white; padding : 40px; border-radius : 20px; text-align : center; z-index : 1000; box-shadow : 0 10px 30px rgba ( 0, 0, 0, 0.5) ; max-width : 400px; width : 90%; } .pause-screen { position : absolute; top : 50%; left : 50%; transform : translate ( -50%, -50%) ; background : rgba ( 0, 0, 0, 0.8) ; color : white; padding : 40px; border-radius : 20px; text-align : center; z-index : 1000; } .combo-display { background : rgba ( 255, 215, 0, 0.3) ; color : gold; padding : 8px 15px; border-radius : 20px; font-weight : bold; margin : 5px 0; animation : glow 0.5s infinite alternate; } @keyframes glow { from { box-shadow : 0 0 5px gold; } to { box-shadow : 0 0 20px gold; } } .active-power { animation : pulse 0.5s infinite; } @media ( max-width : 768px) { .game-container { padding : 15px; } .game-title { font-size : 2em; } .game-info { flex-direction : column; gap : 10px; } .grid { grid-template-columns : repeat ( 20, 20px) ; grid-template-rows : repeat ( 15, 20px) ; padding : 10px; } .cell { width : 20px; height : 20px; font-size : 12px; } .controls { flex-direction : column; align-items : center; } button { width : 100%; max-width : 200px; } } </ style>
</ head>
< body> < div class = " game-container" > < h1 class = " game-title" > 🎮 离谱贪吃蛇 🎮</ h1> < div class = " game-header" > < div class = " game-info" > < div class = " info-item" > < span> 🏆</ span> < span> 分数: < span id = " score" > 0</ span> </ span> </ div> < div class = " info-item" > < span> ❤️</ span> < span> 生命: < span id = " lives" > 3</ span> </ span> </ div> < div class = " info-item" > < span> ⚡</ span> < span> 等级: < span id = " level" > 1</ span> </ span> </ div> < div class = " info-item" > < span> 🔥</ span> < span> 连击: < span id = " combo" class = " combo-display" > 0</ span> </ span> </ div> </ div> </ div> < div class = " grid-container" > < div id = " game-grid" class = " grid" > </ div> </ div> < div class = " controls" > < button id = " start-btn" > ▶️ 开始游戏</ button> < button id = " pause-btn" > ⏸️ 暂停</ button> < button id = " reset-btn" > 🔄 重置游戏</ button> </ div> < div class = " instructions" > < div class = " rules-section" > < h3> 🎮 游戏规则:</ h3> < p> 🎯 目标:吃到食物获得分数,避开自身碰撞</ p> < p> ⚡ 特殊道具:⚡❄️🌱🔻🌀✨ - 每个都有独特效果</ p> < p> 🌟 特殊食物:⭐❤️💎☁️ - 获得额外奖励</ p> < p> 💥 连击系统:连续吃到5个食物获得额外50分奖励!</ p> </ div> < div class = " rules-section" > < h3> ⚡ 道具效果:</ h3> < div class = " power-ups-list" > < div class = " item" > ⚡ 速度加速 (5秒) - 快速移动</ div> < div class = " item" > ❄️ 减速道具 - 慢速移动</ div> < div class = " item" > 🌱 增长道具 - 蛇身增长</ div> < div class = " item" > 🔻 缩小道具 - 蛇身缩短</ div> < div class = " item" > 🌀 传送道具 - 随机传送</ div> < div class = " item" > ✨ 无敌道具 - 5秒无敌</ div> </ div> </ div> < div class = " rules-section" > < h3> 🌟 特殊食物效果:</ h3> < div class = " special-foods-list" > < div class = " item" > ⭐ 超级星星 (+50分) - 大量分数</ div> < div class = " item" > ❤️ 爱心生命 (+1生命) - 生命恢复</ div> < div class = " item" > 💎 钻石宝石 (+50分) - 高分奖励</ div> < div class = " item" > ☁️ 云朵祝福 (+50分) - 额外分数</ div> </ div> </ div> < div class = " rules-section" > < h3> 🎮 操作说明:</ h3> < p> 🎮 方向键控制方向 | ⚡ 空格键暂停 | 🔄 R键重置</ p> </ div> </ div> </ div> < script> let snake = [ { x : 10 , y : 10 } ] ; let direction = { x : 0 , y : - 1 } ; let food = { x : 15 , y : 15 } ; let powerUps = [ ] ; let specialFoods = [ ] ; let gameRunning = false ; let gameOver = false ; let score = 0 ; let level = 1 ; let lives = 3 ; let activePowerUps = [ ] ; let gameSpeed = 150 ; let gameLoop; let combo = 0 ; let isPaused = false ; let invincible = false ; const gameGrid = document. getElementById ( 'game-grid' ) ; const scoreElement = document. getElementById ( 'score' ) ; const livesElement = document. getElementById ( 'lives' ) ; const levelElement = document. getElementById ( 'level' ) ; const comboElement = document. getElementById ( 'combo' ) ; const startBtn = document. getElementById ( 'start-btn' ) ; const pauseBtn = document. getElementById ( 'pause-btn' ) ; const resetBtn = document. getElementById ( 'reset-btn' ) ; function generateRandomPosition ( ) { return { x : Math. floor ( Math. random ( ) * 20 ) , y : Math. floor ( Math. random ( ) * 15 ) } ; } function checkCollision ( head, snakeBody ) { if ( invincible) return false ; return snakeBody. slice ( 1 ) . some ( segment => segment. x === head. x && segment. y === head. y) ; } function generateFood ( ) { let newFood; let valid = false ; while ( ! valid) { newFood = generateRandomPosition ( ) ; valid = ! snake. some ( segment => segment. x === newFood. x && segment. y === newFood. y) && ! powerUps. some ( power => power. x === newFood. x && power. y === newFood. y) && ! specialFoods. some ( food => food. x === newFood. x && food. y === newFood. y) ; } return newFood; } function generatePowerUp ( ) { const types = [ 'speed' , 'slow' , 'grow' , 'shrink' , 'teleport' , 'invincible' ] ; const type = types[ Math. floor ( Math. random ( ) * types. length) ] ; return { ... generateRandomPosition ( ) , type : type, id : Date. now ( ) + Math. random ( ) } ; } function generateSpecialFood ( ) { const types = [ 'star' , 'heart' , 'diamond' , 'cloud' ] ; const type = types[ Math. floor ( Math. random ( ) * types. length) ] ; return { ... generateRandomPosition ( ) , type : type, id : Date. now ( ) + Math. random ( ) } ; } function renderGrid ( ) { gameGrid. innerHTML = '' ; for ( let y = 0 ; y < 15 ; y++ ) { for ( let x = 0 ; x < 20 ; x++ ) { const cell = document. createElement ( 'div' ) ; cell. className = 'cell' ; const isSnakeHead = snake[ 0 ] . x === x && snake[ 0 ] . y === y; const isSnakeBody = snake. slice ( 1 ) . some ( segment => segment. x === x && segment. y === y) ; const isFood = food. x === x && food. y === y; const isPowerUp = powerUps. some ( power => power. x === x && power. y === y) ; const isSpecialFood = specialFoods. some ( food => food. x === x && food. y === y) ; if ( isSnakeHead) { cell. classList. add ( 'snake-head' ) ; cell. textContent = '🐍' ; } else if ( isSnakeBody) { cell. classList. add ( 'snake-body' ) ; cell. textContent = '🟢' ; } else if ( isFood) { cell. classList. add ( 'food' ) ; cell. textContent = '🍎' ; } else if ( isPowerUp) { cell. classList. add ( 'power-up' ) ; const icons = { 'speed' : '⚡' , 'slow' : '❄️' , 'grow' : '🌱' , 'shrink' : '🔻' , 'teleport' : '🌀' , 'invincible' : '✨' } ; cell. textContent = icons[ powerUps. find ( p => p. x === x && p. y === y) . type] ; } else if ( isSpecialFood) { cell. classList. add ( 'special-food' ) ; const icons = { 'star' : '⭐' , 'heart' : '❤️' , 'diamond' : '💎' , 'cloud' : '☁️' } ; cell. textContent = icons[ specialFoods. find ( f => f. x === x && f. y === y) . type] ; } gameGrid. appendChild ( cell) ; } } } function updateGame ( ) { if ( ! gameRunning || gameOver || isPaused) return ; const newSnake = [ ... snake] ; const head = { ... newSnake[ 0 ] } ; head. x += direction. x; head. y += direction. y; if ( head. x < 0 ) head. x = 19 ; if ( head. x > 19 ) head. x = 0 ; if ( head. y < 0 ) head. y = 14 ; if ( head. y > 14 ) head. y = 0 ; if ( checkCollision ( head, newSnake) ) { lives-- ; livesElement. textContent = lives; if ( lives <= 0 ) { gameOver = true ; gameRunning = false ; showGameOver ( ) ; return ; } snake = [ { x : 10 , y : 10 } ] ; direction = { x : 0 , y : - 1 } ; invincible = false ; return ; } newSnake. unshift ( head) ; if ( head. x === food. x && head. y === food. y) { score += 10 ; combo++ ; comboElement. textContent = combo; scoreElement. textContent = score; if ( combo >= 5 ) { score += 50 ; scoreElement. textContent = score; combo = 0 ; comboElement. textContent = combo; comboElement. style. animation = 'glow 0.5s infinite alternate' ; setTimeout ( ( ) => comboElement. style. animation = '' , 2000 ) ; } food = generateFood ( ) ; } else { newSnake. pop ( ) ; } powerUps = powerUps. filter ( power => { if ( power. x === head. x && power. y === head. y) { switch ( power. type) { case 'speed' : gameSpeed = 100 ; setTimeout ( ( ) => gameSpeed = 150 , 5000 ) ; break ; case 'grow' : newSnake. push ( ... Array ( 2 ) . fill ( ) . map ( ( ) => ( { ... newSnake[ newSnake. length - 1 ] } ) ) ) ; break ; case 'shrink' : if ( newSnake. length > 3 ) { newSnake. splice ( - 2 , 2 ) ; } break ; case 'teleport' : const teleportPos = generateRandomPosition ( ) ; head. x = teleportPos. x; head. y = teleportPos. y; break ; case 'invincible' : invincible = true ; setTimeout ( ( ) => invincible = false , 3000 ) ; break ; } return false ; } return true ; } ) ; specialFoods = specialFoods. filter ( foodItem => { if ( foodItem. x === head. x && foodItem. y === head. y) { switch ( foodItem. type) { case 'star' : score += 50 ; scoreElement. textContent = score; break ; case 'heart' : lives++ ; livesElement. textContent = lives; break ; case 'diamond' : score += 50 ; scoreElement. textContent = score; break ; case 'cloud' : score += 50 ; scoreElement. textContent = score; break ; } return false ; } return true ; } ) ; snake = newSnake; if ( Math. random ( ) < 0.02 ) { powerUps. push ( generatePowerUp ( ) ) ; } if ( Math. random ( ) < 0.01 ) { specialFoods. push ( generateSpecialFood ( ) ) ; } renderGrid ( ) ; } function showGameOver ( ) { const gameOverDiv = document. createElement ( 'div' ) ; gameOverDiv. className = 'game-over' ; gameOverDiv. innerHTML = ` <h2>🎮 游戏结束! 🎮</h2><p>最终得分: ${ score} </p><p>最高连击: ${ Math. max ( combo, 5 ) } </p><button onclick="this.parentElement.remove(); resetGame()" style="margin-top: 15px; padding: 12px 25px; background: #ff6b6b; border: none; border-radius: 25px; color: white; font-weight: bold; cursor: pointer;">再玩一次!</button> ` ; document. body. appendChild ( gameOverDiv) ; } function showPauseScreen ( ) { const pauseDiv = document. createElement ( 'div' ) ; pauseDiv. className = 'pause-screen' ; pauseDiv. innerHTML = ` <h2>⏸️ 暂停中 ⏸️</h2><p>按空格键继续游戏</p> ` ; document. body. appendChild ( pauseDiv) ; return pauseDiv; } function startGame ( ) { if ( gameRunning) return ; gameRunning = true ; gameOver = false ; isPaused = false ; score = 0 ; lives = 3 ; level = 1 ; combo = 0 ; snake = [ { x : 10 , y : 10 } ] ; direction = { x : 0 , y : - 1 } ; food = generateFood ( ) ; powerUps = [ ] ; specialFoods = [ ] ; gameSpeed = 150 ; invincible = false ; scoreElement. textContent = score; livesElement. textContent = lives; levelElement. textContent = level; comboElement. textContent = combo; renderGrid ( ) ; if ( gameLoop) clearInterval ( gameLoop) ; gameLoop = setInterval ( updateGame, gameSpeed) ; } function togglePause ( ) { if ( ! gameRunning || gameOver) return ; isPaused = ! isPaused; pauseBtn. textContent = isPaused ? '▶️ 继续' : '⏸️ 暂停' ; if ( isPaused) { showPauseScreen ( ) ; } else { const pauseDiv = document. querySelector ( '.pause-screen' ) ; if ( pauseDiv) pauseDiv. remove ( ) ; } } function resetGame ( ) { if ( gameLoop) clearInterval ( gameLoop) ; gameRunning = false ; gameOver = false ; isPaused = false ; const pauseDiv = document. querySelector ( '.pause-screen' ) ; if ( pauseDiv) pauseDiv. remove ( ) ; startGame ( ) ; } document. addEventListener ( 'keydown' , ( e ) => { if ( ! gameRunning || gameOver) return ; switch ( e. key) { case 'ArrowUp' : if ( direction. y === 0 ) direction = { x : 0 , y : - 1 } ; break ; case 'ArrowDown' : if ( direction. y === 0 ) direction = { x : 0 , y : 1 } ; break ; case 'ArrowLeft' : if ( direction. x === 0 ) direction = { x : - 1 , y : 0 } ; break ; case 'ArrowRight' : if ( direction. x === 0 ) direction = { x : 1 , y : 0 } ; break ; case ' ' : togglePause ( ) ; break ; } } ) ; startBtn. addEventListener ( 'click' , startGame) ; pauseBtn. addEventListener ( 'click' , togglePause) ; resetBtn. addEventListener ( 'click' , resetGame) ; renderGrid ( ) ; </ script>
</ body>
</ html>