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 相关文章推荐
数组方法解决JS字符串连接性能问题有争议
Jan 12 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
Mar 05 Javascript
利用jquery禁止外层滚动条的滚动
Jan 05 Javascript
angular.js实现购物车功能
Oct 23 Javascript
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
小程序实现展开/收起的效果示例
Sep 22 Javascript
详解vue在项目中使用百度地图
Mar 26 Javascript
JavaScript使用面向对象实现的拖拽功能详解
Jun 12 Javascript
bootstrap table插件动态加载表头
Jul 19 Javascript
解决vue的router组件component在import时不能使用变量问题
Jul 26 Javascript
什么是SOLID
Mar 24 Javascript
解决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执行速度全攻略(下)
2006/10/09 PHP
php关联数组快速排序的方法
2015/04/17 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
javascript简易画板开发
2020/04/12 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[17:36]VG战队纪录片
2014/08/21 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python复制目录结构脚本代码分享
2015/03/06 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
大学生军训广播稿
2014/01/24 职场文书
小小的船教学反思
2014/02/21 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014企业年终工作总结
2014/12/23 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
高二语文教学反思
2016/02/16 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书