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 jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
text-align:justify实现文本两端对齐 兼容IE
Aug 19 Javascript
基于jQuery实现在线选座之高铁版
Aug 24 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
JS新包管理工具yarn和npm的对比与使用入门
Dec 09 Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 Javascript
layui实现数据表格隐藏列的示例
Oct 25 Javascript
vue 对axios get pust put delete封装的实例代码
Jan 05 Javascript
js实现简单进度条效果
Mar 25 Javascript
原生JS运动实现轮播图
Jan 02 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 strtr() 函数使用说明
2008/11/21 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
PHP多维数组排序array详解
2017/11/21 PHP
最简单的js图片切换效果实现代码
2011/09/24 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
Python标准库os.path包、glob包使用实例
2014/11/25 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
python去掉行尾的换行符方法
2017/01/04 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
北京天润融通.net面试题笔试题
2012/02/20 面试题
HR喜欢的自荐信格式
2013/10/08 职场文书
职位说明书范文
2014/05/07 职场文书
多媒体教室标语
2014/06/26 职场文书
授权委托书公证
2014/09/14 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
李白故里导游词
2015/02/12 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript