纯原生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 相关文章推荐
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
基于javascript实现动态时钟效果
Aug 18 Javascript
一波JavaScript日期判断脚本分享
Mar 06 Javascript
jQuery插件ajaxFileUpload使用实例解析
Oct 19 Javascript
微信小程序 wx.uploadFile无法上传解决办法
Dec 14 Javascript
Javascript实现base64的加密解密方法示例
Jun 27 Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 Javascript
Easy UI动态树点击文字实现展开关闭功能
Sep 30 Javascript
vuejs移动端实现div拖拽移动
Jul 25 Javascript
Vue.js下拉菜单组件使用方法详解
Oct 19 Javascript
Nest.js散列与加密实例详解
Feb 24 Javascript
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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
jQuery之按钮组件的深入解析
2013/06/19 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
django foreignkey(外键)的实现
2019/07/29 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
高二政治教学反思
2014/02/01 职场文书
统计系教授推荐信
2014/02/28 职场文书
生日宴会主持词
2014/03/20 职场文书
工程负责人任命书
2014/06/06 职场文书
关于环保的标语
2014/06/13 职场文书
员工保密协议书
2014/09/27 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
学校远程教育工作总结
2015/08/11 职场文书
python如何读取.mtx文件
2021/04/22 Python
Python 中random 库的详细使用
2021/06/03 Python
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers