纯原生js实现贪吃蛇游戏


Posted in Javascript onApril 16, 2020

本文实例为大家分享了js实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>贪吃蛇游戏</title>

<style type="text/css">
* {
 margin: 0;
 padding: 0;
}

.wrap {
 width: 600px;
 margin: 0 auto;
 position: relative;
}

p {
 position: absolute;
 left: 65%;
 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;
 border-radius: 5px;
}

#Start,#Refresh,#Speed {
 border: 1px solid skyblue;
 background: skyblue;
 color: white;
 width: 50px;
 height: 30px;
 border-radius: 5px;
 margin-left: 15px;
}
</style>


</head>
 <body>
 <div class="wrap">
 <h1>贪吃蛇游戏</h1>
 <!-- 记录吃了多少个蛋 -->
 <p style="font-size:20px;color:red"> score:<span id="score" style="color:black">0</span> </p>
 <!-- 暂停按钮 -->
 <input id="Pause" type="button" name="name" value="Pause">
 <!-- 开始按钮 -->
 <input id="Start" type="button" name="name" value="Start">
 <!-- 刷新(重新开始游戏) -->
 <input id="Refresh" type="button" name="name" value="Refresh">
 <!-- 加速按钮 -->
 <input id="Speed" type="button" name="name" value="Speed">
 <!-- 贪吃蛇的行走路径地图 -->
 <div id="snake_map">

 </div>
 </div>
 </body>


<script type="text/javascript">
//获取分数标签
var score = document.getElementById('score');
// 获取路径地图标签
var map = document.getElementById('snake_map');
// 为了灵活的设置地图的大小,以下设置两个变量
// 用于存储行数和列数(即方格的个数)
var rowNumber = 25;// 行数
var columnNumber = 20;// 列数;
var mapWidth = columnNumber * 20 + 'px';// 地图的宽
var mapHeight = rowNumber * 20 + 'px';// 地图的高
map.style.width = mapWidth;
map.style.height = mapHeight;// 设置地图宽高
// 创建一个二维数组,用来记录地图上的所有div的位置
var snakeDIVPosition = [];
// 通过双层for循环来创建地图元素
for ( var i = 0; i < rowNumber; i++) {
 // 创建行div
 var rowDIV = document.createElement('div');
 // 设置div样式
 rowDIV.className = 'row';
 // 将行div添加到路径地图map中
 map.appendChild(rowDIV);
 // 创建一个行级数组,用来存储当前行中的每个方块div
 var rowArray = [];
 for ( var j = 0; j < columnNumber; j++) {
 // 创建每一行中的方块div
 var columnDIV = document.createElement('div');
 // 设置css样式
 columnDIV.className = 'col';
 // 将方块DIV添加到当前行中
 rowDIV.appendChild(columnDIV);
 // 同时将方块添加到行数组中
 rowArray.push(columnDIV);
 }
 // 当前内层循环结束,将行数组添加到二维数组中
 snakeDIVPosition.push(rowArray);
}

// 创建蛇模型
// 创建一个一维数组,用来存储蛇身所占的div
var snake = [];
// 固定蛇身起始长度为3个div
for ( var i = 0; i < 3; i++) {
 // 为蛇身设置不同颜色的div
 snakeDIVPosition[0][i].className = 'col activeSnake';
 // 存储在蛇身数组中
 snake[i] = snakeDIVPosition[0][i];
}
// 定义变量来控制蛇
var x = 2;
var y = 0;// 蛇头的起始位置偏移量
var scoreCount = 0;// 分数计数器,即吃了多少个蛋
var eggX = 0;// 记录蛋所在的行位置
var eggY = 0;// 记录蛋所在的列位置;

var direction = 'right';// 记录蛇移动的方向,初始为向右
var changeDir = true;// 判断是否需要改变蛇的移动方向
var delayTimer = null;// 延迟定时器

// 添加键盘事件监听方向键来改变蛇的移动方向
document.onkeydown = function(event) {
 // 先判断是否需要改变方向,true表示需要,false表示不需要
 if (!changeDir) {
 return;// return空表示直接结束函数,后续代码不执行
 }
 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;
 }
 // 我们通过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 ( var 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]);
 };
};

var 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

var pause = document.getElementById('Pause');
var start = document.getElementById('Start');
var refresh = document.getElementById('Refresh');
var speed = document.getElementById('Speed');
// 添加暂停按钮
pause.onclick = function() {
 clearInterval(moveTimer);
};
// 添加开始按钮
start.onclick = function() {
 clearInterval(moveTimer);
 moveTimer = setInterval('snakeMove()', speed1);
};
// 添加刷新按钮
refresh.onclick = function() {
 window.location.reload();
};
// 添加加速按钮
var speed1 = 300;
speed.onclick = function() {
 speed1 -= 20;
 clearInterval(moveTimer);
 moveTimer = setInterval('snakeMove()', speed1);
};
</script>


</html>

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript dom 基本操作小结
Apr 11 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
Oct 11 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
angularJS深拷贝详解
Mar 23 Javascript
Vue.js简易安装和快速入门(第二课)
Oct 17 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 Javascript
微信小程序文章详情页跳转案例详解
Jul 09 Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 Javascript
vue使用过滤器格式化日期
Jan 20 Vue.js
js调用刷新界面的几种方式
May 03 #Javascript
JavaScript中双向数据绑定详解
May 03 #Javascript
Js实现中国公民身份证号码有效性验证实例代码
May 03 #Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 #Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
May 03 #Javascript
Vue实现双向数据绑定
May 03 #Javascript
Angular 4.x 路由快速入门学习
May 03 #Javascript
You might like
PHP 数据库树的遍历方法
2009/02/06 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JsDom 编程小结
2011/08/09 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
国贸专业毕业求职信
2014/06/11 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
基层党支部整改方案
2014/10/25 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
python blinker 信号库
2022/05/04 Python