js贪吃蛇小游戏

  <!doctype html>
  <html lang="en">
  <head>
  <meta charset="UTF-8">
  <meta name="viewport"
  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script>
  var map = null;
  var food = null;
  var snake = null;
   
  var timer = null;
  var t = 500;
  //定义地图构造器(类)
  function Map(){
  //地图有属性
  this.width = 600; //单位像素 px
  this.height = 400;
  this.backgroundColor = '#dddddd';
  this.position = 'relative';
  //创建一个保存地图的成员属性
  this._map = null;
  //创建地图的方法
  this.show = function(){
  this._map = document.createElement('div');
  //设置div的属性
  this._map.style.width = this.width + 'px';
  this._map.style.height = this.height + 'px';
  this._map.style.backgroundColor = this.backgroundColor;
  this._map.style.position = this.position;
  //将div放到body中
  document.querySelector('body').appendChild(this._map);
  }
  }
   
  //定义食物构造器(类)
  function Food(){
  //食物的属性
  this.width = 20; //单位像素 px
  this.height = 20;
  this.backgroundColor = 'green';
  //位置。。。
  this.position = 'absolute';
  this.x = 0; //x轴坐标
  this.y = 0; //y轴坐标
  //表示食物的属性
  this._food = null;
  //创建并显示食物的方法
  this.show = function(){
  if(this._food === null){
  this._food = document.createElement('div');
  }
  this._food.style.width = this.width + 'px';
  this._food.style.height = this.height + 'px';
  this._food.style.backgroundColor = this.backgroundColor;
  this._food.style.position = this.position;
  //设置left和top属性前,先随机设置x和y的值
  this.x = Math.floor(Math.random() * 30);
  this.y = Math.floor(Math.random() * 20);
  this._food.style.left = this.x * this.width + 'px';
  this._food.style.top = this.y * this.height + 'px';
  //给定完样式,让食物显示在地图上
  map._map.appendChild(this._food);
  }
  }
   
  //定义蛇类
  function Snake(){
  //定义蛇的初始身体
  //每个数组中的null表示当前这节蛇的dom对象,就是这节蛇的div
  this.body = [[3,2,'red',null],[2,2,'blue',null],[1,2,'blue',null]];
  this.width = 20;
  this.height = 20;
  this.position = 'absolute';
  this.direct = 'right';
  //定义蛇的显示方法
  this.show = function(){
  for(var i=0; i<this.body.length; i++){
  if(this.body[i][3] === null){
  this.body[i][3] = document.createElement('div');
  }
   
  //设置这节蛇的位置和背景颜色
  this.body[i][3].style.backgroundColor = this.body[i][2];
  this.body[i][3].style.width = this.width + 'px';
  this.body[i][3].style.height = this.height + 'px';
  this.body[i][3].style.position = this.position;
  //div.style.left = 横坐标*宽度
  this.body[i][3].style.left = this.body[i][0] * this.width + 'px';
  this.body[i][3].style.top = this.body[i][1] * this.height + 'px';
  //把这节蛇显示在地图上
  map._map.appendChild(this.body[i][3]);
  }
  }
  //蛇移动
  this.move = function(){
  //判断是否吃到食物
  if(this.body[0][0] == food.x && this.body[0][1] == food.y){
  //增加body元素的个数
  this.body.push([0,0,'blue',null]);
  //重新显示蛇
  this.show();
  //从新生成一个食物
  food.show();
  //修改t
  t -= 50;
  m(t);
  }
   
  //移动一次,实验一下
  //this.body = [[4,2,'red'],[3,2,'blue'],[2,2,'blue']];
  //写循环,除了蛇头,改变每节蛇的坐标(先改变蛇尾,依次向前改)
  for(var i=this.body.length-1; i>0; i--){
  this.body[i][0] = this.body[i-1][0]; //改变横坐标
  this.body[i][1] = this.body[i-1][1]; //改变纵坐标
  }
  //this.body[0][0] += 1;
  //单独设置蛇头
  if(this.direct == 'right'){
  this.body[0][0] += 1;
  }else if(this.direct == 'left'){
  this.body[0][0] -= 1;
  }else if(this.direct == 'up'){
  this.body[0][1] -= 1;
  }else if(this.direct == 'down'){
  this.body[0][1] += 1;
  }
   
  //判断是否超过边界
  if(this.body[0][1] < 0 || this.body[0][1] > 19 || this.body[0][0] < 0 || this.body[0][0] > 29){
  alert('Game Over!刷新从新开始');
  clearInterval(timer);
  return false;
  }
  //判断不能撞自己,可加可不加
  for(var i=1; i<this.body.length; i++){
  //在循环过程中判断,判断蛇头是否和身体的某一节坐标相同,坐标相同,表示相撞
  if(this.body[0][0] == this.body[i][0] && this.body[0][1] == this.body[i][1]){
  alert('太不小心了,怎么能吃自己呢');
  clearInterval(timer);
  return false;
  }
  }
   
  this.show();
  }
  //设置direct的值
  this.setDirect = function(keyCode){
  switch (keyCode){
  case 37:
  this.direct = 'left';
  break;
  case 38:
  this.direct = 'up';
  break;
  case 39:
  this.direct = 'right';
  break;
  case 40:
  this.direct = 'down';
  break;
  }
  }
  }
  function m(t){
  clearInterval(timer);
  timer = setInterval('snake.move()', t);
  }
  window.onload = function () {
  //实例化Map,调用创建地图方法
  map = new Map();
  map.show(); //调用show方法,创建地图
   
  //实例化食物Food
  food = new Food();
  food.show(); //显示食物
   
  //
  snake = new Snake();
  snake.show();
  //每隔多少毫秒调用一次move
   
   
  m(t);
  //设置按键
  document.body.onkeydown = function(event){
  var e = window.event||event;
  var keyCode = e.keyCode;
  //37 、38、 39、 40 分别表示 左上右下
  //调用setDirect
  snake.setDirect(keyCode);
  }
  }
  </script>
  </head>
  <body>
   
  </body>
  </html>
原文地址:https://www.cnblogs.com/songyanan/p/7309680.html