俄罗斯方块
JavaScript 编程的俄罗斯方块游戏,点击开始游戏按钮,或者复制下面的代码,粘贴在文本编辑器中保存为网页文件(.html),浏览器打开该文件就可以开始玩游戏了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <html><head></head><body> 2 <div id="box" style="width:252px;font:25px/25px 宋体;background:#000;color:#9f9;border:#999 20px ridge;text-shadow:2px 3px 1px #0f0;"></div> 3 <script> 4 var map=eval("["+Array(23).join("0x801,")+"0xfff]");//Array共23行3位16进制数 5 var tatris=[[0x6600],[0x2222,0xf00],[0xc600,0x2640],[0x6c00,0x4620],[0x4460,0x2e0,0x6220,0x740],[0x2260,0xe20,0x6440,0x4700],[0x2620,0x720,0x2320,0x2700]];//七种方块分别不同的方向数组 6 var keycom={"38":"rotate(1)","40":"down()","37":"move(2,1)","39":"move(0.5,-1)"};//定义按键 7 var dia, pos, bak, run; 8 function start(){ 9 dia=tatris[~~(Math.random()*7)]; //~~去小数部分(取整)随机方块形状 10 bak=pos={fk:[],y:0,x:4,s:~~(Math.random()*4)};//fk方块形状,xy初始坐标,s随机方向 11 rotate(0); 12 } 13 function over(){ 14 document.onkeydown=null; 15 clearInterval(run); 16 alert("GAME OVER"); 17 } 18 function update(t){ 19 bak={fk:pos.fk.slice(0),y:pos.y,x:pos.x,s:pos.s};//pos-->bak 20 if(t) return; 21 for(var i=0,a2=""; i<22; i++) 22 a2+=map[i].toString(2).slice(1,-1)+"<br/>"; 23 //a2为显示矩阵,取22行,toString(2)转为二进制(12位,第0位和第11位为1,中间为0),slice()取第1位至第10位全0 24 for(var i=0,n; i<4; i++) 25 if(/([^0]+)/.test(bak.fk[i].toString(2).replace(/1/g,"\u25a1"))) 26 a2=a2.substr(0,n=(bak.y+i+1)*15-RegExp.$_.length-4)+RegExp.$1+a2.slice(n+RegExp.$1.length); 27 //fk中的1替换为空心方块,([^0]+)是查找字符串中不是0的正则表达式,然后把fk插入a2正确的位置 28 document.getElementById("box").innerHTML=a2.replace(/1/g,"\u25a0").replace(/0/g,"\u3000"); 29 //"\u25a1"空心块;"\u25a0"实心块;"\u3000"空白格 30 } 31 function is(){ 32 for(var i=0; i<4; i++) 33 if((pos.fk[i]&map[pos.y+i])!=0) return pos=bak;//如果方块下落的位置已有方块,则方块落地 34 } 35 function rotate(r){ 36 var f=dia[pos.s=(pos.s+r)%dia.length];//f为一种方块形状,r=1旋转90度 37 for(var i=0; i<4; i++) 38 pos.fk[i]=(f>>(12-i*4)&15)<<pos.x;//生成方块的形状数组fk[] 39 update(is()); 40 } 41 function down(){ 42 ++pos.y;//方块下移 43 if(is()){ 44 for(var i=0; i<4 && pos.y+i<22; i++) 45 if((map[pos.y+i]|=pos.fk[i])==0xfff) 46 map.splice(pos.y+i,1), map.unshift(0x801);//如果一行全为1,则消除一行 47 if(map[1]!=0x801) return over();//第1行如果不空,则GameOver 48 start(); 49 } 50 update(); 51 } 52 function move(t,k){ 53 pos.x+=k; 54 for(var i=0; i<4; i++) 55 pos.fk[i]*=t; 56 update(is()); 57 } 58 document.onkeydown=function(e){ 59 eval(keycom[(e?e:event).keyCode]);//按键事件 60 }; 61 start(); 62 run=setInterval("down()",400);//每400毫秒下落1行 63 </script> 64 </body></html>