前提:游戏玩腻了?作为一名合格的程序员,应该自己开发小游戏来玩,玩腻了,自己就再去开发个游戏,利用这一特点实现永动机。既可以学习,也可以娱乐。

本次开发的是贪吃蛇小游戏。使用技术:html、css、原生js、部分es6语法

贪吃蛇实现原理:利用绝对定位的left和top来小蛇进行移动

开发游戏的思路:

  1. 首先在页面上放一个大的盒子(box),加上border,相当于一个围栏。这个大盒子就是游戏区域。
  2. 在box中,又四个盒子,2个body盒子作为蛇的身体(初始长度为2),snake作为蛇头部,food作为食物。
  3. 将蛇的身体的第一段放在left:0;right:0这个位置,第二段向右偏移50px(因为蛇的一段身体的宽高是50*50),蛇的头部向右偏移100px。这就是蛇的初始位置。
  4. 蛇的移动:我们要知道,蛇的身体是跟着蛇的方向来移动的。我们可以通过移动蛇头,然后利用循环或者递归来使蛇的一段段身体来移动(就是第一段身体移动到蛇头的位置,第二段身体移动到第一段身体的位置),为了防止蛇的身体和头部的位置重叠,我们就从最后一段开始移动,而不是使蛇头先移动。
  5. 食物的随机出现:因为我蛇每次移动都是50px,所以食物的left和top位置都是50的倍数(0-1000中),Math.floor(Math.random() * 20) * 50就是取50的倍数,范围是0-1000.
  6. 判断蛇有没有撞到身体或者吃到食物或者撞到墙:就利用蛇头的left和top跟他们比较,如果相等就撞到获取吃到食物。
  7. 自动移动:利用时间间隔函数。
  8. 其他的功能:代码注释都有详细说明,如果还有不懂的可以评论或者私信我!
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title></title><style>* {padding: 0;margin: 0;}.box {position: relative;width: 1000px;height: 1000px;margin: 50px auto;border: 1px solid red;}.snake {position: absolute;width: 50px;height: 50px;background-color: red;}.food {position: absolute;top: 100px;left: 100px;width: 50px;height: 50px;background-color: pink;}.body {position: absolute;top: 0;left: 0;width: 50px;height: 50px;background-color: green;}</style>
</head><body><div class="box"><div class="body"></div><!--由于two的style样式使用dom.style获取不到,就写到了行内样式中--><div class="body" id="two" style="top:0px;left:50px"></div><div class="snake"></div><div class="food"></div></div>
</body>
<script src="./贪吃蛇.js"></script></html>
class Snake {constructor() {this.snake = document.querySelector('.snake')this.food = document.querySelector('.food')this.bodys = document.querySelectorAll('.body')this.top = 0this.left = 100this.lastTop = '' //记录蛇身体最后一段的topthis.lastLeft = '' //记录蛇身体最后一段的leftthis.lastBody = null //蛇的最后一段,没吃到食物为nullthis.snakeMoveByAuto = nullthis.init()}// 初始化init () {this.snake.style.top = this.top + 'px'this.snake.style.left = this.left + 'px'this.foodAppearByRandom()// 监听键盘的事件document.querySelector('body').onkeydown = (e) => {clearInterval(this.snakeMoveByAuto)switch (e.keyCode) {case 87:  //w键this.snakeMoveByAuto = setInterval(() => this.snakeMove(-50, 0), 500)break;case 65: // a键this.snakeMoveByAuto = setInterval(() => this.snakeMove(0, -50), 500)break;case 83:  // s键this.snakeMoveByAuto = setInterval(() => this.snakeMove(50, 0), 500)break;case 68: // d键this.snakeMoveByAuto = setInterval(() => this.snakeMove(0, 50), 500)break;}}}// 食物随机出现foodAppearByRandom () {let length = this.bodys.lengththis.food.style.top = Math.floor(Math.random() * 20) * 50 + 'px'this.food.style.left = Math.floor(Math.random() * 20) * 50 + 'px'// 防止食物刷新在同一位置if (this.snake.style.top === this.food.style.top && this.snake.style.left === this.food.style.left) {this.foodAppearByRandom()}// 防止食物刷新在蛇身上for (var i = 0; i < length; i++) {if (this.food.style.top === this.bodys[i].style.top && this.food.style.left === this.bodys[i].style.left) {this.foodAppearByRandom()}}}// 移动蛇位置snakeMove (top, left) {let newTop = parseInt(this.snake.style.top.slice(0, -2)) + toplet newLeft = parseInt(this.snake.style.left.slice(0, -2)) + leftlet length = this.bodys.length// 阻止蛇走出方框// 因为盒子的宽高是50px,就各自减50if (newTop < 0 || newTop > 950 || newLeft < 0 || newLeft > 950) {clearInterval(this.snakeMoveByAuto)alert('gg')window.location.reload()return}// 让蛇身体后一个跟着前一个移动for (var i = 0; i < length - 1; i++) {console.log(this.bodys[i + 1].style.left)this.bodys[i].style.left = this.bodys[i + 1].style.leftthis.bodys[i].style.top = this.bodys[i + 1].style.top}// 让蛇身体的最后部分跟着蛇的头移动this.bodys[length - 1].style.top = this.snake.style.topthis.bodys[length - 1].style.left = this.snake.style.left// 让蛇的头部移动this.snake.style.top = newTop + 'px'this.snake.style.left = newLeft + 'px'// 蛇吃到食物if (this.snake.style.top === this.food.style.top && this.snake.style.left === this.food.style.left) {this.lastTop = this.bodys[0].style.topthis.lastLeft = this.bodys[0].style.leftthis.foodAppearByRandom()this.snakeChangeBig()}// 循环判断蛇有没有撞到自己的身体for (var i = 0; i < length; i++) {if (this.snake.style.top === this.bodys[i].style.top && this.snake.style.left === this.bodys[i].style.left) {clearInterval(this.snakeMoveByAuto)alert('gg')window.location.reload()}}}// 蛇吃到食物变大snakeChangeBig () {// 创建蛇身体最后一段this.lastBody = document.createElement('div')this.lastBody.className = 'body'this.lastBody.style.top = this.lastTopthis.lastBody.style.left = this.lastLeftdocument.querySelector('.box').prepend(this.lastBody)// 因为添加了蛇的最后一段,所以要更新this.bodysthis.bodys = document.querySelectorAll('.body')}
}var snake = new Snake()

游戏操作:使用键盘的wasd来控制方向。
GitHub项目:https://github.com/wa545464/H5-

小白运行教程:
创建一个html文件,html文件内容如下,然后用浏览器打开该html文件:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title></title><style>* {padding: 0;margin: 0;}.box {position: relative;width: 1000px;height: 1000px;margin: 50px auto;border: 1px solid red;}.snake {position: absolute;width: 50px;height: 50px;background-color: red;}.food {position: absolute;top: 100px;left: 100px;width: 50px;height: 50px;background-color: pink;}.body {position: absolute;top: 0;left: 0;width: 50px;height: 50px;background-color: green;}</style>
</head><body><div class="box"><div class="body"></div><!--由于two的style样式使用dom.style获取不到,就写到了行内样式中--><div class="body" id="two" style="top:0px;left:50px"></div><div class="snake"></div><div class="food"></div></div>
</body>
<script>
class Snake {constructor() {this.snake = document.querySelector('.snake')this.food = document.querySelector('.food')this.bodys = document.querySelectorAll('.body')this.top = 0this.left = 100this.lastTop = '' //记录蛇身体最后一段的topthis.lastLeft = '' //记录蛇身体最后一段的leftthis.lastBody = null //蛇的最后一段,没吃到食物为nullthis.snakeMoveByAuto = nullthis.init()}// 初始化init () {this.snake.style.top = this.top + 'px'this.snake.style.left = this.left + 'px'this.foodAppearByRandom()// 监听键盘的事件document.querySelector('body').onkeydown = (e) => {clearInterval(this.snakeMoveByAuto)switch (e.keyCode) {case 87:  //w键this.snakeMoveByAuto = setInterval(() => this.snakeMove(-50, 0), 500)break;case 65: // a键this.snakeMoveByAuto = setInterval(() => this.snakeMove(0, -50), 500)break;case 83:  // s键this.snakeMoveByAuto = setInterval(() => this.snakeMove(50, 0), 500)break;case 68: // d键this.snakeMoveByAuto = setInterval(() => this.snakeMove(0, 50), 500)break;}}}// 食物随机出现foodAppearByRandom () {let length = this.bodys.lengththis.food.style.top = Math.floor(Math.random() * 20) * 50 + 'px'this.food.style.left = Math.floor(Math.random() * 20) * 50 + 'px'// 防止食物刷新在同一位置if (this.snake.style.top === this.food.style.top && this.snake.style.left === this.food.style.left) {this.foodAppearByRandom()}// 防止食物刷新在蛇身上for (var i = 0; i < length; i++) {if (this.food.style.top === this.bodys[i].style.top && this.food.style.left === this.bodys[i].style.left) {this.foodAppearByRandom()}}}// 移动蛇位置snakeMove (top, left) {let newTop = parseInt(this.snake.style.top.slice(0, -2)) + toplet newLeft = parseInt(this.snake.style.left.slice(0, -2)) + leftlet length = this.bodys.length// 阻止蛇走出方框// 因为盒子的宽高是50px,就各自减50if (newTop < 0 || newTop > 950 || newLeft < 0 || newLeft > 950) {clearInterval(this.snakeMoveByAuto)alert('gg')window.location.reload()return}// 让蛇身体后一个跟着前一个移动for (var i = 0; i < length - 1; i++) {console.log(this.bodys[i + 1].style.left)this.bodys[i].style.left = this.bodys[i + 1].style.leftthis.bodys[i].style.top = this.bodys[i + 1].style.top}// 让蛇身体的最后部分跟着蛇的头移动this.bodys[length - 1].style.top = this.snake.style.topthis.bodys[length - 1].style.left = this.snake.style.left// 让蛇的头部移动this.snake.style.top = newTop + 'px'this.snake.style.left = newLeft + 'px'// 蛇吃到食物if (this.snake.style.top === this.food.style.top && this.snake.style.left === this.food.style.left) {this.lastTop = this.bodys[0].style.topthis.lastLeft = this.bodys[0].style.leftthis.foodAppearByRandom()this.snakeChangeBig()}// 循环判断蛇有没有撞到自己的身体for (var i = 0; i < length; i++) {if (this.snake.style.top === this.bodys[i].style.top && this.snake.style.left === this.bodys[i].style.left) {clearInterval(this.snakeMoveByAuto)alert('gg')window.location.reload()}}}// 蛇吃到食物变大snakeChangeBig () {// 创建蛇身体最后一段this.lastBody = document.createElement('div')this.lastBody.className = 'body'this.lastBody.style.top = this.lastTopthis.lastBody.style.left = this.lastLeftdocument.querySelector('.box').prepend(this.lastBody)// 因为添加了蛇的最后一段,所以要更新this.bodysthis.bodys = document.querySelectorAll('.body')}
}var snake = new Snake()
</script></html>

疫情在家游戏玩腻了?那就一起来开发H5小游戏吧相关推荐

