javascript实现别踩白块儿小游戏程序


Posted in Javascript onNovember 22, 2015

最近有朋友找我用JS帮忙仿做一个别踩白块的小游戏程序,但他给的源代码较麻烦,而且没有注释,理解起来很无力,我就以自己的想法自己做了这个小游戏,主要是应用JS对DOM和数组的操作。

javascript实现别踩白块儿小游戏程序

程序思路:如图:将游戏区域的CSS设置为相对定位、溢出隐藏;两块“游戏板”上分别排布着24块方格,黑色每行随机产生一个,“游戏板”向下滚动并交替显示,将每个操作板的黑块位置存入数组,每次点击时将数组pop出来进行比对(我觉得亮点在这……)。

这里是游戏的GitHub地址,大家可以到里点击中部菜单最右边的的Download ZIP按钮下载到桌面一试,HTML和JS,无需服务器。

以下是具体实现,关键部分有注释。

HTML部分:

<!DOCTYPE html>

<html>

<head><title>别踩白块</title></head>

<body>

<div id="gameZone"><div id="boardb" style="position: absolute;top: 0px;"></div></div>//初始化一个boardb,使ab同时存在

</body>

</html>

CSS部分:

*{margin: 0px;padding: 0px;box-sizing: border-box;}  //简单的reset一下,并用box-sizing设置盒子尺寸将边框也计算进去,便于后面计算小方块位置
#gameZone{width: 302px;height: 602px;border: 1px solid green;margin: 20px auto;position: relative;overflow: hidden;} //游戏区域,多两个像素是为了除去边框外还有足够的300*600的空间
.square{width: 75px;height: 100px;float: left;border: 1px solid black;}
.squareBlack{width: 75px;height: 100px;border: 1px solid black;float: left;background: black;}//每个小方块为75*100,并且设置黑色小方块的背景色。

JS部分:

 这里分函数介绍:

全局变量初始化

var loc=600;//黑块落地失败判定

var count=0;//初始化击中黑块总数

var locArr=[];//初始化游戏板上黑块位置的

var order=(function(){


var ord="A";



return function(){



if(ord=='boarda')ord='boardb';



else ord='boarda';



return ord;

}

})()

//用闭包函数使每次创建的游戏板的ID为boarda与boardb,其实用一个全局变量也行,不过为了有点逼格。。。

每次点击判定结果的函数

function judge(){


var num=this.id.substr(3)//获取元素的ID号



if(num!=locArr.pop()){ //与位置数组pop出的对比





clearTimeout(timer);





alert("你的得分为:"+count+"分!");





return; //失败清除定时器,结算分数。



}else{





loc+=100; 





this.style.background="silver";





count+=1;//成功将落地标志加方格的高度,将方格背景色改变一下,击中数+1



}



if(count!=0&&count%15==0){





clearTimeout(timer);





newtimer=50-count/15*5;





timer=setInterval('fall()',newtimer);



}//每击中15个后将速度加快一点,这个式子可自行定义。

}

产生大框中小黑框位置的随机数,每次创建游戏板时调用此函数,根据产生数定义小黑块的位置

function generateRand(){


var numArr=[];



for(var j=0;j<6;j++){





var num=Math.floor(Math.random()*4)+j*4;





numArr.push(num);



}



return numArr;

}

每次调用在游戏区域的上方生成一个待往下滚动的游戏板,并将其黑色的部分的数字PUSH进locArr中

function drawBoard(){


var temArr=generateRand();//这里应用一个临时的位置数组,为了防止两块游戏板之间的位置冲突。



locArr=temArr.concat(locArr);//将临时数组相连到全局位置数组中



var board=document.createElement('div');



board.setAttribute('id',order());



board.style.position="absolute";



board.style.top='-600px';



for(var i=0;i<24;i++){





var ele=document.createElement('div');





ele.setAttribute('id',"ele"+i);





if(temArr.indexOf(i)>-1){  //判断当前创建的小方块的ID序列是否属于临时位置数组







ele.setAttribute('class','squareBlack')





}else{







ele.setAttribute('class','square');





}





ele.addEventListener('click',judge,false); //给每一个小方格添加点击判定函数judge





board.appendChild(ele);



}



var gameZone=document.getElementById('gameZone');



gameZone.appendChild(board);

}

找到脚本中存在的两个游戏板,使其往下滚动

function fall(){


gameZone=document.getElementById('gameZone');



var boarda=document.getElementById('boarda');//因为ab两个游戏板全局一直存在,所以不需要定义找不到时的逻辑



var anowtop=parseInt(boarda.style.top);//因为获取到的top位置是xxxpx类型,所以用一个parseInt()将其转换为整数便于处理。



if(anowtop==595){ //这里数目为595而不是600是因为在这一帧删除后,下一帧正好600px,刚好使两块游戏板衔接完好。





gameZone.removeChild(boarda);





drawBoard();//删除游戏区域的游戏板,并在最上方新生成一个。



}



anowtop+=5;



boarda.style.top=anowtop+"px";



var boardb=document.getElementById('boardb');



var bnowtop=parseInt(boardb.style.top);



if(bnowtop==595){





gameZone.removeChild(boardb);





drawBoard();



}



bnowtop+=5;



boardb.style.top=bnowtop+"px";



loc-=5;



if(loc==0){





clearTimeout(timer);





alert("你的得分为:"+count+"分!");





return;



} //每一帧将落地判定减5,当落地判定为0时表示落地,结算分数。

}

将主体调用写在window.onload函数里,使得页面的游戏区域加载完成后再调用函数。

window.onload=function(){


drawBoard();



fall();



var timer=setInterval('fall()',50);

}

游戏扩展:

增加页面UI:因为一开始的HTML特别简单,所以UI也很好修改,设置按钮,点击触发开始函数。

改变游戏难度:修改setInterval的值,也可以对judge函数内的间隔数目进行修改,或将下落加速的表达式优化一下。

增加比分排行等:用ajax连接服务器,在游戏结束后将结果写入数据库,并引用数据中的排行榜。

改为街机模式:去除定时,修改judge函数,使其每次点击游戏板下落一个小方格的高度。设置总数,开始计时,结束计时。

Javascript 相关文章推荐
JavaScript事件委托技术实例分析
Feb 06 Javascript
javascript创建函数的20种方式汇总
Jun 23 Javascript
jquery选择器简述
Aug 31 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
Jan 23 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
在javascript中使用com组件的简单实现方法
Aug 17 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
Iscrool下拉刷新功能实现方法(推荐)
Jun 26 Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
解决jquery插件:TypeError:$.browser is undefined报错的方法
Nov 21 #Javascript
jquery实现select选择框内容左右移动代码分享
Nov 21 #Javascript
分享经典的JavaScript开发技巧
Nov 21 #Javascript
jQuery实现分隔条左右拖动功能
Nov 21 #Javascript
超详细的javascript数组方法汇总
Nov 21 #Javascript
javascript实现动态统计图开发实例
Nov 21 #Javascript
js实现索引图片切换效果
Nov 21 #Javascript
You might like
PHP获取文件后缀名的三个函数
2012/10/15 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
Node.js事件驱动
2015/06/18 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
urllib2自定义opener详解
2014/02/07 Python
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python pytest进阶之fixture详解
2019/06/27 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
用python实现一个简单的验证码
2020/12/09 Python
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
实习教师自我鉴定
2013/09/27 职场文书
医德医魂心得体会
2014/09/11 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python