javascript实现贪吃蛇小练习


Posted in Javascript onJuly 05, 2020

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

游戏思路:

  • 创建方块、控制按钮(showBlock)
  • 方块移动(点击开始,不断创建并移除前面的方块,用到队列先进先出)
  • 控制移动(doUp\doDown\doLeft\doRight,加入用键盘控制)
  • 产生食物方块(generateFood)
  • 吃到食物变长(当方块位置相同时,吃食物)
  • 判断撞墙、撞到自己游戏结束
  • 设置积分
<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>

<body>
 <style>
 body {
  margin: 0;
  padding: 0;
 }

 .content {
  width: 800px;
  height: 400px;
  background-color: gray;
  display: absolute;

 }
 </style>

 <div id="content" class="content">
 </div>
 <button onclick="start()">开始游戏</button>
 <button onclick="doUp()">上</button>
 <button onclick="doDown()">下</button>
 <button onclick="doLeft()">左</button>
 <button onclick="doRight()">右</button>
 <div id="score">0</div>

 <script>
 //定义参数
 var snackBlock = {};
 snackBlock.top = 20;
 snackBlock.left = 20;
 var firstDiv = showBlock(snackBlock.left, snackBlock.top, "red");
 var snackDivArray = [];//装方块的数组
 snackDivArray.push(firstDiv);

 var left = 1, right = 2, up = 3, down = 4;
 var direction = right;
 var food = generateFood();//生成食物
 var hasEat = false;
 var score = 0;


 function generateFood() {

  var left = getRandomNum(39);
  var top = getRandomNum(19);
  var foodBlock = showBlock(left, top, "pink");
  foodBlock.left = left;
  foodBlock.top = top;
  return foodBlock;
 }

 function getRandomNum(max) {
  return Math.round(Math.random() * max) * 20;
 }

 function start() {
  var interval = setInterval(function () {
  var newBlock = {};
  switch (direction) {
   case up:
   newBlock.top = snackBlock.top - 20;
   newBlock.left = snackBlock.left;
   break;
   case down:
   newBlock.top = snackBlock.top + 20;
   newBlock.left = snackBlock.left;
   break;
   case left:
   newBlock.top = snackBlock.top;
   newBlock.left = snackBlock.left - 20;
   break;
   case right:
   newBlock.top = snackBlock.top;
   newBlock.left = snackBlock.left + 20;
   break;

  }


  var currentLeft = newBlock.left;
  var currentTop = newBlock.top;
  var eat = false;

  //吃食物
  if (currentLeft == food.left && currentTop == food.top) {
   removeBlock(food);
   food = generateFood();
   eat = true;
   hasEat = true;
   score += 10;//吃一个加10分
   document.getElementById("score").innerHTML = score;//写入div
  }

  snackBlock = newBlock;
  //是否撞墙
  if (currentLeft < 0 || currentLeft >= 800 || currentTop < 0 || currentTop >= 400) {
   alert("game over!");
   clearInterval(interval);
   return;
  }
  if (eat == false) {
   //移除尾巴
   removeBlock(snackDivArray.shift(div));
  }
  //是否撞到自己
  snackDivArray.forEach(function (item, index, array) {
   if (item.top == currentTop && item.left == currentLeft) {
   alert("game over!");
   clearInterval(interval);
   return;
   }
  });

  //创建新的身体
  var div = showBlock(newBlock.left, newBlock.top, "red");
  div.left = newBlock.left;
  div.top = newBlock.top;
  snackDivArray.push(div);

  }, 300);

 }

 //方向控制
 function doUp() {
  if (direction == down && hasEat) {
  return;
  }
  direction = up;
 }
 function doDown() {
  if (direction == up && hasEat) {
  return;
  }
  direction = down;
 }
 function doRight() {
  if (direction == left && hasEat) {
  return;
  }
  direction = right;
 }
 function doLeft() {
  if (direction == right && hasEat) {
  return;
  }
  direction = left;
 }

 function showBlock(left, top, color) {//产生方块
  var content = document.getElementById("content");
  var snackDiv = document.createElement("div");
  snackDiv.style.width = "20px";
  snackDiv.style.height = "20px";
  snackDiv.style.left = left + "px";
  snackDiv.style.top = top + "px";
  snackDiv.style.background = color;
  snackDiv.style.position = "absolute";
  content.appendChild(snackDiv);
  return snackDiv;
 }
 function removeBlock(div) {//移除方块
  div.parentNode.removeChild(div);
 }
 //键盘控制方向
 document.onkeydown = function (e) {
  if (e && e.keyCode == 38) {
  doUp();
  } else if (e && e.keyCode == 40) {
  doDown();
  } else if (e && e.keyCode == 37) {
  doLeft();
  } else if (e && e.keyCode == 39) {
  doRight();
  }
 }
 </script>
</body>

</html>

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

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

Javascript 相关文章推荐
js子页面获取父页面数据示例
May 15 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
JQuery显示隐藏页面元素的方法总结
Apr 16 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
Sep 10 Javascript
js实现创建删除html元素小结
Sep 30 Javascript
微信小程序 label 组件详解及简单实例
Jan 10 Javascript
详解JavaScript对象的深浅复制
Mar 30 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
微信小程序搭建自己的Https服务器
May 02 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 Javascript
jQuery实现简单日历效果
Jul 05 #jQuery
jQuery实现飞机大战小游戏
Jul 05 #jQuery
原生js实现随机点名
Jul 05 #Javascript
实例讲解JavaScript 计时事件
Jul 04 #Javascript
vue实现导航菜单和编辑文本的示例代码
Jul 04 #Javascript
详解Vue.js 响应接口
Jul 04 #Javascript
JavaScript中数组去重的5种方法
Jul 04 #Javascript
You might like
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
护士专业推荐信
2013/11/02 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
天气温馨提示语
2015/07/14 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
初中英语教学随笔
2015/08/15 职场文书
党员干部学习心得体会
2016/01/23 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers
Golang Web 框架Iris安装部署
2022/08/14 Python