  1. 小游戏开发 小程序app游戏开发 H5小游戏开发

    目前有很多人对小游戏的理解都不同,有的人认为小游戏是H5嵌入形式的,也有的人认为小游戏是就几兆的程序 其实大家认为的都是正确的,没有任何问题.那么今天给大家讲下小游戏之间的区别 1.H5小游戏嵌入:这 ...

  2. Hilo开发H5小游戏踩坑笔记

    第一次开发小游戏,用的是Hilo框架.由于项目开发时间比较紧张,对游戏和CANVAS都没有了解过.代码虽然写的很烂,但是还是记录下踩过的坑吧!本文为碎碎念模式,并不深入,写错的地方希望多多指点. 一. ...

  3. 基于js原生算法+cocos游戏引擎+uni框架Cloud托管网页:开发2048小游戏域名发布版本

    目录 首先看一下效果图 CocosCreator游戏引擎 block绑定: canvas绑定: cocos中创建脚本js以及js原生算法 然后我们先看game.js 背景方法及包含的原生算法代码: 开 ...

  4. Egret 开发H5小游戏

    Egret Wing 代码编辑器 ResDepot 静态资源加载器 项目目录主要构成:resource文件夹下的新建的游戏文件(用于存放图片,音频和json文件等资源).新建游戏同名的 .ts 文件( ...

  5. 微信H5小游戏互动营销的使用场景

    H5游戏营销的定义是借助小游戏通过微信渠道运营推广的形式,而且H5小游戏营销成本低,同时满足于用户碎片化时间,通过用户间裂变传播的形式为企业或品牌带来更多的流量和收益!今天就为大家列举下H5游戏定制开 ...

  6. h5小游戏制作开发大概要多久,微信h5的游戏开发成本有多少?

    国内有很多商家在用h5的游戏做营销,诸如TOM游戏等出色的开发商也脱颖而出,成为了H5小游戏定制领域的翘楚,本期我们借助TOM游戏,分析一款h5小游戏制作开发大概要多久,微信h5的游戏开发成本有多少, ...

  7. Unity3d C# 开发微信小游戏分享图片、朋友圈等功能实现(含源码)

    广告 通过一段时间的基于minigame-unity-webgl-transform插件的开发,算是稍微完整的一小个游戏已经制作完成,具体大家可以扫码体验一下: 感谢支持!! 前言 之前编写了一篇u3 ...

  8. h5小游戏在线玩:万圣节互动游戏《逃离禁闭岛》通关完全攻略

    最近有好多玩家跟我私信留言,让TOM游戏小编快点分享下H5密室逃脱游戏<逃离禁闭岛>的攻略,小编通过整晚的努力终于玩通关了,说实话还是蛮烧脑的,让我体验了一次别样的穿越之旅,话不多说,这就 ...

  9. 4399玩过的服务器找不到了,4399小游戏:曾经玩到忘记吃饭了,为何如今有时间也不玩了?...

    原标题:4399小游戏:曾经玩到忘记吃饭了,为何如今有时间也不玩了? 大家好,我是小瑞子! 4399小游戏是一个网站平台,这个平台里面有着无数个大大小小的小游戏,各种各样类型的游戏都有,单人双人三人四 ...

最新文章

  1. Redis info参数总结
  2. Angular jasmine单元测试框架里describe的实现原理
  3. Opencv4.5.5 + Opencv4.5.5_contrib 图像拼接
  4. mysql 查询排序位置_MySQL-基础查询与排序
  5. Google 发布开源库 TFQ,快速建立量子机器学习模型!
  6. 掘金后端 mysql优化_vue服务端渲染项目(ssr)仿掘金、后台页面是react spa、服务层nodejs、koa、mysql编写的一套多权限内容管理系统...
  7. 计算机html基础试题与答案,2019年大学计算机基础试题题库及答案.docx
  8. configparser读取含有中文的配置(Windows)
  9. GFlags使用文档
  10. 计算机组成原理——输入/输出系统(I/O接口外设中断)
  11. linux cpu 时间,【Linux】CPU时间与处理器耗时
  12. 淘宝信誉查询软件 官网免费版
  13. 中阿博览会搭建丝路新平台 共享中阿企业发展新机遇
  14. 牵手网红城市重庆 鲲鹏生态不止“打卡”这么简单
  15. jspseverlet学习笔记
  16. 事实表的分类:事务事实表,周期快照事实表,累计快照事实表
  17. 浅谈艺工结合——自然科学和艺术美学的链接融合
  18. dd命令生成随机大小的二进制文件
  19. NVIDIA Jetson TK1学习与开发——JETPACK自动刷机
  20. 亚马逊云科技:一杯好牛奶背后的AI引擎

热门文章

  1. 如何解除Word限制编辑(转载+亲自实践)
  2. 【面试问题总结】zj5
  3. 普通的照片,如何在线快速制作自己的证件照
  4. CP56time2a
  5. 项目三 电梯控制器设计(FPGA综合应用设计)
  6. 使用内存安全工具提升应用质量和安全性
  7. wampserver中文版 附安装教程
  8. search - indexOf区别
  9. 工业品销售找客户的方法 工业销售获客渠道
  10. 线性代数学习笔记(十一)——特殊矩阵