贪吃蛇游戏制作(附源码)
效果图(这里没办法显示动态,具体动态自己复制代码去网页看):

CSS:部分
* { margin: 0; padding: 0; } .wrap { width: 600px; margin: 0 auto; position: relative; } p { position: absolute; left: 73%; top: 10%; } h1 { text-align: center; margin-bottom: 20px; } #score { text-align: center; font-size: 20px; } #snake_map { margin: 0 auto; border: 1px solid skyblue; } /*行样式*/ .row { height: 20px; } /*列样式*/ .col { height: 20px; width: 20px; box-sizing: border-box; border: 1px solid lightgray; background: rgb(250, 250, 250); float: left; } .activeSnake { background: black; } .egg { background: red; } #Pause { margin-left: 18%; border: 1px solid skyblue; color: white; background: skyblue; width: 50px; height: 30px; margin-bottom: 10px; } #Start,#Refresh,#Speed,#minus { border: 1px solid skyblue; background: skyblue; color: white; padding: 5px 5px; margin-left: 15px; } .buttom{ font-weight: bold; } .context{ position:absolute; left: 90%; top:16.5%; width:50%; height: 100px; border:1px solid black; background-color: #87CEEB; font-family: "楷体"; font-weight:bold; } .context >span{ padding-left: 110px; font-size: 20px; }
HTML部分:
<body> <div class="wrap"> <h1>贪吃蛇大作战</h1> <!-- 记录吃了多少个蛋 --> <p style="font-size:20px;color:red"> count:<span id="score" style="color:black">0</span> </p> <input id="Pause" type="button" name="name" value="暂停" class="buttom"> <input id="Start" type="button" name="name" value="开始" class="buttom"> <input id="Refresh" type="button" name="name" value="重新开始" class="buttom"> <input id="Speed" type="button" name="name" value="加速" class="buttom"> <input id="minus" type="button" name="name" value="减速" class="buttom"/> <div id="snake_map"></div> <div class="context"> 本游戏规则:<br /><br /> 1.蛇的运动时间为0.3秒,我们还可以根据以上的按钮进行设置(暂停,开始,重新开始,加速,减速),还可以一直按v键 把蛇的运动时间从0.3提至为0.1秒。长按v键可缓冲暂停,其上下左右为蛇的方向键。<br /><br /> 2.本游戏蛇是随着吃果实而增长的,蛇在运动的过程中不能碰壁及自己。同时本游戏还可以霸图晋级,霸图后有丰富的奖励。<br /> <span>快来玩吧!</span> </div> </div> </body>
JS部分:
<script type="text/javascript"> const score = document.getElementById('score'); //获取分数标签 const map = document.getElementById('snake_map'); // 获取路径地图标签 const rowNumber = 20;// 行数 const columnNumber = 20;// 列数; const mapWidth = columnNumber * 20 + 'px';// 地图的宽 const mapHeight = rowNumber * 20 + 'px';// 地图的高 map.style.width = mapWidth; map.style.height = mapHeight;// 设置地图宽高 const snakeDIVPosition = []; // 创建一个二维数组,用来记录地图上的所有div的位置 // 通过双层for循环来创建地图元素 for (i = 0; i < rowNumber; i++) { const rowDIV = document.createElement('div'); rowDIV.className = 'row'; // 将行div添加到路径地图map中 map.appendChild(rowDIV); // 创建一个行级数组,用来存储当前行中的每个方块div const rowArray = []; for (let j = 0; j < columnNumber; j++) { const columnDIV = document.createElement('div'); columnDIV.className = 'col'; rowDIV.appendChild(columnDIV); // 同时将方块添加到行数组中 rowArray.push(columnDIV); } // 当前内层循环结束,将行数组添加到二维数组中 snakeDIVPosition.push(rowArray); } // 创建蛇模型 // 创建一个一维数组,用来存储蛇身所占的div const snake = []; // 固定蛇身起始长度为3个div for (i = 0; i < 3; i++) { // 为蛇身设置不同颜色的div snakeDIVPosition[0][i].className = 'col activeSnake'; // 存储在蛇身数组中 snake[i] = snakeDIVPosition[0][i]; } // 定义变量来控制蛇 let x = 2; let y = 0;// 蛇头的起始位置偏移量 let scoreCount = 0;// 分数计数器,即吃了多少个蛋 let eggX = 0;// 记录蛋所在的行位置 let eggY = 0;// 记录蛋所在的列位置; let direction = 'right';// 记录蛇移动的方向,初始为向右 let changeDir = true;// 判断是否需要改变蛇的移动方向 let delayTimer = null;// 延迟定时器 let moveTimer; // 添加键盘事件监听方向键来改变蛇的移动方向 document.onkeydown = function(event) { // 先判断是否需要改变方向,true表示需要,false表示不需要 if (!changeDir) { return;// return空表示直接结束函数,后续代码不执行 } const a = 1; event = event || window.event; if (direction == 'right' && event.keyCode == 37) { return;// 终止事件执行 } if (direction == 'left' && event.keyCode == 39) { return; } if (direction == 'up' && event.keyCode == 40) { return; } if (direction == 'down' && event.keyCode == 38) { return; } if(event.keyCode == 86){ this.onkeypress=function(){ clearInterval(moveTimer); moveTimer = setInterval('snakeMove()', 100); } /*if(a>1){ this.onkeyup=function(){ clearInterval(moveTimer); moveTimer = setInterval('snakeMove()', 300); } }*/ } // 我们通过keyCode确定蛇要移动的方向 switch (event.keyCode) { case 37: direction = 'left';// 向左 break; case 38: direction = 'up';// 向上; break; case 39: direction = 'right';// 向右 break; case 40: direction = 'down';// 向下 break; } changeDir = false; delayTimer = setTimeout(function() { // 设置是否需要改变方向 changeDir = true; }, 300); }; // 开始设置蛇移动逻辑 // 蛇移动函数 function snakeMove() { // 根据上面设置的方向来设置蛇头的位置 switch (direction) { case 'left': x--; break; case 'right': x++; break; case 'up': y--; break; case 'down': y++; break; }; // 判断是否游戏结束 if (x < 0 || y < 0 || x >= columnNumber || y >= rowNumber) { alert('Game Over!!!'); // 结束蛇移动的定时器 clearInterval(moveTimer); return;// 终止键盘事件; } // 如果蛇吃到自己,也要结束游戏 for (let i = 0; i < snake.length; i++) { // 将此时蛇头移动后的位置与之前左右的组成蛇的div的位置进行比较,如果相同则说明吃到自己,游戏结束 if (snake[i] == snakeDIVPosition[y][x]) { alert('Game over!!!'); clearInterval(moveTimer); return; }; } // 判断蛇头移动的位置是否有蛋 if (eggX == x && eggY == y) { snakeDIVPosition[eggY][eggX].className = 'col activeSnake'; snake.push(snakeDIVPosition[eggY][eggX]);// 加入蛇身 scoreCount++;// 记录分数 // 更新当前的分数 score.innerHTML = scoreCount; // 随机产生一个新的蛋 createNewEgg(); } else { // 设置蛇碰不到蛋的逻辑 // 蛇尾去掉蛇自身的颜色,变成格子的颜色 snake[0].className = 'col'; // 将蛇尾div从数组中移除 snake.shift(); // 定位到的新的蛇头加入到蛇数组中 snakeDIVPosition[y][x].className = 'col activeSnake'; snake.push(snakeDIVPosition[y][x]); }; }; moveTimer = setInterval('snakeMove()', 300); // 定义一个生成min,max之间的随机数函数 function random(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); }; function createNewEgg() { // 随机出新的egg的下标的x和y值 eggX = random(0, columnNumber - 1); eggY = random(0, rowNumber - 1); // 判断如果随机产生的蛋与蛇身重合,就重新随机产生一个蛋 if (snakeDIVPosition[eggY][eggX].className == 'col activeSnake') { createNewEgg();// 重新随机新的egg } else { snakeDIVPosition[eggY][eggX].className = 'col egg'; } }; createNewEgg();// 在游戏开始的时候生成新的egg const pause = document.getElementById('Pause'); const start = document.getElementById('Start'); const refresh = document.getElementById('Refresh'); const speed = document.getElementById('Speed'); // 暂停按钮 pause.onclick = function() { clearInterval(moveTimer); }; let speed1; // 开始按钮 start.onclick = function() { clearInterval(moveTimer); moveTimer = setInterval('snakeMove()', speed1); }; // 刷新按钮 refresh.onclick = function() { window.location.reload(); }; // 加速按钮 speed1 = 300; //游戏的初始化远动时间 speed.onclick = function() { speed1 -= 50; clearInterval(moveTimer); moveTimer = setInterval('snakeMove()', speed1); }; //减速按钮 minus.onclick = function(){ speed1 += 50; clearInterval(moveTimer); moveTimer = setInterval('snakeMove()', speed1); } </script>
这里别忘了,新建一个css文件,在html文件中引入css文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构