原生JS实现贪吃蛇项目,附源码下载!

运行于谷歌浏览器。主要是利用了函数的封装思想,把每一个小功能分别封装在一个函数中,大大提高了代码的可扩展性!!提高了代码的可维护性!!!提高了代码的可阅读性!!!项目要求:1:有边界,碰到边界就game over。2:猎物没3秒增加一个,而且位置随机产生。3:吃一个猎物自身就增加一个元素。4:按上下左右控制移动方向,按空格决定暂停和前进。

实现思路:主要是一开始就把实现的功能封装在了一个先函数中去了,所以后续的功能增加就比较容易了。1:先画出了边界,就是实现了设置边界的函数。2:实现判断按键功能和根据按下的键盘决定移动的方向,实现了上下左右的移动功能。顺便实现了按下相反方向的键不起作用。避免了掉头自己吃自己。3:实现了猎物的随机生成功能,可以自动添加猎物:4:判断是否吃到了猎物。5:实现吃一个长一个功能,当吃一个类物是就把蛇的自身增加一个元素(都存储在数组中了,就是增加一个数组元素)。6:因为增加了蛇的长度,所以就得移动每一个的元素的位置。7:实现了是否吃到自己的功能。8:最后实现了暂停功能。

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<style type="text/css">

*{margin: 0;}

#divWallId{width: 1000px;height: 600px; background-color: navajowhite;border: 3px #000 solid;}

#divSnId{width: 10px;height: 10px; background-color: darkblue; position: absolute;top:300px; left: 500px;}

</style>

</head>

<body>

<div id="divWallId">

<div id="divSnId"></div>

</div>

</body>

<script type="text/javascript">

var divSn = document.getElementById("divSnId");

var divWall = document.getElementById("divWallId");

//存放生成猎物

var arrFood = [];

var arr = [divSn]; // 存储每个元素

var direction = "top"; // 默认向上移动

var flagStop = true;

var preDire = null;

var prePreDir = "top";

// 总时钟!!

var timerSn = setInterval( main,10);

//随机生成猎物的时钟

var timerRan =  setInterval(random,1000);

// main 函数

function main(){

//console.log(divSn.offsetTop+"    "+divSn.offsetLeft);

keyPressMove(direction);

isEat()

changeLoaction();

border();

isEatIt();

}

//判断是否吃到自己

function isEatIt(){

for(var i=2;i<arr.length;i++){

if(Math.abs(divSn.offsetTop-arr[i].offsetTop)<=0 && Math.abs(divSn.offsetLeft-arr[i].offsetLeft)<=0){

alert("GeeeeeAME OVER");

clearInterval(timerSn);

clearInterval(timerRan);

}

}

}

//判断是否吃掉

function isEat(){

for(var i=0;i<arrFood.length;i++){

if(Math.abs(divSn.offsetTop-arrFood[i].offsetTop)<=10 && Math.abs(divSn.offsetLeft-arrFood[i].offsetLeft)<=10){

//调用函数 长大

changeBiger(i);

// 移除food

divWall.removeChild(arrFood[i]);

// 移除数组中元素

arrFood.splice(i,1);

// 每个元素位置变化;

}

}

}

// 设置边界

function border(){

if(divSn.offsetTop-divWall.offsetTop<=0 || divSn.offsetTop+10-(divWall.offsetTop+divWall.offsetHeight)>=-3){

alert("GAME OVER");

clearInterval(timerSn);

clearInterval(timerRan);

}

if(divSn.offsetLeft-divWall.offsetLeft<=0 || divSn.offsetLeft+10-divWall.offsetLeft-divWall.offsetWidth>=-3){

alert("GAME OVER");

clearInterval(timerSn);

clearInterval(timerRan);

}

}

//随机生成猎物

function random(){

var foodTop = Math.floor(Math.random()*590)+3+"px";

var foodLeft = Math.floor(Math.random()*990)+3+"px";

var subFood = document.createElement("div");

subFood.style.width = "10px";

subFood.style.height = "10px";

subFood.style.backgroundColor = "red";

subFood.style.position = "absolute";

subFood.style.top = foodTop;

subFood.style.left = foodLeft;

divWall.appendChild(subFood);

arrFood.push(subFood);

}

// 移动每一个元素的位置

function changeLoaction(){

for(var i=arr.length-1;i>0;i--){

arr[i].style.top= arr[i-1].offsetTop+"px";

arr[i].style.left = arr[i-1].offsetLeft+"px";

}

}

// 吃一个长一个

function changeBiger(num){

var arrLen = arr.length;

var subFood = document.createElement("div");

subFood.style.width = "10px";

subFood.style.height = "10px";

subFood.style.backgroundColor = "darkblue";

subFood.style.position = "absolute";

subFood.style.top = arrFood[num].offsetTop+"px";

subFood.style.left = arrFood[num].offsetLeft+"px";

// 添加到数组中

arr.push(subFood);

divWall.appendChild(subFood);

//alert(arr.length);

}

//判断按键

