原生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 事件属性绑定带参数的函数
Mar 13 Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 Javascript
基于prototype扩展的JavaScript常用函数库
Nov 30 Javascript
JS模块与命名空间的介绍
Mar 22 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
jQuery中常用动画效果函数(日常整理)
Sep 17 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 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
php循环输出数据库内容的代码
2008/05/24 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
django删除表重建的实现方法
2019/08/28 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
公务员政审单位鉴定材料
2014/05/16 职场文书
小学综合实践活动总结
2014/07/07 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
Pygame Draw绘图函数的具体使用
2021/11/17 Python
Django框架模板用法详解
2022/06/10 Python
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers