这个小游戏是一时兴起。在暑假时写的 。不过当时还比较简陋。
后来开学后 。还没上课。就又拿出来改了改界面。让它看起来更美观,更像贪吃蛇一些。

先展示展示几张图吧。

开始前

开始咯

吃了些小老鼠后:

撞墙或撞到自己后

当时去做这个时,可能是突然的一个想法。但并不是要做一个完整的游戏出来。
所以这里并没有设置关卡模式有些细节也并不关注 。只是去关注了身体移动,吃食物,成长这些主要的问题。
当然,这些主要问题解决,增加其他功能就不是大问题了。

这里我就先说一下我的思路,有兴趣和想法的同学们可以自己先去尝试尝试,或者可以跟我交流交流。

我的思路

身体怎么移动

这是我第一个思考的问题。
我先想,如果只有一个身体节点,也就是一个小圆 。应该怎么去移动。控制方向。
当然这个就简单了。我们先定义一个变量,保存移动方向 。 再定义一个函数,根据方向控制节点的定时移动。 然后监听键盘点击事件。改变方向就可以了。

那么如果有多个节点呢?显然每个节点都使用一个函数去控制它移动是不切实际的。
我们可以联想到火车的节点,转哪由车头驾驶员控制。后面跟着跑就行了

那么蛇身体的其他节点也是同样。它不需要知道方向,它要做的很简单,就是前一个节点在哪,它走了,我就移动到它的位置就可以了。
那么除了头部,其他的节点通过一个跟屁股走的函数 就可以完成移动了。

身体怎么成长

成长是在吃到食物后。仅判断一下头节点是否于食物节点位置重合即可。
身体成长还是比较简单的,也就是在尾部增加一个身体节点,但不是一吃到食物就变长。而是原本的最后一个节点移开后再边长。出现的位置顶替了原最后节点的位置。

怎么判断死亡

这个问题也是比较简单的,也是判断头部节点位置的问题。主要撞到自己,也就是与身体的某部位的位置重合或者与墙壁的位置重合了,就结束游戏即可。

demo

