Javascript俄罗斯方块,极简代码

为了达到最精简的写法,整个程序的运行是围绕着位操作进行的。
一共用了不到100代码(常规写法),实现了最基本的变形、下落、消除、积分的功能。

操作:
上(变形),下(加速),左(左移),右(右移),空格(落到底)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<style>
GBody {width:241px;height:401px;display:block;background-color:black;}
GSpan {background-color:gray;float:left;width:12px;height:12px;border:4px gray outset;margin:0 1 1 0;overflow:hidden;}
</style>
<script>
//By: X!ao_f QQ:120000512
var G = {
s:0,
f:[],
m:[],
v:[0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0xFFFF],
d:[[0xCC00],[0x4444,0xF0],[0x8C40,0x6C00],[0x4C80,0xC600],[0x44C0,0x8E00,0xC880,0xE200],[0x88C0,0xE800,0xC440,0x2E00],[0x4E00,0x8C80,0xE400,0x4C40]],
init:function(c){
c = c.appendChild(document.createElement("GBody"));
for(var i=0;i<240;i++){
G.f.push(c.appendChild(document.createElement("GSpan")));
}
document.οnkeydοwn=function(e){G.event(e||window.event,0)};
G.next();
setInterval("G.timeTesk()",500);
},
timeTesk:function(){
if(!G.move(G.x, G.y+1, G.t)){
var s = 0;
for(var i=0;i<20;i++){
G.v[i]=G.v[i]|G.m[i];
if(G.v[i]==0xFFF){
for(var k=i;k>0;k--){
G.v[k] = G.v[k-1];
}
G.s+=++s;
}
}
G.next();
return false;
}
G.draw();
return true;
},
move:function(x,y,t){
var m = [];
for(var k=0;k<4;k++){
m[y+k] = (G.d[G.n][t]>>(3-k)*4&0xF)<<Math.max(x,0)>>-Math.min(x,0);
if(m[y+k] & G.v[y+k]){
return false;
}
}
G.x = x;
G.y = y;
G.t = t;
G.m = m;
G.draw();
return true;
},
next:function(){
var i = 0;
G.n = parseInt(Math.random()*G.d.length);
G.t = parseInt(Math.random()*G.d[G.n].length);
while(!(G.d[G.n][G.t]>>i*4&0xF))i++;
if(!G.move(3, i-3, G.t)){
alert('Game over!');
}
},
draw:function(){
for(var i=0;i<240;i++){
if((G.v[parseInt(i/12)]>>(11-i%12))&0x1||(G.m[parseInt(i/12)]>>(11-i%12))&0x1){
G.f[i].style.visibility = '';
}else{
G.f[i].style.visibility ='hidden';
}
}
document.title = 'score:'+G.s;
},
event:function(e,t){
switch(e.keyCode){
case 37:
G.move(G.x + 1, G.y, G.t);
break;
case 39:
G.move(G.x - 1, G.y, G.t);
break;
case 38:
G.move(G.x, G.y, (G.t + 1) % G.d[G.n].length);
break;
case 40:
G.timeTesk();
break;
case 32:
while(G.timeTesk());
}
}
}
</script>
<body οnlοad='G.init(document.body);'></body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值