分类

学习笔记 [17]
渗透测试 [4]
一些杂文 [14]
coding [16]
漏洞信息 [17]
技术文章 [15]
开发文档 [8]
个人作品 [5]
PS:个人作品在各种下载栏目均有下载

站内搜索

日历

«  July 2012  »
Su Mo Tu We Th Fr Sa
1234567
891011121314
15161718192021
22232425262728
293031

访问统计(起于2010/10/2)

访问统计
PortWatcher's Blog
Monday, 2025-06-30, 3:00 AM
Welcome Guest
Main | Registration | Login | RSS

Blog

Main » 2012 » July » 03 » js实现俄罗斯方块
12:33 PM
js实现俄罗斯方块
来自网络


Code

<style>.c {margin :1px;width:19px;height:19px;background:red;position:absolute;}
.d {margin :1px;width:19px;height:19px;background:gray;position:absolute;}
.f {top:0px;left:0px;background:black;position:absolute;}
</style>
<body></body><html>
<script>
  var over=false,shapes=("0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2").split(";");
  function create(tag,css){
  var elm=document.createElement(tag);
  elm.className = css;
  document.body.appendChild(elm);
  return elm;}
  function Tetris(c, t, x, y){
  var c=c?c:"c";
  this.divs = [create("div",c),create("div",c),create("div",c),create("div",c)];
  this.reset = function(){
  this.x = typeof x != 'undefined'?x:3;
  this.y = typeof y != 'undefined'?y:0;
  this.shape = t?t:shapes[Math.floor(Math.random()*(shapes.length-0.00001))].split(",");
  this.show();
  if(this.field&&this.field.check(this.shape,this.x,this.y,'v')=='D'){
  over=true;
  this.field.fixShape(this.shape,this.x,this.y);
  alert('game over');}}
  this.show = function(){
  for(var i in this.divs){
  this.divs[i].style.left = (this.shape[i*2]*1+this.x)*20+'px';
  this.divs[i].style.top = (this.shape[i*2+1]*1+this.y)*20+'px';}}
  this.field=null;
  this.hMove = function(step){
  var r = this.field.check(this.shape,this.x- -step,this.y,'h');
  if(r!='N'&&r==0){
  this.x-=-step;
  this.show();}}
  this.vMove = function(){
  if(this.field.check(this.shape,this.x,this.y- -1,'v')=='N'){
  this.y++;
  this.show();}
  else{
  this.field.fixShape(this.shape,this.x,this.y);
  this.field.findFull();
  this.reset();}}
  this.rotate = function(){
  var s=this.shape;
  var newShape=[3-s[1],s[0],3-s[3],s[2],3-s[5],s[4],3-s[7],s[6]];
  var r = this.field.check(newShape,this.x,this.y,'h');
  if(r=='D')return;
  if(r==0){
  this.shape=newShape;
  this.show();}
  else if(this.field.check(newShape,this.x-r,this.y,'h')==0){
  this.x-=r;
  this.shape=newShape;
  this.show();}}
  this.reset();}
  function Field(w,h){
  this.width = w?w:10;
  this.height = h?h:20;
  this.show = function(){
  var f = create("div","f")
  f.style.width=this.width*20+'px';
  f.style.height=this.height*20+'px';}
  this.findFull = function(){
  for(var l=0;l<this.height;l++){
  var s=0;
  for(var i=0;i<this.width;i++){
  s+=this[l*this.width+i]?1:0;}
  if(s==this.width){
  this.removeLine(l);}}}
  this.removeLine = function(line){
  for(var i=0;i<this.width;i++){
  document.body.removeChild(this[line*this.width+i]);}
  for(var l=line;l>0;l--){
  for(var i=0;i<this.width;i++){
  this[l*this.width- -i]=this[(l-1)*this.width- -i];
  if(this[l*this.width- -i])this[l*this.width- -i].style.top = l*20+'px';}}}
  this.check = function(shape, x, y, d){
  var r1=0,r2='N';
  for(var i=0;i<8;i+=2){
  if(shape[i]- -x < 0 && shape[i]- -x <r1)
  {r1 = shape[i]- -x;}
  else if(shape[i]- -x>=this.width && shape[i]- -x>r1)
  {r1 = shape[i]- -x;}
  if(shape[i+1]- -y>=this.height || this[shape[i]- -x- -(shape[i+1]- -y)*this.width])
  {r2='D'}}
  if(d=='h'&&r2=='N')return r1>0?r1-this.width- -1:r1;
  else return r2;}
  this.fixShape = function(shape,x,y){
  var d=new Tetris("d",shape,x,y);
  d.show();
  for(var i=0;i<8;i+=2){
  this[shape[i]- -x- -(shape[i+1]- -y)*this.width]=d.divs[i/2];}}}
  var f = new Field();
  f.show();
  var s = new Tetris();
  s.field = f;
  s.show();
  window.setInterval("if(!over)s.vMove();",500);
  document.onkeydown = function(e){
  if(over)return;
  var e = window.event ? window.event : e;
  switch(e.keyCode){
  case 38: //up
  s.rotate();
  break;
  case 40: //down
  s.vMove();
  break;
  case 37: //left
  s.hMove(-1);
  break;
  case 39: //right
  s.hMove(1);
  break;}}
</script>
Category: coding | Views: 475 | Added by: Jury | Rating: 0.0/0
Total comments: 0
Name *:
Email *:
Code *: