原生JavaScript实现贪吃蛇游戏


Posted in Javascript onNovember 04, 2020

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

1.HTML部分,东西很少

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>贪吃蛇</title>
 <style>
 *{
  margin: 0px;
  padding: 0px;
 }
 td{
  border-radius: 30%;
 }
 </style>
 
</head>
<body>
 <script type="text/javascript" src="./snake.js"></script>
</body>
</html>

2.JavaScript部分

var arrayBox = new Array(); // 存放单元格
var arraySnake = new Array(); // 存放蛇 
var food; // 食物
var snakeHead; // 蛇头
var key = true; // 判断页面是否需要初始化
var timekey; // 运动定时器常量

function newGame() {
 bgInit();
 arrayBoxInit();
 initSnake();
 randomFood();
}

newGame();
document.onclick = function () {
 if (key) {
  gameStart(arraySnake);
  key = false;
 }
}



// 记录的单元格数组初始化
function arrayBoxInit() {
 for (var y = 0; y < 20; y++) {
  arrayBox[y] = new Array();
  for (var x = 0; x < 20; x++) {
   arrayBox[y][x] = 0;
  }
 }
}

// 背景初始化
function bgInit() {
 var table = document.createElement("table");
 table.style = "border-spacing:0px; border:1px solid #3c3c3c;margin:10% auto";
 for (var y = 0; y < 20; y++) {
  var tr = document.createElement("tr");
  for (var x = 0; x < 20; x++) {
   var td = "<td class='box-" + y + "-" + x + "' style='width: 20px; height: 20px;'></td>";
   tr.innerHTML += td;
  }
  table.appendChild(tr);
 }
 document.body.insertBefore(table, document.getElementsByTagName("script")[0]);
}

// 初始化蛇
function initSnake() {
 var x = Math.floor(Math.random() * 20);
 var y = Math.floor(Math.random() * 20);
 var initA = document.getElementsByClassName("box-" + y + "-" + x)[0];
 snakeHead = initA; //蛇头
 var b = initBFn(x, y);
 var initB = document.getElementsByClassName(b)[0];
 arraySnake.push(initB);
 arraySnake.push(initA);
 initA.style.backgroundColor = "#9c9c9c";
 initB.style.backgroundColor = "#9c9c9c";
 arrayBox[y][x] = 1;
 arrayBox[b.split("-")[1]][b.split("-")[2]] = 1;
}

// 初始化蛇身
function initBFn(x, y) {
 if (x != 19 && x != 0) {
  if (y != 19 && y != 0) {
   if (Math.random() > 0.5) {
    if (Math.random() > 0.5) {
     return "box-" + y + "-" + (x + 1);
    } else {
     return "box-" + y + "-" + (x - 1);
    }
   } else {
    if (Math.random() > 0.5) {
     return "box-" + (y + 1) + "-" + x;
    } else {
     return "box-" + (y - 1) + "-" + x;
    }
   }
  } else if (y == 0) {
   if (Math.random() > 0.5) {
    return "box-0-" + (x + 1);
   } else {
    return "box-0-" + (x - 1);
   }
  } else if (y == 19) {
   if (Math.random() > 0.5) {
    return "box-19-" + (x + 1);
   } else {
    return "box-19-" + (x - 1);
   }
  }
 } else if (x == 0) {
  if (y != 19 && y != 0) {
   if (Math.random() > 0.5) {
    return "box-" + (y + 1) + "-0";
   } else {
    return "box-" + (y - 1) + "-0";
   }
  } else if (y == 0) {
   if (Math.random() > 0.5) {
    return "box-1-0";
   } else {
    return "box-0-1";
   }
  } else if (y == 19) {
   if (Math.random() > 0.5) {
    return "box-18-0";
   } else {
    return "box-19-1";
   }
  }
 } else if (x == 19) {
  if (y != 19 && y != 0) {
   if (Math.random() > 0.5) {
    return "box-" + (y + 1) + "-19";

   } else {
    return "box-" + (y - 1) + "-19";
   }
  } else if (y == 0) {
   if (Math.random() > 0.5) {
    return "box-1-19";
   } else {
    return "box-0-18";
   }
  } else if (y == 19) {
   if (Math.random() > 0.5) {
    return "box-18-19";
   } else {
    return "box-19-18";
   }
  }
 }
}

