贪吃蛇游戏:增加暂停按钮,每次增加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>
相关推荐
Footprint_Analytics9 小时前
Footprint Analytics 助力 Sei 游戏生态增长
游戏·web3·区块链
半盏茶香13 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
PandaQue21 小时前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
白狐欧莱雅1 天前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
豆本-豆豆奶1 天前
用 Python 写了一个天天酷跑(附源码)
开发语言·python·游戏·pygame·零基础教程
Leoysq1 天前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
zsc_1182 天前
(C++回溯算法)微信小程序“开局托儿所”游戏
c++·算法·游戏
中云DDoS CC防护蔡蔡2 天前
棋牌游戏防ddos攻击,高防IP好用吗?
运维·服务器·游戏·网络安全·ddos
dangoxiba2 天前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule
游戏·unity·c#·游戏引擎·playmaker
ToDesk_Daas2 天前
为什么越来越多人开始用云电脑?网友道出了真相
科技·游戏·电脑