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 相关文章推荐
flexigrid 类似ext grid的JS表格代码
Jul 17 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
JavaScript中的property和attribute介绍
Dec 26 Javascript
requireJS使用指南
Apr 27 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
Dec 01 Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
JavaScript声明变量和数据类型的转换
Apr 12 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
Javascript实现字数统计
2015/07/03 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
三好学生自我鉴定
2013/12/17 职场文书
师范生自荐信模板
2014/05/28 职场文书
艾滋病宣传标语
2014/06/25 职场文书
观后感的写法
2015/06/19 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js