• 首页
  • 说说
  • 友人
  • 留言
  • 赞赏
  • 建站史
  • 搜索
  • 夜间模式
    ©2025  Feng的小屋 Theme by OneBlog
    搜索
    标签
    # HTML # CSS # JS # 代码 # 分享 # 美化 # 感悟 # 小游戏 # 摄影 # 摄影知识
    🧑‍💻 代码

    趣味web在线小游戏-贪吃蛇🐍

    2025.07.22 / 63 阅读 / 0 评论 / 14690 字
    🧑‍💻 代码

    趣味web在线小游戏-贪吃蛇🐍

    阅读 63 评论 0 发表于2025.07.22
    AI摘要

    摘要:“贪吃蛇”是一款基于HTML、CSS和JavaScript开发的在线小游戏,运用Tailwind CSS进行样式设计,提供经典贪吃蛇游戏的现代版本。游戏包括蛇的移动、食物的生成、碰撞检测等核心逻辑,并设有难度调整功能、特殊食物和保存最高分等特色机制。对于初学者来说,该项目有助于了解HTML、CSS和JavaScript的基本用法,同时代码结构清晰,易于理解和扩展。

    web贪吃蛇小游戏介绍

    一、项目概述

    点击即可专跳至在线预览~

    “贪吃蛇”是一个简单而有趣的项目。它基于 HTML、CSS 和 JavaScript 构建,运用了 Tailwind CSS 进行样式设计,为玩家提供了一个经典贪吃蛇游戏的现代版本。玩家通过控制蛇的移动方向,吃掉随机生成的食物,使蛇不断变长,同时要避免撞到墙壁或自己的身体。游戏还设有难度调整功能,增加了游戏的趣味性和挑战性。

    二、项目结构与技术栈

    1. HTML 结构

    HTML 文件 snake-game.html 是整个项目的基础,它负责搭建游戏的页面结构。以下是部分关键 HTML 代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>简约贪吃蛇</title>
        <script src="https://cdn.tailwindcss.com"></script>
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/css/font-awesome.min.css" rel="stylesheet">
        <!-- 其他头部信息 -->
    </head>
    <body class="bg-darker min-h-screen flex flex-col items-center justify-center p-4 font-game text-light overflow-x-hidden">
        <!-- 背景装饰 -->
        <div class="fixed inset-0 -z-10 opacity-10">
            <div class="absolute top-10 left-10 w-64 h-64 rounded-full bg-primary/30 blur-3xl"></div>
            <div class="absolute bottom-10 right-10 w-80 h-80 rounded-full bg-secondary/30 blur-3xl"></div>
            <div class="absolute top-1/2 left-1/4 w-40 h-40 rounded-full bg-accent/30 blur-3xl"></div>
        </div>
    
        <div class="w-full max-w-3xl flex flex-col items-center">
            <header class="w-full text-center mb-8 relative">
                <h1 class="text-[clamp(2.5rem,6vw,4rem)] font-bold text-primary mb-2 text-shadow text-glow tracking-tight">
                    <span class="inline-block transform hover:scale-105 transition-transform duration-300">简</span>
                    <span class="inline-block transform hover:scale-105 transition-transform duration-300">约</span>
                    <span class="inline-block transform hover:scale-105 transition-transform duration-300">贪</span>
                    <span class="inline-block transform hover:scale-105 transition-transform duration-300">吃</span>
                    <span class="inline-block transform hover:scale-105 transition-transform duration-300">蛇</span>
                </h1>
                <p class="text-light/70 text-[clamp(1rem,2vw,1.2rem)] max-w-2xl mx-auto">
                    控制蛇移动,吃掉食物,避开墙壁和自己的身体,挑战最高分!
                </p>
            </header>
          
            <main class="w-full flex flex-col md:flex-row gap-8">
                <div class="w-full md:w-2/3 relative">
                    <div class="game-gradient rounded-2xl shadow-2xl p-3 mb-6 relative overflow-hidden">
                        <canvas id="gameCanvas" class="w-full aspect-square rounded-xl bg-dark/70"></canvas>
                    </div>
                  
                    <div class="flex justify-center gap-4 mt-4">
                        <button id="startBtn" class="bg-primary hover:bg-primary/90 text-white font-medium py-3 px-8 rounded-xl transition-all duration-300 transform hover:scale-105 active:scale-95 shadow-lg flex items-center justify-center button-pulse">
                            <i class="fa fa-play mr-2"></i> 开始游戏
                        </button>
                        <button id="pauseBtn" class="bg-secondary hover:bg-secondary/90 text-white font-medium py-3 px-8 rounded-xl transition-all duration-300 transform hover:scale-105 active:scale-95 shadow-lg flex items-center justify-center" disabled>
                            <i class="fa fa-pause mr-2"></i> 暂停游戏
                        </button>
                        <button id="resetBtn" class="bg-gray-700 hover:bg-gray-600 text-white font-medium py-3 px-8 rounded-xl transition-all duration-300 transform hover:scale-105 active:scale-95 shadow-lg flex items-center justify-center">
                            <i class="fa fa-refresh mr-2"></i> 重置游戏
                        </button>
                    </div>
                </div>
              
                <div class="w-full md:w-1/3 glass-effect rounded-2xl p-6 shadow-xl border border-white/10">
                    <div class="mb-6">
                        <h2 class="text-2xl font-bold text-primary mb-3 flex items-center">
                            <i class="fa fa-trophy mr-3 text-secondary"></i> 游戏数据
                        </h2>
                        <div class="space-y-4">
                            <div class="bg-dark/50 rounded-xl p-4 flex justify-between items-center hover-lift">
                                <span class="text-light/80 flex items-center">
                                    <i class="fa fa-star text-yellow-400 mr-2"></i> 当前得分:
                                </span>
                                <span id="score" class="text-3xl font-bold text-secondary">0</span>
                            </div>
                            <div class="bg-dark/50 rounded-xl p-4 flex justify-between items-center hover-lift">
                                <span class="text-light/80 flex items-center">
                                    <i class="fa fa-crown text-yellow-500 mr-2"></i> 最高分:
                                </span>
                                <span id="highScore" class="text-3xl font-bold text-primary">0</span>
                            </div>
                            <div class="bg-dark/50 rounded-xl p-4 flex justify-between items-center hover-lift">
                                <span class="text-light/80 flex items-center">
                                    <i class="fa fa-bolt text-accent mr-2"></i> 蛇长:
                                </span>
                                <span id="snakeLength" class="text-3xl font-bold text-accent">3</span>
                            </div>
                        </div>
                    </div>
                  
                    <div class="mb-6">
                        <h2 class="text-2xl font-bold text-primary mb-3 flex items-center">
                            <i class="fa fa-info-circle mr-3 text-secondary"></i> 游戏说明
                        </h2>
                        <ul class="text-light/80 space-y-3">
                            <li class="flex items-start">
                                <i class="fa fa-keyboard-o text-primary mt-1 mr-3"></i>
                                <span>使用方向键或WASD控制蛇的移动</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fa fa-apple text-primary mt-1 mr-3"></i>
                                <span>吃到食物增加分数和蛇的长度</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fa fa-ban text-primary mt-1 mr-3"></i>
                                <span>撞到墙壁或自己的身体游戏结束</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fa fa-pause text-primary mt-1 mr-3"></i>
                                <span>游戏暂停时可以调整难度</span>
                            </li>
                        </ul>
                    </div>
                  
                    <div>
                        <h2 class="text-2xl font-bold text-primary mb-3 flex items-center">
                            <i class="fa fa-bolt mr-3 text-secondary"></i> 游戏难度
                        </h2>
                        <div class="bg-dark/50 rounded-xl p-4 hover-lift">
                            <div class="flex items-center justify-between mb-3">
                                <span class="text-light/80">速度级别:</span>
                                <div class="flex items-center">
                                    <button id="speedDown" class="bg-gray-700 hover:bg-gray-600 text-white p-3 rounded-l-lg transition-all duration-300">
                                        <i class="fa fa-minus"></i>
                                    </button>
                                    <span id="speedValue" class="bg-dark/80 px-6 py-3 text-lg font-medium">中等</span>
                                    <button id="speedUp" class="bg-gray-700 hover:bg-gray-600 text-white p-3 rounded-r-lg transition-all duration-300">
                                        <i class="fa fa-plus"></i>
                                    </button>
                                </div>
                            </div>
                            <div class="w-full bg-dark/70 rounded-full h-2.5">
                                <div id="speedBar" class="bg-gradient-to-r from-green-400 via-yellow-400 to-red-500 h-2.5 rounded-full" style="width: 50%"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </main>
          
            <footer class="w-full mt-10 text-center text-light/50 text-sm">
                <p>© 2025 简约贪吃蛇 | 使用键盘或屏幕按钮控制 | 享受游戏乐趣</p>
            </footer>
        </div>
    
        <script>
            // JavaScript 代码
        </script>
    </body>
    </html>

    这段代码创建了游戏的整体布局,包括标题、游戏画布、控制按钮、游戏数据显示区、游戏说明和难度调整区等。使用了 Tailwind CSS 类名进行样式设计,使页面具有响应式布局和美观的外观。

    2. CSS 样式

    通过 Tailwind CSS 和自定义样式,为游戏界面添加了丰富的视觉效果。例如,使用渐变背景、阴影、动画等:

    <style type="text/tailwindcss">
        @layer utilities {
            .content-auto {
                content-visibility: auto;
            }
            .text-shadow {
                text-shadow: 0 2px 4px rgba(0,0,0,0.25);
            }
            .text-glow {
                text-shadow: 0 0 10px rgba(76, 175, 80, 0.5);
            }
            .game-gradient {
                background: linear-gradient(135deg, #2C3E50 0%, #1A202C 100%);
            }
            .button-pulse {
                animation: pulse 2s infinite;
            }
            @keyframes pulse {
                0% {
                    box-shadow: 0 0 0 0 rgba(76, 175, 80, 0.4);
                }
                70% {
                    box-shadow: 0 0 0 10px rgba(76, 175, 80, 0);
                }
                100% {
                    box-shadow: 0 0 0 0 rgba(76, 175, 80, 0);
                }
            }
            .food-pulse {
                animation: food-pulse 1.5s infinite;
            }
            @keyframes food-pulse {
                0%, 100% {
                    transform: scale(1);
                    box-shadow: 0 0 10px rgba(255, 152, 0, 0.5);
                }
                50% {
                    transform: scale(1.05);
                    box-shadow: 0 0 15px rgba(255, 152, 0, 0.7);
                }
            }
            .snake-head {
                border-radius: 4px;
            }
            .snake-body {
                border-radius: 3px;
            }
            .glass-effect {
                background: rgba(255, 255, 255, 0.05);
                backdrop-filter: blur(10px);
                -webkit-backdrop-filter: blur(10px);
            }
            .hover-lift {
                transition: transform 0.3s ease, box-shadow 0.3s ease;
            }
            .hover-lift:hover {
                transform: translateY(-2px);
                box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
            }
        }
    </style>

    这些样式规则定义了游戏界面的各种效果,如按钮的脉冲动画、食物的缩放动画、玻璃效果等,增强了游戏的视觉吸引力。

    3. JavaScript 逻辑

    JavaScript 代码负责游戏的核心逻辑,包括蛇的移动、食物的生成、碰撞检测、游戏状态管理等。以下是部分关键 JavaScript 代码及其解释:

    初始化游戏

    function initGame() {
        // 清空蛇和食物
        snake = [];
        food = {};
        specialFood = null;
      
        // 设置蛇的初始位置和方向
        const centerX = Math.floor((canvas.width / 2) / gridSize) * gridSize;
        const centerY = Math.floor((canvas.height / 2) / gridSize) * gridSize;
      
        snake = [
            {x: centerX, y: centerY},
            {x: centerX - gridSize, y: centerY},
            {x: centerX - gridSize * 2, y: centerY}
        ];
      
        direction = 'right';
        nextDirection = 'right';
        score = 0;
        scoreElement.textContent = score;
        updateSnakeLength();
      
        // 生成第一个食物
        generateFood();
      
        // 绘制初始状态
        draw();
    }

    initGame 函数用于初始化游戏状态,包括清空蛇和食物数组,设置蛇的初始位置和方向,重置分数,生成第一个食物,并绘制游戏的初始状态。

    移动蛇

    function moveSnake() {
        // 更新方向
        direction = nextDirection;
      
        // 获取蛇头位置
        const head = {x: snake[0].x, y: snake[0].y};
      
        // 根据方向移动蛇头
        switch (direction) {
            case 'up':
                head.y -= gridSize;
                break;
            case 'down':
                head.y += gridSize;
                break;
            case 'left':
                head.x -= gridSize;
                break;
            case 'right':
                head.x += gridSize;
                break;
        }
      
        // 检查是否吃到普通食物
        let ateFood = false;
        if (head.x === food.x && head.y === food.y) {
            // 增加分数
            score += 10;
            scoreElement.textContent = score;
          
            // 更新最高分
            if (score > highScore) {
                highScore = score;
                highScoreElement.textContent = highScore;
                localStorage.setItem('snakeHighScore', highScore);
            }
          
            // 生成新食物
            generateFood();
            ateFood = true;
        }
      
        // 检查是否吃到特殊食物
        if (specialFood && head.x === specialFood.x && head.y === specialFood.y) {
            // 增加更多分数
            score += 50;
            scoreElement.textContent = score;
          
            // 更新最高分
            if (score > highScore) {
                highScore = score;
                highScoreElement.textContent = highScore;
                localStorage.setItem('snakeHighScore', highScore);
            }
          
            // 移除特殊食物
            specialFood = null;
            if (specialFoodTimer) {
                clearTimeout(specialFoodTimer);
                specialFoodTimer = null;
            }
          
            ateFood = true;
        }
      
        if (!ateFood) {
            // 如果没吃到食物,移除尾部
            snake.pop();
        } else {
            // 吃到食物后更新蛇长度
            updateSnakeLength();
        }
      
        // 检查碰撞
        if (checkCollision(head)) {
            gameOver();
            return;
        }
      
        // 添加新头部
        snake.unshift(head);
      
        // 绘制游戏
        draw();
    }

    moveSnake 函数是游戏的核心逻辑之一,它根据当前方向移动蛇头,检查蛇是否吃到食物(普通食物或特殊食物),如果吃到食物则增加分数、更新最高分、生成新食物并更新蛇的长度;如果没吃到食物则移除蛇的尾部。最后检查蛇是否发生碰撞,如果碰撞则游戏结束,否则添加新的蛇头并重新绘制游戏。

    检查碰撞

    function checkCollision(head) {
        // 检查是否碰到墙壁
        if (
            head.x < 0 || 
            head.x >= canvas.width || 
            head.y < 0 || 
            head.y >= canvas.height
        ) {
            return true;
        }
      
        // 检查是否碰到自己
        for (let i = 1; i < snake.length; i++) {
            if (head.x === snake[i].x && head.y === snake[i].y) {
                return true;
            }
        }
      
        return false;
    }

    checkCollision 函数用于检查蛇头是否碰到墙壁或自己的身体,如果碰到则返回 true,表示游戏结束。

    三、游戏特色

    1. 特殊食物机制

    游戏中有 20% 的概率生成特殊食物,特殊食物会在 10 秒后消失。吃到特殊食物可以获得 50 分,比普通食物的 10 分更多,增加了游戏的趣味性和挑战性。

    2. 难度调整功能

    玩家可以通过点击“+”和“-”按钮来调整游戏速度,速度级别分为“很慢”、“慢”、“中等”、“快”、“很快”。游戏速度的调整会实时更新速度条的显示,并在游戏运行时动态更新游戏循环的间隔时间。

    3. 本地存储最高分

    游戏使用 localStorage 来保存玩家的最高分,即使关闭浏览器或刷新页面,最高分也不会丢失,激励玩家不断挑战自己的记录。

    四、总结

    “贪吃蛇”小游戏是一个简单而有趣的项目,它通过 HTML、CSS 和 JavaScript 实现了经典贪吃蛇游戏的核心功能,并添加了一些现代的视觉效果和特色机制。对于初学者来说,这个项目是一个很好的学习示例,可以帮助他们了解 HTML、CSS、JavaScript 的基本用法,以及如何使用 Canvas 元素进行图形绘制和动画实现。同时,项目的代码结构清晰,易于理解和扩展,开发者可以根据自己的需求添加更多的功能和特色,如不同的游戏模式、关卡设计等。

    本文著作权归作者 [ Feng ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    代码HTMLCSSJS
    取消回复

    发表留言
    回复

    首页说说友人留言赞赏建站史
    Copyright©2025  All Rights Reserved.  Load:0.025 s
    Theme by OneBlog V3.6.3
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。