1 2 <html>3 <style type="text/css">4 .tetris{5 border-collapse: collapse;6 }7 .tetris tr td{8 width:20px;9 height:20px;10 padding: 0px;11 }12 .celda0{13 background-color: #000000;14 }15 .celda1{16 background-color: #0000FF;17 }18 .celda2{19 background-color: #FF0000;20 }21 .celda3{22 background-color: #00FF00;23 }24 .celda4{25 background-color: #FFFF00;26 }27 .celda5{28 background-color: #00FFFF;29 }30 .celda6{31 background-color: #FF00FF;32 }33 .celda7{34 background-color: #888888;35 }36 </style>37 <script>38 var velocidad=50000; //velocidad del juego39 var fpi, cpi, rot; //fila, columna y rotación de la ficha40 var tablero; //matriz con el tablero41 var pieza=0; //pieza42 var record=0; //almacena la mejor puntuación43 var lineas=0; //almacena la puntuación actual44 var pos=[ //Valores referencia de coordenadas relativas45 [0,0],46 [0,1],47 [-1,0],48 [1,0],49 [-1,-1],50 [0,-1],51 [1,-1],52 [0,-2]53 ];54 var piezas=[ //Diseño de las piezas, el primer valor de cada fila corresponde con el número de rotaciones posibles55 [4,0,1,2,3], 56 [4,0,1,5,6]57 ];58 //Genera una nueva partida inicializando las variables59 function nuevaPartida(){ 60 velocidad=50000;61 tablero=new Array(20); 62 for (var n=0;n < 20;n++){63 tablero[n]=new Array(9);64 for (var m=0;m < 9;m++){65 tablero[n][m]=0;66 }67 }68 lineas=0;69 nuevaPieza();70 }71 //Detecta si una fila columna del tablero está libre para ser ocupada72 function cuadroNoDisponible(f,c){73 if (f < 0) return false;74 return (c < 0 || c >= 9 || f >= 20 || tablero[f][c] > 0);75 }76 //Detecta si la pieza activa colisiona fuera del tablero o con otra pieza77 function colisionaPieza(){78 for (var v=1;v < 5;v++){79 var des=piezas[pieza][v];80 var pos2=rotarCasilla(pos[des]);81 if (cuadroNoDisponible(pos2 [ 0 ] +fpi, pos2 [ 1 ]+cpi)){82 return true;83 }84 }85 return false;86 }87 //Detecta si hay lineas completas y si las hay las computa y borra la linea desplazando la submatriz superior88 function detectarLineas(){89 for (var f=0;f < 20;f++){90 var contarCuadros=0;91 for (var c=0;c < 9;c++){92 if (tablero[f][c]>0){93 contarCuadros++;94 }95 }96 if (contarCuadros==9){97 for (var f2=f;f2 > 0;f2--){98 for (var c2=0;c2 < 9;c2++){99 tablero[f2][c2]=tablero[f2-1][c2];100 }101 }102 lineas++;103 }104 }105 }106 //Baja la pieza, si toca otra pieza o el suelo, saca una nueva pieza107 function bajarPieza(){108 fpi=fpi+1;109 if (colisionaPieza()){110 fpi=fpi-1;111 for (v=1;v < 5;v++){112 des=piezas[pieza][v];113 var pos2=rotarCasilla(pos[des]);114 if (pos2 [ 0 ] +fpi >= 0 && pos2 [ 0 ] +fpi < 20 &&115 pos2 [ 1 ] +cpi >=0 && pos2 [ 1 ] +cpi < 9){116 tablero[pos2 [ 0 ] +fpi][pos2 [ 1 ] +cpi]=pieza+1;117 }118 }119 detectarLineas();120 //Si hay algun cuadro en la fila 0 reinicia el juego121 var reiniciar=0;122 for (var c=0;c < 9;c++){123 if (tablero [ 0 ] [ c ] !=0){124 reiniciar=1;125 }126 }127 if (reiniciar==1){128 if (lineas > record){129 record=lineas;130 }131 nuevaPartida();132 }else{133 nuevaPieza();134 }135 }136 }137 //Mueve la pieza lateralmente138 function moverPieza(des){139 cpi=cpi+des;140 if (colisionaPieza()){141 cpi=cpi-des;142 }143 }144 //Rota la pieza según el número de rotaciones posibles tenga la pieza activa. (posición 0 de la pieza)145 function rotarPieza(){146 rot=rot+1;147 if (rot==piezas[pieza] [ 0 ] ){148 rot=0;149 }150 if (colisionaPieza()){151 rot=rot-1;152 if (rot==-1){153 rot=piezas[pieza] [ 0 ] -1;154 }155 }156 }157 //Obtiene unas coordenadas f,c y las rota 90 grados158 function rotarCasilla(celda){159 var pos2=[celda [ 0 ] , celda [ 1 ] ];160 for (var n=0;n < rot ;n++){161 var f=pos2 [ 1 ]; 162 var c=-pos2 [ 0 ] ;163 pos2 [ 0 ] =f;164 pos2 [ 1 ] =c;165 }166 return pos2;167 }168 //Genera una nueva pieza aleatoriamente169 function nuevaPieza(){170 cpi=3;171 fpi=0;172 rot=0;173 pieza=Math.floor(Math.random()*7);174 }175 //Ejecución principal del juego, realiza la animación y repinta176 function tick(){177 bajarPieza();178 pintar();179 setTimeout('tick()', velocidad/100);180 }181 //Pinta el tablero (lo genera con html) y lo plasma en un div.182 function pintar(){183 var lt=" <";184 var des;185 var html="<table class='tetris'>"186 for (var f=0;f < 20;f++){187 html+="<tr>";188 for (var c=0;c < 9;c++){189 var color=tablero[f][c];190 if (color==0){191 for (v=1;v < 5;v++){192 des=piezas[pieza][v];193 var pos2=rotarCasilla(pos[des]);194 if (f==fpi+pos2 [ 0 ] && c==cpi+pos2 [ 1 ] ){195 color=pieza+1;196 }197 }198 }199 html+="<td class='celda" + color + "'/>";200 }201 html+=lt+"/tr>";202 }203 html+=lt+"/table>";204 html+="<br />Lineas : " + lineas;205 html+="<br />Record : " + record;206 document.getElementById('tetris').innerHTML=html;207 velocidad=Math.max(velocidad-1,500);208 209 }210 //Al iniciar la pagina inicia el juego211 function eventoCargar(){212 nuevaPartida();213 setTimeout('tick()', 1);214 }215 //Al pulsar una tecla216 function tecla(e){217 e.preventDefault();218 //e.stopPropagation();219 var characterCode = (e && e.which)? e.which: e.keyCode;220 switch (characterCode){221 case 37:222 moverPieza(-1);223 break;224 case 38:225 rotarPieza();226 break;227 case 39:228 moverPieza(1);229 break;230 case 40:231 bajarPieza();232 break;233 }234 pintar();235 }236 </script>237 <body onload='eventoCargar()' onkeydown="tecla(event)">238 <div id='tetris'/>239 </body>240 </html>
Enlace
El enlace para compartir es: