JS实现简单贪吃蛇小游戏


Posted in Javascript onOctober 28, 2020

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

1、使用语言 HTML+CSS+JavaScript
2、使用工具 visual studio code
3、GitHub项目地址:贪吃蛇
4、项目运行截图:

JS实现简单贪吃蛇小游戏

5、项目功能分析:主要使用数组来存储蛇的位置,地图和蛇都是一个二维数组,对于有蛇的地方,地图的CSS就会发生改变,同时添加了添加了一个音乐播放按钮,通过CSS动画实现旋转。

6、项目代码:(项目代码有详细的注释)

snake.html

<!--
 * @Author: CSU_XZY
 * @Date: 2020-10-13 22:06:51
 * @LastEditors: CSU_XZY
 * @LastEditTime: 2020-10-18 17:08:54
 * @FilePath: \第二天\贪吃蛇\snake.html
 * @Description: just to play
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>eatSnake</title>
<head>
 <style type="text/css">
 *{
 margin:0;
 padding:0;
 border: 0px;
 }
 body{
 background: #444;
 }
 table{
 border-collapse:collapse;
 overflow: hidden;
 border:1px solid #ddd;
 margin:10px auto 10px auto;
 }
 td{
 display: table-cell;
 width:20px;
 height:20px;
 background: #fff;
 border:1px #eeeeee solid;
 }
 .snake{
 background: #3388ee;
 }
 .notsnake{
 background: #fff;
 }
 .food{
 background: #33aa33;
 }
 .snake_head{
 background: #dd4444;
 }
 .notice{
 width:450px;
 text-align: center;
 margin:50px auto;
 color:#fff;
 font-size: 14px;
 }
 </style>
</head>
<body>
<p class="notice">提示:空格键控制开始/ 暂停,方向键控制蛇的移动方向,F5刷新</p>
<script type="text/javascript" src="snake.js"></script>
</body>
</html>

snake.js

/*
 * @Author: CSU_XZY
 * @Date: 2020-10-17 12:38:26
 * @LastEditors: CSU_XZY
 * @LastEditTime: 2020-10-18 22:40:24
 * @FilePath: \第二天\snake\snake.js
 * @Description: just to play
 */
