原生js实现贪吃蛇游戏


Posted in Javascript onOctober 26, 2020

原生JavaScript实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

原生js实现贪吃蛇游戏

代码:

<script>
 var timer = null;
 var oMain = document.getElementById("main");
 
 function Map(atom,xnum,ynum){//地图,设置单位大小,及根据单位大小创建地图
  this.atom = atom;
  this.xnum = xnum;
  this.ynum = ynum;
  
  this.create = function(){
  
  this.canvas = document.createElement("div");
  this.canvas.style.cssText = "position: relative;top: 40px;border: 1px solid red;background: #F1F1F1;"
  this.canvas.style.width = this.atom * this.xnum + "px";//画布宽
  this.canvas.style.height = this.atom * this.ynum + "px";//画布高
  main.appendChild(this.canvas);
  }
 }
 
 function Food(map){//食物
  this.width = map.atom;
  this.height = map.atom;
  //实现随机背景色
  this.bgColor = "rgb("+Math.floor(Math.random()*200)+","+Math.floor(Math.random()*200)+","+Math.floor(Math.random()*200)+")";
 
  this.x = Math.floor(Math.random()*map.xnum);
  this.y = Math.floor(Math.random()*map.ynum);
  
  this.flag = document.createElement('div');
  this.flag.style.width = this.width + 'px';
  this.flag.style.height = this.height + 'px';
  this.flag.style.backgroundColor = this.bgColor;
  this.flag.style.borderRadius = '50%';
  this.flag.style.position = "absolute";
  this.flag.style.left = this.x * this.width + 'px';
  this.flag.style.top = this.y * this.height + 'px';
  
  map.canvas.appendChild(this.flag);
 }
 
 //重新开始
 function restart(map,snake){
  for(var i=0; i<snake.body.length; i++){
  map.canvas.removeChild(snake.body[i].flag);
  }
  snake.body = [
  {x : 2,y : 0},//蛇头
  {x : 1,y : 0},//蛇身
  {x : 0,y : 0}//蛇尾
  ]
  snake.direction = "right";
  snake.display();
  
  map.canvas.removeChild(food.flag);
  food = new Food(map);
 }
 
 function Snake(map){
  this.width = map.atom;
  this.height = map.atom;
  
  this.direction = "right";
  
  this.body = [
  {x : 2,y : 0},
  {x : 1,y : 0},
  {x : 0,y : 0}
  ]
  
  this.display = function(){
  for(var i=0; i<this.body.length; i++){
   if(this.body[i].x != null){
   var s = document.createElement('div');
   //将节点保存
   this.body[i].flag = s;
   
   //设置样式
   s.style.width = this.width + 'px';
   s.style.height = this.height + 'px';
   s.style.backgroundColor = "rgb("+Math.floor(Math.random()*200)+","+Math.floor(Math.random()*200)+","+Math.floor(Math.random()*200)+")";
   s.style.borderRadius = '50%';
   
   //设置位置
   s.style.position = "absolute";
   s.style.left = this.body[i].x * this.width + 'px';
   s.style.top = this.body[i].y * this.height + 'px';
   
   //添加到地图
   map.canvas.appendChild(s);
   }
  }
  }
  
  this.run = function(){
  for(var i=this.body.length-1; i>0; i--){
   this.body[i].x = this.body[i-1].x;
   this.body[i].y = this.body[i-1].y
   
  }
  switch(this.direction){
   case "left":this.body[0].x -= 1;break;
   case "right":this.body[0].x += 1;break;
   case "up":this.body[0].y -= 1;break;
   case "down":this.body[0].y += 1;break;
  }
  //吃食物
  if(this.body[0].x == food.x && this.body[0].y == food.y){
   this.body.push({x : null,y : null,flag : null});
   
   map.canvas.removeChild(food.flag);
   food = new Food(map);
  }
  
  //判断游戏结束
  if(this.body[0].x<0 || this.body[0].x>map.xnum-1 || this.body[0].y<0 || this.body[0].y>map.ynum-1){
   clearInterval(timer);
   alert("GAME OVER!");
   restart(map,this);
   return false;
  }
  for(var i=4; i<this.body.length; i++){
   if(this.body[0].x == this.body[i].x && this.body[0].y == this.body[i].y){
   clearInterval(timer);
   alert("GAME OVER!");
   restart(map,this);
   return false;
   }
  }
  
  //删除原来
  for(var i=0; i<this.body.length; i++){
   if(this.body[i].flag != null){
   map.canvas.removeChild(this.body[i].flag);
   }
  }
  this.display();
  }
 }

 
 //创建地图对象
 var map = new Map(20,40,20);
 map.create();
 
 //创建食物对象
 var food = new Food(map);
 
 //创建蛇对象
 var snake = new Snake(map);
 snake.display();
 
 
 //加上键盘事件(改变蛇头方向)
 window.onkeydown = function(e){
  event = e || window.event;
  
  switch(event.keyCode){
  case 38:
   if(snake.direction != "down")//禁止掉头
   snake.direction = "up";
  break;
  case 40:
   if(snake.direction != "up")
   snake.direction = "down";
  break;
  case 37:
   if(snake.direction != "right")
   snake.direction = "left";
  break;
  case 39:
   if(snake.direction != "left")
   snake.direction = "right";
  break;
  }
 }
 
 var speed = 100;
 
 function start(){
  clearInterval(timer);
  timer = setInterval(function(){
  snake.run();
  document.getElementById("score").innerHTML = snake.body.length-3;
  start();
  },speed)
 }
 
 //难度
 document.getElementById("1").onclick = function(){
  speed = 100;
 }
 
 document.getElementById("2").onclick = function(){
  speed = 50;
 }
 
 document.getElementById("3").onclick = function(){
  speed = 20;
 }
 
 document.getElementById("begin").onclick = function(){
  start();
 }
 
 document.getElementById("pause").onclick = function(){
  
  clearInterval(timer);
 }
</script>

代码仅有js部分,完整代码可以上我的github免费下载

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

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

Javascript 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 Javascript
如何快速上手Vuex
Feb 14 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
Mar 07 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
webuploader分片上传的实现代码(前后端分离)
Sep 10 Javascript
JS数组求和的常用方法总结【5种方法】
Jan 14 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
JS跨浏览器解析XML应用过程详解
Oct 16 Javascript
JavaScript实现五子棋小游戏
Oct 26 #Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 #Javascript
vue3.0 加载json的方法(非ajax)
Oct 26 #Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 #Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 #Javascript
Vue中用JSON实现刷新界面不影响倒计时
Oct 26 #Javascript
jQuery实现简单评论区功能
Oct 26 #jQuery
You might like
松下Panasonic RF-B65电路分析
2021/03/02 无线电
德生PL550的电路分析
2021/03/02 无线电
基于PHP对XML的操作详解
2013/06/07 PHP
解析php类的注册与自动加载
2013/07/05 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
python递归函数绘制分形树的方法
2018/06/22 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
python实现dijkstra最短路由算法
2019/01/17 Python
如何使用python代码操作git代码
2020/02/29 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
中科软笔试题和面试题
2014/10/07 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
业务经理的岗位职责
2013/11/16 职场文书
50岁生日感言
2014/01/23 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python