HTML

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><link rel="shortcut icon" href="./img/favicon.ico" type="image/x-icon"><title>贪吃蛇</title><link rel="stylesheet" href="./greedySnake.css">
</head><body><!-- 墙 --><div class="wall"><!-- 开始按钮 --><div class="start" style="display:block"><div class="tips_con"><text>?</text><ul class="tips"><li><strong>·</strong> 通过键盘的上下左右的键改变贪吃蛇移动的方向</li><li><strong>·</strong> 长按 Shift 键可以加速,松开恢复</li><li><strong>·</strong> 无关卡设置,触墙或身体会死亡</li></ul></div><button onclick="startGame()">开&nbsp;始</button></div><!-- 蛇盒子 --><div class="snake" style="display:block"><!-- <div class="snake-node" id="tryNode"></div> --></div><!-- 食物盒子 --><div class="foods"></div><!-- 得分 --><div id="infoBar"><div>得分:<span id="score">0</span></div></div><!-- 音效 --><audio src="./sounds/eat.wav">播放</audio></div></body>
<script src="./greedtSnake.js"></script></html>```
#### CSS
```css
html,
body {padding: 0;margin: 0;background-color: #111d49;overflow: hidden;user-select: none;
}/* 背景及边框 */
.wall {width: 980px;height: 580px;border: 30px solid transparent;-webkit-border-image: url(./img/wall.png) 30 30 round;border-image: url(./img/wall.png) 30 30 round;margin: 80px auto;background-color: #666bc6;position: relative;
}/* 蛇的身体节点 */
.snake-node {position: absolute;transform: translate(-50%, -50%);width: 20px;height: 20px;border: 2px solid #010496;border-radius: 50%;background-color: #010496;opacity: 1;
}/* 提高蛇头层级 */
.snake-node:nth-child(1) {z-index: 2;
}/* 眼睛 */
.snake-node:nth-child(1)::before {content: "";position: absolute;top: 0;left: -5px;width: 7px;height: 7px;background-color: #000;border: 3px solid #fff;border-radius: 50%;z-index: 2;
}/* 眼睛 */
.snake-node:nth-child(1)::after {content: "";position: absolute;top: 0;right: -5px;width: 7px;height: 7px;background-color: #000;border: 3px solid #fff;border-radius: 50%;z-index: 2;
}/* 食物 */
.food {width: 20px;height: 20px;background-image: url(./img/mice.png);background-size: cover;position: absolute;
}/* 开始按钮 */
.start {position: absolute;top: 50%;left: 50%;width: 200px;height: 100px;background-color: rgba(255, 255, 255, 0.692);transform: translate(-50%, -50%);text-align: center;line-height: 100px;display: none;
}button {outline: none;padding: 5px 10px;border-radius: 10px;border: 2px solid #0063bd;background-image: linear-gradient(to bottom, #62ecfc, #029aea, #0061bc);color: #fff;font-size: 16px;font-weight: 600;box-shadow: 1px 2px 4px 2px rgba(0, 0, 0, 0.253);
}button:active {background-image: linear-gradient(rgba(53, 53, 53, 0.199), rgb(53, 53, 53, 0.2));
}/* 提示框 */
.tips_con {position: absolute;top: 4px;right: 4px;width: 22px;height: 22px;background-color: rgba(255, 255, 255, 0.704);border: 1px solid rgb(15, 15, 15);border-radius: 50%;text-align: center;line-height: 22px;color: #000;font-weight: bold;
}.tips_con text {display: inline-block;width: 22px;height: 22px;border-radius: 50%;background-color: rgba(255, 255, 255, 0.704);text-align: center;line-height: 22px;color: #000;font-weight: bold;
}.tips_con text:hover {background-color: #44bcd1;box-shadow: 0px 0px 0px 1px #44bacf;
}.tips_con ul {position: absolute;top: -24px;left: 45px;margin: 0;padding: 0;border: 1px solid rgb(0, 0, 0);background-color: #fff;width: 200px;display: none;
}.tips_con ul li {list-style-type: none;padding: 4px 0;
}.tips_con text:hover+ul {display: block;
}/* 底部分数 */
#infoBar {position: absolute;bottom: -30px;left: 50%;height: 28px;line-height: 28px;background-color: rgb(255, 234, 234);padding: 0px 30px;text-align: center;font-size: 17px;transform: translateX(-50%);border: 1px solid #fff;
}/* 音效 */
audio {visibility: hidden;display: absolute;
}

最重要的 JavaScript