window.onload = function(){
 var snake = function(width,height,snakeId,speed){
  this.width = width || 10;
  this.height = height || 10;
  this.snakeId = snakeId || "snake";
  this.goX = 0;
  this.goY = 0;
  this.speed = this.oldSpeed = speed || 10;
  this.Grid = []; //存放td的二维数组
  this.snakeGrid = []; //存放蛇的数组
  this.foodGrid = [];
  this.snakeTimer = null;
  this.derectkey = 39;
  this.stop = true;
  this.init();
  document.getElementById("myAudio").play();
  box.style.animationPlayState = 'running'
 }

 snake.prototype = {
  //创建二维数组
  multiArray : function(m , n)
  {
   var array = new Array(m); //长
   for(let i = 0; i < m; i++)
   {
    array[i] = new Array(n); //宽
   }
   return array;
  },
  //函数修正this
  bind : function(fn,context)
  {
   return function(){
 return fn.apply(context,arguments);
 }
  },
  //移动的主函数
  move:function(){
 var _this = this;
 if(_this.snakeTimer){clearInterval(_this.snakeTimer);}
 _this.snakeTimer = setInterval(_this.bind(_this.main,_this),Math.floor(3000/this.speed));
  },
  //重来
  reset()
  {
   this.goX = 0;
   this.goY = 0;
   this.speed = this.oldSpeed;
   this.derectkey = 39;
   this.stop = true;
   this.init();
  },
  //确定键盘事件
  keyDown : function(e)
  { 
   var e = e || window.event;
   var keycode = e?e.keyCode:0;
   if(keycode == 116 )
   window.location.reload();
   if(keycode == 32)
   {
    if(this.stop)
    {
     this.move();
     this.stop = false;
    }
    else{
     if(this.snakeTimer)
     clearInterval(this.snakeTimer);
     this.stop = true;
    }
   }
   if(keycode>=37 && keycode <= 40)
    {
     if(!this.stop)
     this.derectkey = keycode;
    }
   return false;
  },
  //创建地图
  creatMap : function()
  {
   var table = document.createElement("table");
   var tbody = document.createElement("tbody");
   for(let i = 0; i < this.width; i++)
   {
    var tr = document.createElement("tr");
    for(let j = 0; j < this.height; j++)
    {
     var td = document.createElement("td");
     this.Grid[i][j] = tr.appendChild(td);
    }
    tbody.appendChild(tr);
   }
   table.appendChild(tbody);
   table.id = this.snakeId;
   document.body.appendChild(table);
  },
  //产生随机点
  randomPoint : function(initX,initY,endX,endY)
  {
   var p = []; //用来存放产生的随机点的数组
   var initX = initX || 0;
   var initY = initY || 0;
   var endX = endX || this.width;
   var endY = endY || this.height;
   p[0] = Math.floor(Math.random()*(endX - initX)) + Math.floor(initX);
   p[1] = Math.floor(Math.random()*(endY - initY)) + Math.floor(initY)
   return p;
  },
  //初始化食物的位置
  initFood : function()
  {
   this.foodGrid = this.randomPoint();

   if(this.isInSnake(this.foodGrid))
   {
    this.initFood();
    return false;
   }
   this.Grid[this.foodGrid[0]][this.foodGrid[1]].className = "food";
  },
  //判断点是否在蛇身上
  isInSnake : function(point,pos)
  {
   var snakeGrid = this.snakeGrid;
   if(point instanceof Array)
   {
    let n = snakeGrid.length;
    for(let i = pos || 0; i < n; i++)
    {
     if(point[0] == snakeGrid[i][0] && point[1] == snakeGrid[i][1])
     return true;
    }
   }
   return false;
  },
  //给蛇涂颜色
  paintSnake : function(){
   var snakeGrid = this.snakeGrid;
   for(let i = 0; i < snakeGrid.length; i++)
   {
    this.Grid[snakeGrid[i][0]][snakeGrid[i][1]].className = "snake_body";
   }
  },
  //初始化蛇的位置
  initSnake : function()
  {
   this.snakeGrid = [];

   this.snakeGrid.push([1,3]);
   this.snakeGrid.push([1,2]);
   this.snakeGrid.push([1,1]);

   this.paintSnake();

   this.Grid[this.snakeGrid[0][0]][this.snakeGrid[0][1]].className = "snake_head";
   this.Grid[this.snakeGrid[this.snakeGrid.length-1][0]][this.snakeGrid[this.snakeGrid.length-1][1]].className = "snake_tail";
  },
  //判断蛇是否撞墙
  isInWall : function(point){
   if(point instanceof Array){
    if(point[0] < 0 || point[0] > this.width1 - 1 || point[1] < 0 || point[1] > this.height - 1)
    return true;
   } 
   return false;
  },
  //初始化条件
  
  //控制函数运行的主函数
  main : function(){
   var snakeGrid = this.snakeGrid;
   var temp = snakeGrid[snakeGrid.length-1],
    isEnd = false;
    headX = snakeGrid[0][0];
    headY = snakeGrid[0][1];
    msg = "";
   switch(this.derectkey)
   {
    case 37:
  if(this.goY!=1){this.goY=-1;this.goX=0} //防止控制蛇往相反反方向走
  break;
 case 38:
  if(this.goX!=1){this.goX=-1;this.goY=0}
  break;
 case 39:
  if(this.goY!=-1){this.goY=1;this.goX=0}
  break;
 case 40:
  if(this.goX!=-1){this.goX=1;this.goY=0}
   }
   headX += this.goX;
   headY += this.goY;

   if(headX == this.foodGrid[0] && headY == this.foodGrid[1])
   {
    this.snakeGrid.unshift(this.foodGrid);
    this.initFood();
    if(this.snakeGrid.length>4){ //控制蛇加速
  if(this.snakeGrid.length==5){
  this.speed += 5;
  }
  else if(this.snakeGrid.length==10){
  this.speed += 3;
  }
  else if(this.snakeGrid.length==20){
  this.speed += 3;
  }
  else if(this.snakeGrid.length==30){
  this.speed += 3;
  }
  this.move();
 }
   }
   else
   {
    for(var i=this.snakeGrid.length-1;i>0;i--){
  this.snakeGrid[i] = this.snakeGrid[i-1] ;
 }
    this.snakeGrid[0] = [headX,headY]; 
    if(this.isInSnake(this.snakeGrid[0],1)){
  isEnd=true;
  msg = "哈皮,吃到自己啦!!";
 }
 //判断是否撞墙
 else if(this.isInWall(this.snakeGrid[0])){
  isEnd =true;
  msg = "撒比伟哥,撞墙了!!";
    }
    if(isEnd)
    {
     if(this.snakeTimer)
     clearInterval(this.snakeTimer);
     var score;
     let len = this.snakeGrid.length;
     if(len <= 5)
     score = len-3;
     else if(len>5 && len<=10)
     {
      score = 2 + 2*(len-5)
     }
     else if(len>10 && len <= 20)
     score = 12 + 3*(len-10);
     else
     score = 27 + 5*(len - 15);
     if(confirm(msg+"你的分数是:"+score+"! 是否重新开始?")){
  this.reset();
  }
  return false;
    }
    this.Grid[temp[0]][temp[1]].className = "notSnake";
   }
   this.paintSnake();
   this.Grid[headX][headY].className = "snake_head";
   this.Grid[this.snakeGrid[this.snakeGrid.length-1][0]][this.snakeGrid[this.snakeGrid.length-1][1]].className = "snake_tail";
  },
  init : function(){
   var _this = this;
   snake_id = document.getElementById(_this.snakeId)||0 ;
 if(snake_id){
 document.body.removeChild(snake_id);
 }
   _this.Grid = _this.multiArray(_this.width,_this.height);
   _this.creatMap();
   _this.initSnake();
   _this.initFood();
   document.onkeydown = _this.bind(_this.keyDown,_this);
  }
 }
 new snake(20,20,"snake",10);
}

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

Javascript 相关文章推荐
“不能执行已释放的Script代码”错误的原因及解决办法
Sep 09 Javascript
DIV+CSS+JS不间断横向滚动实现代码
Mar 19 Javascript
alert中断settimeout计时功能
Jul 26 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
解决jquery1.9不支持browser对象的问题
Nov 13 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
js正则表达式中exec用法实例
Jul 23 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
微信小程序 购物车简单实例
Oct 24 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 #Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 #Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 #Javascript
antd vue table跨行合并单元格,并且自定义内容实例
Oct 28 #Javascript
js 实现碰撞检测的示例
Oct 28 #Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 #Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 #Javascript
You might like
重置版宣传动画
2020/04/09 魔兽争霸
PHPMailer 中文使用说明小结
2010/01/22 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
JSON 数据格式详解
2017/09/13 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
Python实现控制台输入密码的方法
2015/05/29 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python模糊图片过滤的方法
2018/12/14 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
python实现拼图小游戏
2020/02/22 Python
python的launcher用法知识点总结
2020/08/07 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
文化宣传方案
2014/03/13 职场文书
纪检监察建议书
2014/05/19 职场文书
应届毕业生求职信范文
2015/03/19 职场文书