贪吃蛇游戏:增加暂停按钮,每次增加10分蛇会变化

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>贪吃蛇游戏</title>
</head>
<style>
    body {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        height: 100vh;
        background: #0b1b2c;
        color: antiquewhite;
        margin: 0;
    }
    #score {
        font-size: 24px;
        color: #319403;
    }
    #gameCanvas {
        border: 1px solid rgb(165, 165, 165);
    }
</style>
<body>
    <div id="score">得分: 0</div>
    <p>(方向键开始游戏,方向键左、上、右、下控制,碰壁不会结束。每次增加10分蛇会变化)</p>
    <button id="pauseButton">暂停</button>
    <canvas id="gameCanvas" width="600" height="600"></canvas>
</body>
<script>
    const canvas = document.getElementById('gameCanvas');
    const ctx = canvas.getContext('2d');
    const box = 20;
    let snake = [{ x: 10 * box, y: 10 * box }];
    let food = {
        x: Math.floor(Math.random() * 20) * box,
        y: Math.floor(Math.random() * 20) * box
    };
    let d;
    let score = 0; // 初始化得分
    const scoreElement = document.getElementById('score'); // 获取得分显示元素
    document.addEventListener('keydown', direction);
    function direction(event) {
        const keyMap = {
            37: 'LEFT',
            38: 'UP',
            39: 'RIGHT',
            40: 'DOWN'
        };
        const newDirection = keyMap[event.keyCode];
        if (newDirection && newDirection !== oppositeDirection(d)) {
            d = newDirection;
        }
    }
    function oppositeDirection(dir) {
        return {
            'LEFT': 'RIGHT',
            'UP': 'DOWN',
            'RIGHT': 'LEFT',
            'DOWN': 'UP'
        }[dir];
    }
    let game = setInterval(draw, 200);
    let isPaused = false;
    const pauseButton = document.getElementById('pauseButton');
    pauseButton.addEventListener('click', () => {
        isPaused = !isPaused;
        pauseButton.textContent = isPaused ? '继续' : '暂停';
        if (isPaused) {
            clearInterval(game);
        } else {
            game = setInterval(draw, 200);
        }
    });
    function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        snake.forEach((segment, index) => {
            if (index === 0) {
                drawHead(segment.x, segment.y);
            } else {
                ctx.fillStyle = 'white';
                ctx.fillRect(segment.x, segment.y, box, box);
                ctx.strokeStyle = 'black';
                ctx.strokeRect(segment.x, segment.y, box, box);
            }
        });
        ctx.fillStyle = 'red';
        ctx.fillRect(food.x, food.y, box, box);
        let snakeX = snake[0].x;
        let snakeY = snake[0].y;
        const moveMap = {
            'LEFT': () => snakeX -= box,
            'UP': () => snakeY -= box,
            'RIGHT': () => snakeX += box,
            'DOWN': () => snakeY += box
        };
        moveMap[d]();
        if (snakeX === food.x && snakeY === food.y) {
            food = {
                x: Math.floor(Math.random() * 20) * box,
                y: Math.floor(Math.random() * 20) * box
            };
            score += 1; // 每次吃到食物得分增加
            scoreElement.textContent = '得分: ' + score; // 更新得分显示
        } else {
            snake.pop();
        }
        snakeX = (snakeX < 0) ? canvas.width - box : (snakeX >= canvas.width) ? 0 : snakeX;
        snakeY = (snakeY < 0) ? canvas.height - box : (snakeY >= canvas.height) ? 0 : snakeY;
        const newHead = { x: snakeX, y: snakeY };
        snake.unshift(newHead);
        console.log(score); // 打印当前得分
        // 美化蛇身
        if (score >= 60) {
            beautifySnake();
            // 重新绘制蛇头部
            drawHead(snake[0].x, snake[0].y);
        }
    }
const colors = ['orange', 'blue', 'green', 'purple', 'yellow', 'cyan']; 
function getRandomColor() {
    const letters = '0123456789ABCDEF';
    let color = '#';
    for (let i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}
function beautifySnake() {
    snake.forEach((segment, index) => {
        ctx.fillStyle = getRandomColor(); // 使用随机颜色
        ctx.fillRect(segment.x, segment.y, box, box);
        ctx.strokeStyle = 'black';
        ctx.strokeRect(segment.x, segment.y, box, box);
    });
}
    function drawHead(x, y) {
        ctx.fillStyle = 'green';
        if (score >= 10) {
            ctx.beginPath();
            ctx.arc(x + box / 2, y + box / 2, box / 2, 0, Math.PI * 2);
            ctx.fill();
            ctx.stroke();
        } else {
            ctx.fillRect(x, y, box, box);
            ctx.strokeRect(x, y, box, box);
        }
        if (score >= 20) {
            ctx.fillStyle = 'black';
            ctx.fillRect(x + box / 4, y + box / 4, box / 8, box / 8);
            ctx.fillRect(x + box * 3 / 4 - box / 8, y + box / 4, box / 8, box / 8);
        }
        if (score >= 30) {
            ctx.fillStyle = 'black';
            ctx.beginPath();
            ctx.arc(x + box / 2, y + box * 3 / 4, box / 4, 0, Math.PI);
            ctx.fill();
        }
        if (score >= 40) {
            ctx.fillStyle = 'yellow';
            ctx.beginPath();
            ctx.arc(x + box / 2, y + box * 3 / 4, box / 4, 0, Math.PI);
            ctx.fill();
            ctx.stroke();
        }
        if (score >= 50) {
            ctx.fillStyle = 'purple';
            ctx.beginPath();
            ctx.moveTo(x, y);
            ctx.lineTo(x + box, y);
            ctx.lineTo(x + box / 2, y + box);
            ctx.closePath();
            ctx.fill();
        }
    }
    function collision(head, array) {
        return array.some(segment => head.x === segment.x && head.y === segment.y);
    }
</script>
</html>
相关推荐
深海潜水员11 小时前
【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
游戏·unity·c#
群联云防护小杜11 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构
Thomas_YXQ20 小时前
Unity3D游戏内存优化指南
游戏·unity·职场和发展·性能优化·蓝桥杯·游戏引擎·unity3d
Luna-player1 天前
黑布淡入淡出效果
经验分享·游戏
TESmart碲视2 天前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
翻滚吧键盘3 天前
查看linux中steam游戏的兼容性
linux·运维·游戏
m0_552200823 天前
《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
c++·游戏·ue5
xiaolang_8616_wjl4 天前
c++游戏_小恐龙(开源)
开发语言·数据结构·c++·算法·游戏·开源·c++20
点金石游戏出海4 天前
每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
游戏·ios·业界资讯·apple·崩坏星穹铁道
wsdchong之小马过河4 天前
2025《烈焰之刃》游戏攻略
游戏