// 随机产生食物食物
function randomFood() {
 var x = Math.floor(Math.random() * 20);
 var y = Math.floor(Math.random() * 20);
 if (!arrayBox[y][x]) {
  document.getElementsByClassName("box-" + y + "-" + x)[0].style = "background-color:#9c9c9c;border-radius:50%";
  arrayBox[y][x] = 1;
  food = document.getElementsByClassName("box-" + y + "-" + x)[0];
 } else {
  addSnakeLength();
 }
}

// 开始游戏
function gameStart(arraySnake) {
 var Ax = arraySnake[1].className.split("-")[2];
 var Ay = arraySnake[1].className.split("-")[1];
 var Bx = arraySnake[0].className.split("-")[2];
 var By = arraySnake[0].className.split("-")[1];
 if (Ay == By) {
  if (Ax > Bx) {
   moveRight();
  } else {
   moveLeft()
  }
 } else {
  if (Ay > By) {
   moveDown()
  } else {
   moveUp()
  }
 }
}


// 初始化运动,(方向:右左上下)
function moveRight() {
 timekey = setInterval(function () {
  var nextBox = document.getElementsByClassName("box-" + arraySnake[arraySnake.length - 1].className.split("-")[1] + "-" + (parseInt(arraySnake[arraySnake.length - 1].className.split("-")[2]) + 1))[0];
  if (nextBox) {
   arrayBox[arraySnake[arraySnake.length - 1].className.split("-")[1]][(parseInt(arraySnake[arraySnake.length - 1].className.split("-")[2]) + 1)] = 1;
   nextBox.style.backgroundColor = "#9c9c9c";
   arraySnake.push(nextBox);
   arrayBox[arraySnake[0].className.split("-")[1]][arraySnake[0].className.split("-")[2]] = 0;
   arraySnake[0].style.backgroundColor = "#fff";
   arraySnake.shift();
   eatFood();
  }
 }, 200);
}

function moveLeft() {
 timekey = setInterval(function () {
  var nextBox = document.getElementsByClassName("box-" + arraySnake[arraySnake.length - 1].className.split("-")[1] + "-" + (parseInt(arraySnake[arraySnake.length - 1].className.split("-")[2]) - 1))[0];
  if (nextBox) {
   arrayBox[arraySnake[arraySnake.length - 1].className.split("-")[1]][(parseInt(arraySnake[arraySnake.length - 1].className.split("-")[2]) - 1)] = 1;
   nextBox.style.backgroundColor = "#9c9c9c";
   arraySnake.push(nextBox);
   arrayBox[arraySnake[0].className.split("-")[1]][arraySnake[0].className.split("-")[2]] = 0;
   arraySnake[0].style.backgroundColor = "#fff";
   arraySnake.shift();
   eatFood();
  }
 }, 200);
}

function moveUp() {
 timekey = setInterval(function () {
  var nextBox = document.getElementsByClassName("box-" + (parseInt(arraySnake[arraySnake.length - 1].className.split("-")[1]) - 1) + "-" + arraySnake[arraySnake.length - 1].className.split("-")[2])[0];
  if (nextBox) {
   arrayBox[(parseInt(arraySnake[arraySnake.length - 1].className.split("-")[1]) - 1)][arraySnake[arraySnake.length - 1].className.split("-")[2]] = 1;
   nextBox.style.backgroundColor = "#9c9c9c";
   arraySnake.push(nextBox);
   arrayBox[arraySnake[0].className.split("-")[1]][arraySnake[0].className.split("-")[2]] = 0;
   arraySnake[0].style.backgroundColor = "#fff";
   arraySnake.shift();
   eatFood();
  }
 }, 200);
}

