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 25 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
JS弹出窗口代码大全(详细整理)
Dec 21 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
jquery实现的V字形显示效果代码
Oct 27 Javascript
详解JavaScript中的Unescape()和String() 函数
Nov 09 Javascript
老生常谈 关于JavaScript的类的继承
Jun 24 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
JavaScript登录验证基础教程
Nov 01 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
Nov 09 Javascript
解决element ui select下拉框不回显数据问题的解决
Feb 20 Javascript
原生js canvas实现鼠标跟随效果
Aug 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP调试函数和日志记录函数分享
2015/01/31 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
js 调整select 位置的函数
2008/02/21 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
countUp.js实现数字动态变化效果
2019/10/17 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[01:08:09]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第二局
2016/03/02 DOTA
详解Python用户登录接口的方法
2019/04/17 Python
如何定义TensorFlow输入节点
2020/01/23 Python
如何通过python实现全排列
2020/02/11 Python
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
数控专业应届生求职信
2013/11/27 职场文书
运动会入场词60字
2014/02/15 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
大班幼儿评语大全
2014/04/30 职场文书
触电现场处置方案
2014/05/14 职场文书
小组口号大全
2014/06/09 职场文书
初中教师个人工作总结
2015/02/10 职场文书
社区服务活动感想
2015/08/11 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL