贪吃蛇游戏:增加暂停按钮,每次增加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>
相关推荐
apcipot_rain7 小时前
Python实战——蒙特卡洛模拟分析杀牌游戏技能收益
python·游戏·数学建模
IpdataCloud9 小时前
米哈游黑产案解析:游戏账号批量注册如何用IP查询识别外挂与多开用户?操作指南
网络协议·tcp/ip·游戏
私人珍藏库11 小时前
【Android】GameNative 0.9.0 [特殊字符] 手机畅玩Steam游戏
android·游戏·智能手机·app·工具·软件·多功能
wanhengidc11 小时前
云手机搬砖安全吗
大数据·运维·服务器·安全·游戏·智能手机
wanhengidc11 小时前
服务器管理器的作用有哪些?
运维·服务器·网络·安全·游戏·智能手机
风酥糖11 小时前
Godot游戏练习01-第26节-轮次结束后弹出升级选项
游戏·游戏引擎·godot
前端不太难14 小时前
一天做出:鸿蒙 + AI 游戏 Demo
人工智能·游戏·harmonyos
世人万千丶1 天前
开源鸿蒙跨平台Flutter开发:成语接龙游戏应用
学习·flutter·游戏·华为·开源·harmonyos·鸿蒙
兔子零10241 天前
Claude Code 都把宠物养进终端了,我做了一个真正能长期玩的中文宠物游戏
前端·游戏·游戏开发
howlet21 天前
AI生成cocos-creator打砖块游戏-跑通第1关(CodeBuddy)
人工智能·游戏·cocos2d