function moveDown() {
 timekey = setInterval(function () {
  var nextBox = document.getElementsByClassName("box-" + (parseInt(arraySnake[arraySnake.length - 1].className.split("-")[1]) + 1) + "-" + arraySnake[arraySnake.length - 1].className.split("-")[2])[0];
  if (nextBox) {
   arrayBox[(parseInt(arraySnake[arraySnake.length - 1].className.split("-")[1]) + 1)][arraySnake[arraySnake.length - 1].className.split("-")[2]] = 1;
   nextBox.style.backgroundColor = "#9c9c9c";
   arraySnake.push(nextBox);
   arrayBox[arraySnake[0].className.split("-")[1]][arraySnake[0].className.split("-")[2]] = 0;
   arraySnake[0].style.backgroundColor = "#fff";
   arraySnake.shift();
   eatFood();
  }
 }, 200);
}

// 键盘操作拐弯
document.addEventListener("keydown", function (e) {
 if (e.code == "ArrowDown") {
  turnDown();
 } else if (e.code == "ArrowUp") {
  turnUp();
 } else if (e.code == "ArrowLeft") {
  turnLeft();
 } else if (e.code == "ArrowRight") {
  turnRight();
 }
}, false);

// 下拐
function turnDown() {
 if (arraySnake[arraySnake.length - 1].className.split("-")[1] == arraySnake[arraySnake.length - 2].className.split("-")[1]) {
  clearInterval(timekey);
  moveDown();
 }
}
// 下拐
function turnUp() {
 if (arraySnake[arraySnake.length - 1].className.split("-")[1] == arraySnake[arraySnake.length - 2].className.split("-")[1]) {
  clearInterval(timekey);
  moveUp();
 }
}
// 左拐
function turnLeft() {
 if (arraySnake[arraySnake.length - 1].className.split("-")[2] == arraySnake[arraySnake.length - 2].className.split("-")[2]) {
  clearInterval(timekey);
  moveLeft();
 }
}
// 右拐
function turnRight() {
 if (arraySnake[arraySnake.length - 1].className.split("-")[2] == arraySnake[arraySnake.length - 2].className.split("-")[2]) {
  clearInterval(timekey);
  moveRight();
 }
}
// 蛇吃食物
function eatFood() {
 var temp = food;
 if (arrayBox[food.className.split("-")[1]][food.className.split("-")[2]] == 0) {
  randomFood();
  addSnakeLength(temp);
 }
}
// 增加长度在蛇尾
function addSnakeLength(temp) {
 arraySnake.unshift(temp);
}

全程独自敲下来,敲了两个多小时,基本功能都实现了,由于没有参考任何东西,所以有很多很多需要优化的地方,点个赞吧

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

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

Javascript 相关文章推荐
js树形控件脚本代码
Jul 24 Javascript
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
用js控制组织结构图可以任意拖拽到指定位置
Jan 17 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
jquery mobile开发常见问题分析
Jan 21 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
Bootstrap表单制作代码
Mar 17 Javascript
深入理解vue.js中的v-if和v-show
Jun 22 Javascript
koa socket即时通讯的示例代码
Sep 07 Javascript
vue中axios封装使用的完整教程
Mar 03 Vue.js
threejs太阳光与阴影效果实例代码
Apr 05 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 #Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 #Javascript
解决vant-UI库修改样式无效的问题
Nov 03 #Javascript
解决vant title-active-color与title-inactive-color不生效问题
Nov 03 #Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 #Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 #Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
Nov 03 #Javascript
You might like
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
python绘制简单折线图代码示例
2017/12/19 Python
详解python:time模块用法
2019/03/25 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python 递归相关知识总结
2021/03/03 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
银行实习生的自我评价
2013/12/09 职场文书
春节联欢会主持词
2014/03/24 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
goland 设置project gopath的操作
2021/05/06 Golang