JS贪吃蛇

Js实现贪吃蛇小游戏。

程序解析:

	画表格,画出相对应大小的表格速度的快慢调节随机生成事物的位置使用键盘的方向键控制移动位置当贪吃蛇碰到四周游戏结束,弹框显示

效果演示
在这里插入图片描述

代码演示

html内容

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title></head><body><div id="pannel" style="margin-bottom: 10px;"></div><select id="selSize"><option value="20">20*20</option><option value="30">30*30</option><option value="40">40*40</option></select><select id="selSpeed"><option value="500">速度-慢</option><option value="250" selected="selected">速度-中</option><option value="100">速度-快</option></select><input type="button" id="btnStart" value="开始" /></body>
</html>

css内容

 #pannel table {border-collapse: collapse;}#pannel table td {border: 1px solid #808080;width: 10px;height: 10px;font-size: 0;line-height: 0;overflow: hidden;}#pannel table .snake {background-color: green;}#pannel table .food {background-color: blue;}

js内容

<script type="text/javascript">var Direction = new function() {this.UP = 38;this.RIGHT = 39;this.DOWN = 40;this.LEFT = 37;};var Common = new function() {this.width = 20; /*水平方向方格数*/this.height = 20; /*垂直方向方格数*/this.speed = 250; /*速度 值越小越快*/this.workThread = null;};var Main = new function() {var control = new Control();window.onload = function() {control.Init("pannel");/*开始按钮*/document.getElementById("btnStart").onclick = function() {control.Start();this.disabled = true;document.getElementById("selSpeed").disabled = true;document.getElementById("selSize").disabled = true;};/*调速度按钮*/document.getElementById("selSpeed").onchange = function() {Common.speed = this.value;}/*调大小按钮*/document.getElementById("selSize").onchange = function() {Common.width = this.value;Common.height = this.value;control.Init("pannel");}};};/*控制器*/function Control() {this.snake = new Snake();this.food = new Food();/*初始化函数,创建表格*/this.Init = function(pid) {var html = [];html.push("<table>");for (var y = 0; y < Common.height; y++) {html.push("<tr>");for (var x = 0; x < Common.width; x++) {html.push('<td id="box_' + x + "_" + y + '"> </td>');}html.push("</tr>");}html.push("</table>");this.pannel = document.getElementById(pid);this.pannel.innerHTML = html.join("");};/*开始游戏 - 监听键盘、创建食物、刷新界面线程*/this.Start = function() {var me = this;this.MoveSnake = function(ev) {var evt = window.event || ev;me.snake.SetDir(evt.keyCode);};try {document.attachEvent("onkeydown", this.MoveSnake);} catch (e) {document.addEventListener("keydown", this.MoveSnake, false);}this.food.Create();Common.workThread = setInterval(function() {me.snake.Eat(me.food);me.snake.Move();}, Common.speed);};}/*蛇*/function Snake() {this.isDone = false;this.dir = Direction.RIGHT;this.pos = new Array(new Position());/*移动 - 擦除尾部,向前移动,判断游戏结束(咬到自己或者移出边界)*/this.Move = function() {document.getElementById("box_" + this.pos[0].X + "_" + this.pos[0].Y).className = "";//所有 向前移动一步 for (var i = 0; i < this.pos.length - 1; i++) {this.pos[i].X = this.pos[i + 1].X;this.pos[i].Y = this.pos[i + 1].Y;}//重新设置头的位置 var head = this.pos[this.pos.length - 1];switch (this.dir) {case Direction.UP:head.Y--;break;case Direction.RIGHT:head.X++;break;case Direction.DOWN:head.Y++;break;case Direction.LEFT:head.X--;break;}this.pos[this.pos.length - 1] = head;//遍历画蛇,同时判断游戏结束 for (var i = 0; i < this.pos.length; i++) {var isExits = false;for (var j = i + 1; j < this.pos.length; j++)if (this.pos[j].X == this.pos[i].X && this.pos[j].Y == this.pos[i].Y) {isExits = true;break;}if (isExits) {this.Over(); /*咬自己*/break;}var obj = document.getElementById("box_" + this.pos[i].X + "_" + this.pos[i].Y);if (obj) obj.className = "snake";else {this.Over(); /*移出边界*/break;}}this.isDone = true;};/*游戏结束*/this.Over = function() {clearInterval(Common.workThread);alert("游戏结束!");}/*吃食物*/this.Eat = function(food) {var head = this.pos[this.pos.length - 1];var isEat = false;switch (this.dir) {case Direction.UP:if (head.X == food.pos.X && head.Y == food.pos.Y + 1) isEat = true;break;case Direction.RIGHT:if (head.Y == food.pos.Y && head.X == food.pos.X - 1) isEat = true;break;case Direction.DOWN:if (head.X == food.pos.X && head.Y == food.pos.Y - 1) isEat = true;break;case Direction.LEFT:if (head.Y == food.pos.Y && head.X == food.pos.X + 1) isEat = true;break;}if (isEat) {this.pos[this.pos.length] = new Position(food.pos.X, food.pos.Y);food.Create(this.pos);}};/*控制移动方向*/this.SetDir = function(dir) {switch (dir) {case Direction.UP:if (this.isDone && this.dir != Direction.DOWN) {this.dir = dir;this.isDone = false;}break;case Direction.RIGHT:if (this.isDone && this.dir != Direction.LEFT) {this.dir = dir;this.isDone = false;}break;case Direction.DOWN:if (this.isDone && this.dir != Direction.UP) {this.dir = dir;this.isDone = false;}break;case Direction.LEFT:if (this.isDone && this.dir != Direction.RIGHT) {this.dir = dir;this.isDone = false;}break;}};}/*食物*/function Food() {this.pos = new Position();/*创建食物 - 随机位置创建立*/this.Create = function(pos) {document.getElementById("box_" + this.pos.X + "_" + this.pos.Y).className = "";var x = 0,y = 0,isCover = false;do {x = parseInt(Math.random() * (Common.width - 1));y = parseInt(Math.random() * (Common.height - 1));isCover = false;if (pos instanceof Array) {for (var i = 0; i < pos.length; i++) {if (x == pos[i].X && y == pos[i].Y) {isCover = true;break;}}}} while (isCover);this.pos = new Position(x, y);document.getElementById("box_" + x + "_" + y).className = "food";};}function Position(x, y) {this.X = 0;this.Y = 0;if (arguments.length >= 1) this.X = x;if (arguments.length >= 2) this.Y = y;}</script>

了解更多关注我哟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有bug队——加贝——Python 练习实例 3,4

3.题目&#xff1a; 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 程序分析&#xff1a; 假设该数为 x。 1、则&#xff1a;x 100 n2, x 100 168 m2 2、计算等式&#xff1a;m2 …

lcd4linux 1602,详解一种LCD1602 的4线接法

描述虽然LCD1602的显示屏幕与显示字符都较小&#xff0c;实用性并不强&#xff0c;但是在一般的教学实验中&#xff0c;它仍不失为一个常用的输出显示设备。LCD1602与单片机连接的线路共有11条&#xff0c;其中有8条数据线&#xff0c;3条控制线。如果把它们都连接上&#xff0…

没有bug队——加贝——Python 练习实例 5,6

目录 5.题目&#xff1a; 6.题目&#xff1a; 5.题目&#xff1a; 输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后再…

MATLAB教程(1) MATLAB 基础知识(1)

第一部分&#xff1a;MATLAB显示桌面的基本布局 桌面基础知识- MATLAB & Simulink- MathWorks 中国 1.启动MATLAB后&#xff0c;桌面会显示默认布局&#xff0c;主要有以下三个部分&#xff1a; 当前文件夹命令行窗口工作空间 2.在MATLAB中一般需要创建变量和调用函数。…

【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域&#xff08;MSER&#xff09; 1. 最大稳定极值区域&#xff08;MSER&#xff09; 最大稳定极值区域&#xff08;MSER-Maximally Stable Extremal Regions&#xf…

电脑蹦迪

如何建立一个小程序让你的电脑蹦迪的呢&#xff1f; 效果演示 1.首先在桌面新建一个记事本 2.在里面添加如下代码 color 1A echo 电脑color 1B echo 电脑color 1C echo 电脑color 1D echo 电脑echo %0 3.保存记事本文件 4.修改后对名为.bat之后点击运行即可。

MATLAB教程(1) MATLAB 基础知识(2)

第三部分&#xff1a;数组的索引 数组索引- MATLAB & Simulink- MathWorks 中国 MATLAB中的每一个变量都是可以存储多个值的数组。如果想要使用数组中的某一个值&#xff0c;则需要用到索引。 1.单个元素的索引 从一个数组中索引某个元素一般有两种方法&#xff1a; 第…

没有bug队——加贝——Python 练习实例 7,8

7.题目&#xff1a; 将一个列表的数据复制到另一个列表中。 程序分析&#xff1a;使用列表[:]。 注&#xff1a;[:] 表示索引全部&#xff1b;[1:]表示从索引1到最后&#xff1b;[:2]表示从第一个索引到索引2前一个 a [1, 2, 3] b1 a[:] b2 a[1:] b3 a[:2] print (b1) …

云动画文字

用Js技术实现云动画文字。 效果演示 代码展示 html内容 <!doctype html> <html><head><meta charset"utf-8"><title></title><style>body {background-color:#000000;color:#555555; } h4 {font-family:sans-serif;co…

爬虫之祖urlib 简易教程

目录 一、前言框架 二、网址请求 2.1 打开网址 2.2 超时设置 2.3 错误抓取 三、更深请求 3.1 打开网址 3.2 请求头添加 3.3 链接解析 四、Robots 协议 五.万能视频下载 小彩蛋 一、前言框架 我们来学一下爬虫之祖urlib&#xff0c;不管你什么模块都是起源于该模块。…

【youcans 的 OpenCV 学习课】12. 彩色图像的处理

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】12.彩色图像的处理 文章目录【youcans 的 OpenCV 学习课】12.彩色图像的处理1. 图像的颜色空间转换图像的色彩空间基础图像的颜色空…

炫酷线条背景动画

使用H5的Canvas实现网页的炫酷线条背景特效。 效果演示 代码展示 html内容 <!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <title></title><style> canvas{position:absolute;top:0;left:0;background-colo…

MATLAB教程(1) MATLAB 基础知识(3)

第五部分&#xff1a;文本和字符 文本和字符- MATLAB & Simulink- MathWorks 中国 在处理文本时&#xff0c;将其中的字符序列用单引号括起来&#xff0c;可以将文本分配给变量。 例如&#xff1a;myText Hello, world如果文本本身包括一个单引号&#xff0c;则在定义时…

没有bug队——加贝——Python 练习实例 9,10

9.题目&#xff1a; 暂停一秒输出。 程序分析&#xff1a;使用 time 模块的 sleep() 函数。 注&#xff1a;dict.items表示取出字典中的值 代码&#xff1a; #9 import timemyD {1: a, 2: b} for key, value in dict.items(myD):print (key, value)time.sleep(1) # 暂停 …

Spring Boot Data JPA

Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能。 Spring Data JPA提供的接口 Repository&#xff1a;最顶层的接口&#xff0c;是一个空的接口&#xff0c;目的是为了统一所有Repository的类型&#xff0c;且能让组件扫描的时候自动识别。 CrudRep…

MATLAB教程(1) MATLAB 基础知识(4)

第七部分&#xff1a;二、三维图 二维图和三维图- MATLAB & Simulink- MathWorks 中国 折线图 &#xff08;1&#xff09; 画图 x 0:pi/1000:2*pi; y sin(x); plot(x,y) 这里x就用到了前面说到的索引。x表示0到2*pi之间步长为pi/100的值。 二维图如下&#xff1a; 这里…

现在能不能升级鸿蒙,能不能升级鸿蒙系统?

电梯直达huafen185613402初窥门径发表于 2021-2-28 14:28:33来自&#xff1a;华为Mate 10 Pro最新回复 2021-2-28 17:34:28这个手机现在性能还非常好呀&#xff0c;期待能够给予鸿蒙系统升级产品型号BLA-AL00出现频率总是问题类型其他应用名称Android 系统应用版本10系统版本BL…

Spring Boot MyBatis

MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache 迁移到了google code&#xff0c;并且改名为MyBatis 。 集成spring boot 的时候必须在mapper接口上面标注Mapper注解 项目图片 pom.xml 只需要在pom.xml引入需要的数据库配置&#xff0c;就会…

没有bug队——加贝——Python 练习实例 11,12

11.题目&#xff1a; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 程序分析&#xff1a;兔子的规律为…

Spring Boot JDBC

JDBC详解 Java Data Base Connectivity,是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。不管是Hibernate&#xff0c;还是JPA或者MyBatis都是对JDBC做了一次封装。 Spring简化了JDBC那些内…