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

Feng
7月22日发布

图片[1] - 趣味web在线小游戏-贪吃蛇🐍 - Feng的小屋

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/font-awesome@4.7.0/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 元素进行图形绘制和动画实现。同时,项目的代码结构清晰,易于理解和扩展,开发者可以根据自己的需求添加更多的功能和特色,如不同的游戏模式、关卡设计等。

© 版权声明
THE END
喜欢就支持一下吧
点赞 2 分享 赞赏
评论 抢沙发
OωO
取消
SSL