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 相关文章推荐
优化javascript的执行速度
Jan 23 Javascript
JavaScript 面向对象编程(1) 基础
May 18 Javascript
jquery.post用法示例代码
Jan 03 Javascript
四种参数传递的形式——URL,超链接,js,form表单
Jul 24 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
浅谈js构造函数的方法与原型prototype
Jul 04 Javascript
Angularjs使用过滤器完成排序功能
Sep 20 Javascript
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
May 07 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
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作的文本留言本的例子(三)
2006/10/09 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
PHP函数积累总结
2019/03/19 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
JS求平均值的小例子
2013/11/29 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
基于jquery实现五星好评
2017/11/18 jQuery
vue购物车插件编写代码
2017/11/27 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
关于python中的xpath解析定位
2020/03/06 Python
Django更新models数据库结构步骤
2020/04/01 Python
Python定义一个函数的方法
2020/06/15 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
迎接领导欢迎词
2014/01/11 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
邀请函的格式
2015/01/30 职场文书
优秀员工自荐书
2015/03/06 职场文书
2015年幼师工作总结
2015/04/28 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android