用JavaScript实现贪吃蛇游戏


Posted in Javascript onOctober 23, 2020

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

地图

地图:宽,高,背景颜色,因为小蛇和食物都是相对于地图显示的,这里小蛇和食物都是地图的子元素,随机位置显示,脱离文档流的,地图也需要脱离文档流relative,----css需要设置:宽,高,背景颜色,脱标

食物—div元素

elements---->存储div的数组(将来删除的食物div时候,先从map中删除div,再从数组中移除div)
食物:宽,高,背景颜色,横坐标,纵坐标
一个食物就是一个对象,这个对象有相应的属性,这个对象需要在地图上显示
最终要创建食物的对象,先有构造函数,并且把相应的值作为参数传入到构造函数中
食物要想显示在地图上,食物的初始化就是一个行为

1、食物的构造函数—>创建食物对象
2、食物的显示的方法—>通过对象调用方法,显示食物,设置相应的样式
2.1.1 因为食物要被小蛇吃掉,吃掉后应该再次出现食物,原来的食物就删除了
2.1.2 每一次初始化食物的时候先删除原来的食物,然后重新的初始化食物
2.1.3 通过一个私有的函数(外面不能调用的函数)删除地图上的食物,同时最开始的食物也相应的保存到一个数组中,再从这个数组中把食物删除

小蛇

小蛇就是一个对象
属性:每个身体都有宽、高、方向
属性:身体分三个部分,每个部分都是一个对象,每个部分都有横纵坐标,背景颜色
方法:小蛇要想显示在地图上,先删除之前的小蛇,然后再初始化小蛇(小蛇要移动)
移动思路:把小蛇的头的坐标给小蛇第一部分的身体,第一部分的身体的坐标给下一个部分身体小蛇的头,需要单独的设置:方向

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
 .map {
  width: 800px;
  height: 600px;
  background-color: #ccc;
  position: relative;
 }
 </style>
</head>
<body>
<div class="map"></div>
<script src="贪吃蛇案例.js"></script>
</body>
</html>

js

//自调用函数--食物
(function () {
 var elements = [];//用来保存每个小方块元素
 //创建小方块对象,需要先构造函数 小方块有宽高颜色 横纵坐标属性
 function Food(x, y, width, height, color) {
 //小方块的横纵坐标
 this.x = x || 0;
 this.y = y || 0;
 //小方块的宽高颜色
 this.width = width || 20;
 this.height = height || 20;
 this.color = color || 'green';
 }

 //为原型添加初始化的方法(作用:在页面上显示食物)
 //因为食物要在地图上显示这个食物,所以需要地图这个参数(map--就是class=“.map”这个div)
 Food.prototype.init = function (map) {
 //先删除这个小食物
 //外部无法访问到这个函数
 remove();
 //创建div(即小方块)
 var div = document.createElement("div");
 //把div添加到地图中
 map.appendChild(div);
 //设置div的样式
 div.style.width = this.width + 'px';
 div.style.height = this.height + 'px';
 div.style.backgroundColor = this.color;
 //横纵坐标需要随机产生 在这先停止
 //使div小方块脱离文档流
 div.style.position = 'absolute';
 //随机产生横纵坐标
 this.x = parseInt(Math.random() * (map.offsetWidth / this.width)) * this.width;
 this.y = parseInt(Math.random() * (map.offsetHeight / this.height)) * this.height;
 div.style.left = this.x + 'px';
 div.style.top = this.y + 'px';
 //把div加到数组elements中
 elements.push(div);
 };

 //私有的函数---删除食物
 function remove() {
 for (var i = 0; i < elements.length; i++) {
  var ele = elements[i];
  //找到子元素的父元素,删除这个子元素
  ele.parentNode.removeChild(ele);
  // 再次把elements中的子元素删除
  elements.splice(0, 1);//从0位置开始删除1个
 }
 }

 //把food暴露给顶级对象,外部可以使用
 window.Food = Food;
}());

//自调用函数--小蛇
(function () {
 //放小蛇的每个部分
 var elements = [];

 //创建小蛇的构造函数
 function Snake(width, height, direction) {
 //小蛇每个部分的宽和高
 this.width = width || 20;
 this.height = height || 20;
 //小蛇的身体
 this.body = [
  {x: 3, y: 2, color: 'red'},
  {x: 2, y: 2, color: 'orange'},
  {x: 1, y: 2, color: 'orange'}
 ];
 //小蛇移动的方向
 this.direction = direction || 'right';

 //为原型添加初始化方法
 Snake.prototype.init = function (map) {
  //初始化前先删除原来的小蛇
  remove();
  //循环遍历创建div
  for (var i = 0; i < this.body.length; i++) {
  //数组中的每个元素都是数组对象
  var obj = this.body[i];
  //创建div
  var div = document.createElement('div');
  //把div添加到地图上
  map.appendChild(div);
  //设置div的样式
  div.style.position = 'absolute';
  div.style.width = this.width + 'px';
  div.style.height = this.height + 'px';
  //横纵坐标
  div.style.left = obj.x * this.width + 'px';
  div.style.top = obj.y * this.height + 'px';
  //小蛇每个部分的颜色
  div.style.backgroundColor = obj.color;
  //把小蛇每部分加到数组中
  elements.push(div);
  }
 };

 //为小蛇添加原型方法使小蛇移动
 Snake.prototype.move = function (food, map) {
  //先改变小蛇身体移动的位置
  var i = this.body.length - 1;//2
  for (; i > 0; i--) {
  //i>0 就不包括头部
  this.body[i].x = this.body[i - 1].x;//让第三部分身体的横坐标等于第二部分身体的横坐标
  this.body[i].y = this.body[i - 1].y;//让第三部分身体的纵坐标等于第二部分身体的纵坐标
  }
  //判断方向--改变小蛇头部的方向
  switch (this.direction) {
  case 'right':
   this.body[0].x += 1;
   break;
  case 'left':
   this.body[0].x -= 1;
   break;
  case 'top':
   this.body[0].y -= 1;
   break;
  case 'bottom':
   this.body[0].y += 1;
   break;
  }

  //判断有没有吃到食物
  // 获取小蛇的头和食物的坐标一致
  var headX=this.body[0].x*this.width;
  var headY=this.body[0].y*this.height;
  //判断小蛇的头和食物的坐标是否相同
  if(headX==food.x&&headY==food.y){
  //获取小蛇的尾部
  var last=this.body[this.body.length-1];
  //把最后一个尾巴复制加到body最后
  this.body.push({
   x:last.x,
   y:last.y,
   color:last.color
  });
  //把食物删除,重新初始化食物
  food.init(map);
  }
 };

 //删除小蛇的私有函数
 function remove() {
  //获取数组
  var i = elements.length - 1;
  for (; i >= 0; i--) {
  //先从当前的子元素中找到该元素的父即元素,然后在删除这个子元素 (i>=0因为包括头部)
  var ele = elements[i];
  //从map地图上删除这个子元素
  ele.parentNode.removeChild(ele);
  //再删除数组中的每个元素
  elements.splice(i, 1);
  }
 }
 }

 //把Snake暴露给window
 window.Snake = Snake;
}());

