简单的贪吃蛇小游戏。使用的是纯原生 JavaScript 和 HTML ,CSS
这个小游戏是一时兴起。在暑假时写的 。不过当时还比较简陋。
后来开学后 。还没上课。就又拿出来改了改界面。让它看起来更美观,更像贪吃蛇一些。
先展示展示几张图吧。
开始前
开始咯
吃了些小老鼠后:
撞墙或撞到自己后
当时去做这个时,可能是突然的一个想法。但并不是要做一个完整的游戏出来。
所以这里并没有设置关卡模式有些细节也并不关注 。只是去关注了身体移动,吃食物,成长这些主要的问题。
当然,这些主要问题解决,增加其他功能就不是大问题了。
这里我就先说一下我的思路,有兴趣和想法的同学们可以自己先去尝试尝试,或者可以跟我交流交流。
我的思路
身体怎么移动
这是我第一个思考的问题。
我先想,如果只有一个身体节点,也就是一个小圆 。应该怎么去移动。控制方向。
当然这个就简单了。我们先定义一个变量,保存移动方向 。 再定义一个函数,根据方向控制节点的定时移动。 然后监听键盘点击事件。改变方向就可以了。
那么如果有多个节点呢?显然每个节点都使用一个函数去控制它移动是不切实际的。
我们可以联想到火车的节点,转哪由车头驾驶员控制。后面跟着跑就行了
那么蛇身体的其他节点也是同样。它不需要知道方向,它要做的很简单,就是前一个节点在哪,它走了,我就移动到它的位置就可以了。
那么除了头部,其他的节点通过一个跟屁股走的函数
就可以完成移动了。
身体怎么成长
成长是在吃到食物后。仅判断一下头节点是否于食物节点位置重合即可。
身体成长还是比较简单的,也就是在尾部增加一个身体节点,但不是一吃到食物就变长。而是原本的最后一个节点移开后再边长。出现的位置顶替了原最后节点的位置。
怎么判断死亡
这个问题也是比较简单的,也是判断头部节点位置的问题。主要撞到自己,也就是与身体的某部位的位置重合或者与墙壁的位置重合了,就结束游戏即可。
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()">开 始</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相关推荐
- STM32+LCD实现简单的贪吃蛇小游戏
寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...
- Python 简单实现贪吃蛇小游戏
文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...
- android 简单的贪吃蛇小游戏
贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...
- 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)
分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象) 食物对象(food) 蛇对象(snake) 游戏对象(game) 1.food对象 属性 :x, y, ...
- QT实现简单的贪吃蛇小游戏
一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...
- python简易贪吃蛇小游戏任务书含代码
目 录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...
- python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单
贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...
- 基于C语言Ncurse库和链表的简单贪吃蛇小游戏
参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...
- C# 制作贪吃蛇小游戏,最简单的实现
C# 制作贪吃蛇小游戏 目录 画蛇 实现蛇的上下左右移动 随机生成目标物 开始游戏 计分 重新开始 增加难度 死亡判定 1.1 画蛇的一节 Class Element()Graphics g;publ ...
- Python实现贪吃蛇小游戏(双人模式)
这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...
最新文章
- R语言 、Excel哪个更能胜任数据分析?
- 久坐 缺乏运动 消化能力 会减弱
- 说说云盘背后的黑科技!
- HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
- 推流地址 java_Java实现腾讯云直播生成推流地址和播放地址
- Android——实现欢迎界面的自动跳转(转)
- 2016年工作总结和计划
- 终于,我也到了和 Eclipse 说再见的时候,难说再见
- python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?
- 图像超分辨率也能改善天气预报?没错!
- linux环境下装mq,ActiveMQ下载与安装(Linux环境下进行)
- 如何让强化学习走进现实世界?DeepMind要用“控制套件”推动
- opencv之解决无法从“cv::Mat”转换为“IplImage”
- paip.调用GUI接口.
- 归并排序递归实现迭代实现
- Week 2 Sequence Labelling
- 掘金新石油:金融知识图谱数据建模实战分享
- 气体流量与质量流率换算
- 《东周列国志》第三十五回 晋重耳周游列国 秦怀嬴重婚公子
- AD7606系列ADC的相关内容
热门文章
- 读书笔记-干法-付出不亚于任何人的努力!
- keil 调试指针不跳转 0x00000000 0000 MOVS r0,r0 解决方案
- 财报出炉,阿里大涨的背后 —— 凤凰终将涅槃?
- 如何让你的技术团队成员自觉工作
- 单细胞文章专列——细胞图谱
- Photoshop实用的快捷键大全
- oracle pdb与cdb区别,浅谈oracle 12C的新特性-CDB和PDB
- 【转】全球十部最经典的科幻片,你看过几部?
- 2022年11月(下半年)信息系统项目管理师考试-综合知识真题及解析
- office计算机高级应用,Office办公软件高级应用(大学计算机二级考试标准教程)...