ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:61.82KB ,
资源ID:10893124      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10893124.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JS实战之俄罗斯方块详解.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

JS实战之俄罗斯方块详解.docx

1、JS实战之俄罗斯方块详解目录俄罗斯方块编写思路 2纯净代码 2代码注释 4程序一;简单计算器 8程序二,九九乘法表 11俄罗斯方块编写思路要实现一个功能 首先要明确这个功能有哪些动作,然后分解动作,一一实现俄罗斯方块 要分为下面这几块场景地图、俄罗斯方块图案、随机生成俄罗斯方块、俄罗斯方块下落、左右移动、旋转、检查方块是否与场景重合,是否到底,是否与以后图案重合、更新场景,以及游戏结束,大致这么几块内容,纯净代码下面附上原有代码以代码分析注:这个适合有一定JS编程基础的人来看原有60行代码:只可以实现简单的俄罗斯方块功能,没有暂停,保存,重新开始,等级,调节降落速度这些。画面如下;var ma

2、p=eval(+Array(23).join(0x801,)+0xfff);var tatris=0x6600,0x2222,0xf00,0xc600,0x2640,0x6c00,0x4620,0x4460,0x2e0,0x6220,0x740,0x2260,0xe20,0x6440,0x4700,0x2620,0x720,0x2320,0x2700;var keycom=38:rotate(1),40:down(),37:move(2,1),39:move(0.5,-1);var dia, pos, bak, run;function start() dia=tatris(Math.rand

3、om()*7); bak=pos=fk:,y:0,x:4,s:(Math.random()*4); rotate(0);function over() document.onkeydown=null; clearInterval(run); alert(GAME OVER);function update(t) bak=fk:pos.fk.slice(0),y:pos.y,x:pos.x,s:pos.s; if(t) return; for(var i=0,a2=; i22; i+) a2+=mapi.toString(2).slice(1,-1)+; for(var i=0,n; i4; i

4、+) if(/(0+)/.test(bak.fki.toString(2).replace(/1/g,u25a1) a2=a2.substr(0,n=(bak.y+i+1)*15-RegExp.$_.length-4)+RegExp.$1+a2.slice(n+RegExp.$1.length); document.getElementById(box).innerHTML=a2.replace(/1/g,u25a0).replace(/0/g,u3000);function is() for(var i=0; i4; i+) if(pos.fki&mappos.y+i)!=0) return

5、 pos=bak;function rotate(r) var f=diapos.s=(pos.s+r)%dia.length; for(var i=0; i(12-i*4)&15)pos.x; update(is();function down() +pos.y; if(is() for(var i=0; i4 & pos.y+i22; i+) if(mappos.y+i|=pos.fki)=0xfff) map.splice(pos.y+i,1), map.unshift(0x801); if(map1!=0x801) return over(); start(); update();fu

6、nction move(t,k) pos.x+=k; for(var i=0; i4; i+) pos.fki*=t; update(is();document.onkeydown=function(e) eval(keycom(e?e:event).keyCode);start();run=setInterval(down(),400);代码注释下面是带注释的代码:水平有限,只能到这一步#box width: 252px; font: 25px/25px 宋体;/* style为normal size 为25像素 行高为25像素 字体为宋体*/ background: #000; color

7、: #99FF99; border: #999 20px ridge;/*根据color的值画3D凸槽。线宽为20像素的999颜色的3D凸槽*/ text-shadow: 2px 3px 1px #0f0;/*字体阴影模糊效果 由颜色、水平方向、垂直方向、模糊效果的作用距离*/ var map=eval(+Array(23).join(0x801,)+0xfff);/eval的功能是把字符串编程实际运行时的JS代码,eval检查JS代码并执行,并赋值给map。map 顾名思义就是地图 也就是说先把地图给出来。array是存储数组中元素的个数,23就是说数组中一共有23个元素。join是用于把数

8、组中的所有元素放入一个字符创,例子中是放入了“0x801,”这个字符串,最后以“0xfff为结尾”组合成数组如下所示。/var map=0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0xfff/把十六进制的数字换算成二进制如下/100000000001 对应16进制0x801/100000000001 对应16进制0x801/100000000001 对应16进制0x801/10

9、0000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801/100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16

10、进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801 /100000000001 对应16进制0x801/111111111111 对应16进制0xfff /地图为U型地图 数字1包围的区域为数据存贮区 22行 10列var tatris=0x6600, 0x2222,0x0f00, 0xc600,0x2640, 0x6c0

11、0,0x4620, 0x4460,0x2e0,0x6220,0x740, 0x2260,0xe20,0x6440,0x4700, 0x2620,0x720,0x2320,0x2700;/这个数组里面定义的是方块的7种形状(即7个子数组),二进制分四行表示 /0x6600 0x2222 0xf00 /0110 0010 1111 /0110 0010 0000 /0000 0010 0000 /0000 0010 0000/0xc600 0x2640 0x6c00 0x4620/1100 0010 0110 0100/0110 0110 1100 0110/0000 0100 0000 0010

12、/0000 0000 0000 0000/其余同理 太累了 不想写了 可以自己写着试试var keycom= 38:rotate(1), 40:down(), 37:move(2,1), 39:move(0.5,-1);/38,40,37,39对应着上下左右按键的数值,将他们与需要调用的函数一一对应。var dia, pos, bak, run;/dia存储选取的俄罗斯方块类型;pos是正在下落的方块的团对象;bak存储pos团对象的备份,在需要的时候可以实现对于pos运动的撤销。function start() dia=tatris(Math.random()*7);/在7种图案中随机选择一

13、种,在JS中是位取反运算,间接实现了浮点数到整形的转换,也就是取整。因为取反应该是只能对整数取反。 bak=pos=fk:,/一个数组,存贮的是图案转化之后的二进制数据 y:0,/初始Y坐标 x:4,/初始X坐标 s:(Math.random()*dia.length);/在选中的方块类型中随机选择一个团 /pos与bak分别是前后台,实现俄罗斯方块的备份与撤销 rotate(0);/初始不旋转/ 在游戏场景上方产生一个新的俄罗斯方块function over() document.onkeydown=null;/撤销onkeydown事件 clearInterval(run);/清理之前设置

14、的方块下落定时器 alert(GAME OVER);/显示游戏结束/游戏结束function update(t) bak=fk:pos.fk.slice(0),y:pos.y,x:pos.x,s:pos.s;/把pos备份到bak中,slice(0)意为从0号开始到结束的数组,即全部数组 if(t) return; for(var i=0,a2=; i22; i+) a2+=mapi.toString(2).slice(1,-1)+;/2是参数,制定基地,2的话就是返会二进制串的形式。slice(-1,1)参数-1,1作用是取除了墙之外的中间场景数据 /根据map进行转换,得到的是01加上换行

15、的字符串 for(var i=0,n; i4; i+) if(/(0+)/.test(bak.fki.toString(2).replace(/1/g,u25a1)/这里涉及到正则表达式 我还没有学到,只能复制别人的 /对于a2字符串进行替换,并且显示在div之中,这里是应用 /u25a0是黑色方块 u3000是空,这里实现的是替换div之中的文本,由数字替换成为两种方块或者空白 a2=a2.substr(0,n=(bak.y+i+1)*15-RegExp.$_.length-4)+RegExp.$1+a2.slice(n+RegExp.$1.length);/这里是对字符串替换处理,把原始的

16、0,1换成方块字符串 document.getElementById(box).innerHTML=a2.replace(/1/g,u25a0).replace(/0/g,u3000);/此函数用于绘制场景的字符串,并且写入到div中完成游戏场景的更新function rotate(r) var f=diapos.s=(pos.s+r)%dia.length;/把pos.s值与r相加然后和dia.lenght求余,赋值给pos.s,实现旋转 for(var i=0; i(12-i*4)&0x000f)pos.x;/初生的图案是16进制数据转换成16位二进制数据,每4位一行写入fk数组中, up

17、date(is();/更新场景/旋转图案,function is() for(var i=0; i4; i+) if(pos.fki&mappos.y+i)!=0) return pos=bak; /对当前俄罗斯方块图案进行逐行分析,把俄罗斯方块图案的每一行的二进制与场景内的二进制进行位与(位与:相同才可以,具体自己查),如果结果非0(即都是1,说明与墙重合了或者是落底了),那么就证明图案与场景中的实体重合了,重合了就把之前备份的bak来实现对pos的恢复 /如果没有重合,那么这里默认返回空。 /判断有没有重叠function down() +pos.y;/Y坐标增加,相当于下落 if(is(

18、) for(var i=0; i4 & pos.y+i22; i+) if(mappos.y+i|=pos.fki)=0xfff)/如果行满了 map.splice(pos.y+i,1); map.unshift(0x801);/首航添加一行0x801,unshift的作用就是在数组的第0好元素之前添加新的元素,新的元素作为数组首元素 if(map1!=0x801) return over();/如果最上面一行不是空行,则执行over()命令 start();/重新产生一个新的俄罗斯方块 /如果方块与场景重合的话is(), update();/全局更新/方块下落function move(t,

19、k) pos.x+=k; for(var i=0; i4; i+) pos.fki*=t;/*=t实现了左右平移 update(is();/位移完了 判断是否重合,重合的话就不更新场景/左右位移document.onkeydown=function(e) eval(keycom(e?e:event).keyCode);/eval生成的代码在这里执行start();run=setInterval(down(),500);/定时器,500ms下落一次下面附上两个外带小程序:程序一;简单计算器功能可以计算简单的+-*/可以清楚,其余功能没有代码如下计算器 * padding: 0; margin:

20、1px; .numberkey cursor: pointer; width: 40px; height: 30px; border-bottom: solid 1px #FFFFFF; background: #2371D3; color: #ffffff; text-align: center; font-weight: bold; font-family: 黑体; #display width:100%; height: 30px; border-bottom: solid 4px #2371D3; color: #193D83; font-family: 黑体; font-weight

21、: bold; padding-left: 2px; #equality cursor: pointer; width: 40px; height: 100%; background: #2371D3; border: solid 1px #FFFFFF; color: #ffffff; text-align: center; font-weight: bold; font-family: 黑体; #calculater margin: auto; margin-top: 30px; border: solid 6px #2371D3; border-spacing: 2px; 0 1 2 3

22、 + 4 5 6 - = 7 8 9 * +/- 0 . / var results=; var calresults=; function calculater()if(event.srcElement.innerText=) results=; display.innerText=0; return; if(event.srcElement.innerText=) return; results+=event.srcElement.innerText; display.innerText=results; function resultcalcaulte() calresults=eval(results); display.innerText=calresults; 界面如下:程序二,九九乘法表九九乘法表 table margin-top: 100px; var str=; str+=; for (var i=1;i=9;i+) str+=; for (var j=1;j=9;j+) if(i=j) str+=+i+*+j+=+(i*j)+; else str+=+; str +=; str +=; document.write(str); document.write();界面如下;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1