//自调用函数--游戏对象
(function () {
 var that = null;

 //游戏的构造函数
 function Game(map) {
 this.food = new Food();//食物对象
 this.snake = new Snake();//小蛇对象
 this.map = map;//地图对象
 that = this;
 }

 //原型对象添加游戏初始化方法
 Game.prototype.init = function () {
 this.food.init(this.map);//食物初始化
 this.snake.init(this.map);//初始化小蛇
 //调用自动移动小蛇的方法
 this.runSnake(this.food, this.map);
 //小蛇移动后调用键盘方法
 this.bindKey();
 };

 //原型对象添加小蛇自动移动的方法
 Game.prototype.runSnake = function (food, map) {
 //自动的去移动
 //这里的this指向window
 var timeID = setInterval(function () {
  //移动小蛇
  this.snake.move(food, map);
  //初始化小蛇
  this.snake.init(map);
  //横坐标的最大值
  var maxX = map.offsetWidth / this.snake.width;
  //纵坐标的最大值
  var maxY = map.offsetHeight / this.snake.height;
  //小蛇的头部的坐标
  var headX = this.snake.body[0].x;
  var headY = this.snake.body[0].y;
  if (headX < 0 || headX >= maxX) {
  clearInterval(timeID);
  alert('游戏结束')
  }
  if (headY < 0 || headY >= maxY) {
  clearInterval(timeID);
  alert('游戏结束')
  }
 }.bind(that), 150)
 };

 //原型对象--设置用户按键,是小蛇方向改变
 Game.prototype.bindKey=function(){
 //获取用户的按键,改变小蛇的方向
 document.addEventListener('keydown',function(e){
  //这里的this应该是触发keydown的事件对象---document
  //所以这里的this指的是document
  switch(e.keyCode){
  case 37:this.snake.direction='left';break;
  case 38:this.snake.direction='top';break;
  case 39:this.snake.direction='right';break;
  case 40:this.snake.direction='bottom';break;
  }
 }.bind(that),false)
 };

 window.Game = Game;
}());

//实例化游戏对象
var gm = new Game(document.querySelector('.map'));
//初始化开始游戏
gm.init();


//实例化食物对象
// var fd = new Food();
// var map = document.querySelector('.map');
// fd.init(map);
// //实例化小蛇对象
// var snake = new Snake();
// snake.init(map);//先在地图上看到小蛇
// setInterval(function () {
// snake.init(map);
// snake.move(fd, map);
// }, 150);

// snake.init(map);//先在地图上看到小蛇
// snake.move(fd,map);//走一步
// snake.init(map);//初始化--重新画一条小蛇(把之前的小蛇先删除,再把现在得小蛇显示出来)

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

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

Javascript 相关文章推荐
网页javascript精华代码集
Jan 24 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
JavaScript中的anchor()方法使用详解
Jun 08 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
canvas实现弧形可拖动进度条效果
May 11 Javascript
详解vue.js移动端导航navigationbar的封装
Jul 05 Javascript
详解如何使用webpack+es6开发angular1.x
Aug 16 Javascript
JS 5种遍历对象的方式
Jun 16 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
Aug 28 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 Javascript
手机浏览器唤起微信分享(JS)
Oct 11 #Javascript
js canvas实现俄罗斯方块
Oct 11 #Javascript
利用js canvas实现五子棋游戏
Oct 11 #Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 #Javascript
原生js生成图片验证码
Oct 11 #Javascript
js实现石头剪刀布游戏
Oct 11 #Javascript
js+h5 canvas实现图片验证码
Oct 11 #Javascript
You might like
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
php扩展开发入门demo示例
2019/09/23 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
javascript 写类方式之八
2009/07/05 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
Vue.js tab实现选项卡切换
2017/05/16 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
详解如何在Vue里建立长按指令
2018/08/20 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
实时获取Python的print输出流方法
2019/01/07 Python
django的ORM模型的实现原理
2019/03/04 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
财务主管的岗位职责
2013/12/30 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis