欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS实现简单贪吃蛇小游戏

程序员文章站 2022-03-14 22:17:05
本文实例为大家分享了js实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下1、使用语言 html+css+javascript2、使用工具 visual studio code3、github项目...

本文实例为大家分享了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);
}

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

相关标签: js 贪吃蛇