window.onload = function () {// 点击开始按钮var start = document.querySelector(".start");// 食物盒子var foods = document.querySelector(".foods");// 蛇盒子const Snake = document.querySelector(".snake");// 自动移动定时器IDvar timer;// 分数const score = document.querySelector("#score");// 音效const audio = document.querySelector("audio");// 设置最大速度和最小速度常量const maxSpeed = 100, minSpeed = 140// 开始游戏startGame = function () {setTimeout(() => {// 隐藏开始按钮start.style.display = "none";// 初始蛇init();// 开始move(2);//  监听方向改变window.addEventListener("keydown", judgeDrec, false);window.addEventListener("keyup", speedDown, false)}, 200);};// 保存蛇头节点var snakeHead// 初始化蛇和食物init = function () {SnakeBodyList = [[490, 290],[490, 310],[490, 330],];Snake.innerHTML = ` <div class="snake-node" id="snakeHead"></div><div class="snake-node"></div><div class="snake-node"></div>`;snakeHead = document.querySelector("#snakeHead")Snake.style.display = "block";addFood();addFood();addFood();addFood();};// 旋转头function rotateHead(dire) {// 1 : 左 ; 2:上; 3:右 ; 4 : 下switch (dire) {case 1: {snakeHead.style.transform = "translate(-50%,-50%) rotate(-90deg)";  // 注意先后顺序。否则会出错break}case 3: {snakeHead.style.transform = "translate(-50%,-50%) rotate(90deg) ";break}case 4: {snakeHead.style.transform = "translate(-50%,-50%) rotate(180deg) ";break}default: {snakeHead.style.transform = " translate(-50%,-50%) rotate(0deg)";}}}// 方向变量let dire = 2;// 设置节流阀let stop = 0;// 移动速度let speed = minSpeed;// 判断方法和同时判断是否加速function judgeDrec(e) {//  1 : 左 ; 2:上; 3:右 ; 4 : 下// 如果加速if (e.keyCode == 16) {// 并且速度小if (speed === minSpeed) {speed = maxSpeed;move(dire);stop = 0;}return}// 设置节流if (stop) {return;}stop = 1;setTimeout(() => {stop = 0;}, speed);// 判断方向switch (e.keyCode) {case 37: {if (dire === 3 || dire === 1) break;move(1);dire = 1;break;}case 38: {if (dire === 4 || dire === 2) break;move(2);dire = 2;break;}case 39: {if (dire === 1 || dire === 3) break;move(3);dire = 3;break;}case 40: {if (dire === 2 || dire === 4) break;move(4);dire = 4;break;}}}// 移动函数function move(direction) {// 旋转头部rotateHead(direction)// 清理上一次的定时器,免得影响移动方向clearInterval(timer);// 判断移动方向并且赋值移动距离const moveT = direction === 2 ? -20 : direction === 4 ? 20 : 0;const moveL = direction === 1 ? -20 : direction === 3 ? 20 : 0;// 设置定时器,定时移动timer = setInterval(() => {const left = SnakeBodyList[0][0] + moveL,top = SnakeBodyList[0][1] + moveT;// 判断是否死亡 ,没有死亡再进行移动if (!ifDeath(top, left))ifGrowth(top, left);}, speed);}// 减少速度function speedDown(e) {if (e.keyCode == 16) {speed = minSpeedmove(dire);}return}// 判断是否死亡 , 返回布尔值 , true 表示死亡function ifDeath(top, left) {let end = falseif (top >= 580 || top <= 0 || left <= 0 || left >= 980) {endGame();end = true}SnakeBodyList.some((v, i) => {if (i === 0) return false;if (v[0] === left && v[1] === top) {endGame();end = truereturn true;}return false;});return end}// 判断是否吃到食物ifGrowth = function (top, left) {// 检测蛇头是否于食物同位置let ifgrowth = foodPosition.some((v, i) => {if (v[0] === top - 10 && v[1] === left - 10) {foodPosition.splice(i, 1);return true;}return false;});if (ifgrowth) {// 播放音效audio.play();// 成长snakeGrowth([left, top], 1);// 增加食物addFood();// 删除吃掉的食物decreaseFood(top - 10, left - 10);return;}// 不成长snakeGrowth([left, top], 0);};// 食物随机生成var foodPosition = [];addFood = function () {//  left 0-960 - 20一个单位  -- 0-58的整数// top 0-560 - 20 一个单位   -- 0 -28 的整数// 生成随机位置const left = Math.round(Math.random() * 48) * 20;const top = Math.round(Math.random() * 28) * 20;// 判断会不会与旧食物位置重合let isadd = foodPosition.every((v) => {if (v[0] === top && v[1] === left) {addFood();return false;}return true;});if (isadd) {foodPosition.push([top, left]);const food = `<div class="food" id='food${top}${left}' style='left:${left}px;top:${top}px'></div>`;foods.innerHTML += food;}};// 删除吃掉的食物decreaseFood = function (top, left) {score.innerText = score.innerText / 1 + 10;const id = `food${top}${left}`;foods.removeChild(document.querySelector("#" + id));};// 蛇身体节点位置数组var SnakeBodyList = [[490, 290],[490, 310],[490, 330],];// 蛇的移动和成长snakeGrowth = function (newPositipn, add) {// 增加蛇长度for (let i = 0; i < add; i++) {SnakeBodyList.push(SnakeBodyList[SnakeBodyList.length - 1]);let newNode = document.createElement("div")newNode.setAttribute("class", "snake-node")Snake.append(newNode)newNode = null}// 向位置坐标添加头位置,删除尾部位置if (newPositipn) {SnakeBodyList.unshift(newPositipn);SnakeBodyList.pop();}// 移动身体const SnakeList = document.querySelectorAll(".snake-node");for (let i = 0; i < SnakeBodyList.length; i++) {SnakeList[i].style.left = `${SnakeBodyList[i][0]}px`;SnakeList[i].style.top = `${SnakeBodyList[i][1]}px`;SnakeList[1].style.opacity = 1}};// 游戏终止function endGame() {// 停止移动clearInterval(timer);alert("游戏结束");window.removeEventListener("keydown", judgeDrec, false);// 恢复Snake.innerHTML = "";Snake.style.display = "none";// 回复原始方向dire = 2// 清空食物位置数组foodPosition = [];// 情况食物foods.innerHTML = "";// 清空得分score.innerText = 0;// 显示开始按钮start.style.display = "block";}
};