document.onkeydown = function (event){

switch(event.keyCode){

case 37:{

if(direction!="right"){

direction = "left";

}

break;

}

case 38:{

if(direction!="bottom"){

direction = "top";

}

break;

}

case 39:{

if(direction!="left"){

direction = "right";

}

break;

}

case 40:{

if(direction!="top"){

direction = "bottom";

}

break;

}

case 32:{

if(direction!="space"){

preDire = direction;

}

direction = "space";

break;

}

}

}

// 暂停功能

document.onkeypress = function (event){

if(event.keyCode==32){

if(flagStop == true){

clearInterval(timerSn);

clearInterval(timerRan);

flagStop = false;

//alert(flagStop);

}else{

// 总时钟!!

direction = preDire;

//alert(direction);

timerSn = setInterval( main,10);

timerRan =setInterval(random,1000);

flagStop = true;

}

}

}

// 根据按下的键盘决定移动的方向

function keyPressMove(fangXiang){

//alert(fangXiang)

//console.log(divSn.offsetTop+"    "+divSn.offsetLeft);

switch(fangXiang){

case "top":{

divSn.style.top = divSn.offsetTop-1+"px";

break;

}

case "left":{

divSn.style.left = divSn.offsetLeft-1+"px";

break;

}

case "right":{

divSn.style.left = divSn.offsetLeft+1+"px";

break;

}

case "bottom":{

divSn.style.top = divSn.offsetTop+1+"px";

break;

}

}

}

</script>

</html>

时间: 2024-08-26 13:11:54

原生JS实现贪吃蛇项目,附源码下载!的相关文章

Python:游戏:贪吃蛇(附源码)

贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么画? 蛇是由一个个小方块组成的,那么我们可以用一个 list 记录每一个小方块的坐标,显示的时候将所有小方块画出来即可. 2.蛇怎么移动? 第一反应就是想蚯蚓蠕动一样,每一个方块向前移动一格,但这样做很麻烦,仔细想下,其实除了头尾,蛇的其他部分根本就没有动过,那就简单了,将下一格的坐标添加到 list 开头,并移除 list 的最后一个元素,就相当于蛇向前移动了一格. 3.如何判定游戏结束? 蛇移动超出了游戏区的范围或者碰到了

arcgis api 4.x for js 结合 Echarts4 实现统计图(附源码下载)

前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类的介绍,还有就是在线例子:esri 官网在线例子,这个也是学习 arcgis api 4.x 的好素材. 参照 arcgis api 4.x for js 地图加载多个气泡窗口展示的基础上,实现 arcgis api 4.x for js 结合 Echarts4 实现统计图,核心思路地图叠加自定义

【COCOS2D-HTML5 开发之三】示例项目附源码及运行的GIF效果图

本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d-html5/1528.html ? 点击订阅 ? 本博客最新动态!及时将最新博文通知您! Cocos2dx html5开发,对于用过2d Or -x的童鞋来说很容易,Himi这里也没有必要去再跟同学们详细的教学一遍. 所以Himi简单做了一个项目,供给大家参考,源码下载地址及GIF截图在文章最后!

8个前沿的 HTML5 &amp; CSS3 效果【附源码下载】

作为一个前沿的 Web 开发者,对于 HTML5 和 CSS3 技术或多或少都有掌握.前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身手.这篇文章挑选了8个前沿的 HTML5 & CSS3 效果,记得收藏哦:) 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. HTML5 模拟现实物理效果 Ball Pool 是一个基于 HTML5 技术的实验,模拟现实物理效果,让

创意无限!一组网页边栏过渡动画【附源码下载】

今天我们想与大家分享另一套过渡效果.这一次,我们将探讨如何实现侧边栏的过渡动画,就像我们已经在多级推出菜单中使用的.我们的想法是,以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推到一边.这个可过程中可以加入很多微妙而奇特的效果,而今天这篇文章能够给你一些启示. 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 立即下载      在线演示 因为我们希望能够在一个页面上展现所有的效果,因此我们示例的

Web 开发中很实用的10个效果【附源码下载】

在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记得收藏:) 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网

精选12个时尚的 CSS3 效果【附源码下载】

精选12个时尚的 CSS3 效果[附源码下载] 这里是精选的12个很炫的 CSS3 效果.CSS3 是对 CSS 规范的一个很大的改善和增强,它使得 Web 开发人员可以很容易的在网站中加入时尚的效果.以前很多需要编写复杂的 JavaScript 代码才能实现的效果,如今只需要简单的写几句 CSS3 代码就能实现. 超炫的 CSS3 页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 源码下载 

酷毙了!三种风格的全屏幻灯片效果【附源码下载】

今天,我们想向您展示如何创建平铺背景图像的幻灯片效果.其灵感来自于国外的一个工作室网站(围观),这个网站充满了各种有趣和创意效果,一定记得去看看. 这个幻灯片效果是由四个区域的独立移动构成,通过画面分割,同时显示出新的图片.这里需要组合使用 CSS3 的3D转换.过渡和动画功能.除了这种效果我们也将添加两个更多的变化,我们的宗旨是实现超流畅的交互体验. 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 源码下载      在线演示

【转载】Web 开发中很实用的10个效果【附源码下载】

超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.美女很养眼吧 :) 源码下载      在线演示 网页边栏过渡动画 以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推