原生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 相关文章推荐
JavaScript 设计模式学习 Singleton
Jul 27 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
Javascript的this用法
Jan 16 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
JS实现点击按钮可实现编辑功能
Jul 03 Javascript
使用webpack构建应用的方法步骤
Mar 04 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
Sep 18 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
js实现弹框效果
Mar 24 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
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
详解PHP PDO简单教程
2019/05/28 PHP
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
python通过smpt发送邮件的方法
2015/04/30 Python
python交互式图形编程实例(二)
2017/11/17 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
python正则表达式实例代码
2020/03/03 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
教师推荐信范文
2013/11/24 职场文书
员工培训邀请函
2014/01/11 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
三十年同学聚会感言
2015/07/30 职场文书
教务处干事工作总结
2015/08/14 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android