注意

  • 这里我设置了吃掉食物后的音效。大家可以去找一个音效的 URL放入即可。不需要可以删掉相关的代码避免报错
  • 蛇的眼睛是伪元素,不是图片,墙和老鼠的图片大家搜一搜换一下URL就可以了。

大家有什么不懂或者有什么高见欢迎评论或私聊。

简单的贪吃蛇小游戏。使用的是纯原生 JavaScript 和 HTML ,CSS相关推荐

  1. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  2. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  3. android 简单的贪吃蛇小游戏

    贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...

  4. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  5. QT实现简单的贪吃蛇小游戏

    一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...

  6. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  7. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

  8. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  9. C# 制作贪吃蛇小游戏,最简单的实现

    C# 制作贪吃蛇小游戏 目录 画蛇 实现蛇的上下左右移动 随机生成目标物 开始游戏 计分 重新开始 增加难度 死亡判定 1.1 画蛇的一节 Class Element()Graphics g;publ ...

  10. Python实现贪吃蛇小游戏(双人模式)

    这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...

最新文章

  1. R语言 、Excel哪个更能胜任数据分析?
  2. 久坐 缺乏运动 消化能力 会减弱
  3. 说说云盘背后的黑科技!
  4. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
  5. 推流地址 java_Java实现腾讯云直播生成推流地址和播放地址
  6. Android——实现欢迎界面的自动跳转(转)
  7. 2016年工作总结和计划
  8. 终于,我也到了和 Eclipse 说再见的时候,难说再见
  9. python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?
  10. 图像超分辨率也能改善天气预报?没错!
  11. linux环境下装mq,ActiveMQ下载与安装(Linux环境下进行)
  12. 如何让强化学习走进现实世界?DeepMind要用“控制套件”推动
  13. opencv之解决无法从“cv::Mat”转换为“IplImage”
  14. paip.调用GUI接口.
  15. 归并排序递归实现迭代实现
  16. Week 2 Sequence Labelling
  17. 掘金新石油:金融知识图谱数据建模实战分享
  18. 气体流量与质量流率换算
  19. 《东周列国志》第三十五回 晋重耳周游列国 秦怀嬴重婚公子
  20. AD7606系列ADC的相关内容

热门文章

  1. 读书笔记-干法-付出不亚于任何人的努力!
  2. keil 调试指针不跳转 0x00000000 0000 MOVS r0,r0 解决方案
  3. 财报出炉,阿里大涨的背后 —— 凤凰终将涅槃?
  4. 如何让你的技术团队成员自觉工作
  5. 单细胞文章专列——细胞图谱
  6. Photoshop实用的快捷键大全
  7. oracle pdb与cdb区别,浅谈oracle 12C的新特性-CDB和PDB
  8. 【转】全球十部最经典的科幻片,你看过几部?
  9. 2022年11月(下半年)信息系统项目管理师考试-综合知识真题及解析
  10. office计算机高级应用,Office办公软件高级应用(大学计算机二级考试标准教程)...