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高级程序设计 读书笔记之十一 内置对象Global
Mar 07 Javascript
jquery实现的简单二级菜单效果代码
Sep 22 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
Dec 17 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
js实现3D图片环展示效果
Mar 09 Javascript
JavaScript实现购物车基本功能
Jul 21 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
jQuery中将json数据显示到页面表格的方法
May 27 jQuery
Vue中的$set的使用实例代码
Oct 08 Javascript
Vue 中 a标签上href无法跳转的解决方式
Nov 12 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
Sep 08 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
Jquery 自定义动画概述及示例
2013/03/29 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
Python-接口开发入门解析
2019/08/01 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Java中实现多态的机制
2015/08/09 面试题
别名指示符是什么
2012/10/08 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
开业庆典答谢词
2014/01/18 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
2016年元旦寄语
2015/08/17 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers