Comunidad de diseño web y desarrollo en internet online

Pequeño difícil código

Citar            
MensajeEscrito el 20 Jul 2007 02:48 pm
Hola.

Fui a parar por algún casual a esta página:

http://www.strille.net/works/mini_game_1Kb/

Es un tetris comprimido a más no poder, por lo que me está costando lo suyo comprender qué acción realiza cada variable. Son pocas lines de código para hacer algo medianamente complejo.

Ahora mismo estoy intentando entender qué acción realiza la función "c" y la utilidad del array "s", pero no soy capaz, ya que además empieza a trabajar con operadores de bit y es cuando más me pierdo.

Cualquier pequeña aportación será de agradecer (comentarlo, hacer las variables comprensibles, loquesea), ya que quisiera hacer el código entendible y colocarlo en objetos.

A ver quién se atreve, es todo un reto :lol:


Un saludo

Por [Sheer]

Claber

283 de clabLevel

1 tutorial

Genero:Masculino  

Barcelona

opera
Citar            
MensajeEscrito el 20 Jul 2007 09:29 pm
wow es imprsionante! en tan poco codigo! jaja
ya me voy a poner a destripar algo a ver si saco algo ^^

pd: hice 400 puntos xD

Por Benutti

188 de clabLevel

1 tutorial

 

NutT

msie
Citar            
MensajeEscrito el 21 Jul 2007 08:18 pm
Después de un par de días, he conseguido descifrar gran parte del código, pero sigo sin comprender como funciona el array s[ ]. Ésto es lo que tengo por ahora:

Código :

createTextField("tfPuntos", 1, 0, 300, 239, 24);
function controlBloque4x4(posX, posY, ficha, color) {
   // 4x4 bloques
   for (i=0; i<16; i++) {
      // no acabo de entender como funciona, pero si es distinto a 0, hay bloque
      if (s[i] & (1 << ficha)) {
         if (q == 300) {
            bloquesOcupados[posX+(i%4)+(posY+(i >> 2))*15] = -color;
            continue;
         }
         // control de colisión con límites y fichas    
         if (colisionFicha(posX, posY) or colisionParedInferior(posY) or colisionParedIzquierda(posX) or colisionParedDerecha(posX)) {
            return 1;
         }
         if (q<-1) {
            // al estar quieta, convertiremos la ficha (bloque x bloque) a un valor positivo
            bloquesOcupados[posX+(i%4)+(posY+(i >> 2))*15] = color;
            // si éste bloque toca el techo
            if (colisionParedSuperior(posY)) {
               juegoTerminado();
            }
         }
      }
   }
}
function juegoTerminado() {
   delete onEnterFrame;
   tfPuntos.text = puntos+"\tPress a key";
}
function colisionParedSuperior(posicionY:Number):Boolean {
   return posicionY+(i >> 2)<0;
}
function colisionParedInferior(posicionY:Number):Boolean {
   return posicionY+(i >> 2)>19;
}
function colisionParedIzquierda(posicionX:Number):Boolean {
   return posicionX+(i%4)<0;
}
function colisionParedDerecha(posicionX:Number):Boolean {
   return posicionX+(i%4)>9;
}
function colisionFicha(posicionX:Number, posicionY:Number):Boolean {
   return bloquesOcupados[posicionX+(i%4)+(posicionY+(i >> 2))*15]>0;
}
function dibujarTablero() {
   beginFill(0xeeeeee);
   lineStyle(0);
   lineTo(151, 0);
   lineTo(151, 301);
   lineTo(0, 301);
   endFill();
}
function ajustesIniciales() {
   controlCaida = 0;
   puntos = 0;
   // el array raro
   s = [4325376, 178954464, 8653312, null, 89458032, 268435455, 89520863, 83886080, 2183168, 178937791, 1615119, null, null, 167772160];
   // se registra el color para saber si hay o no
   bloquesOcupados = [];
   ficha = random(28);
   siguienteFicha = random(28);
   color = random(16777215);
   posY = -3;
   posX = 3;
}
function borrarPantalla() {
   clear();
}
tfPuntos.onKeyDown = function() {
   q = Key.getCode();
   if (!onEnterFrame) {
      ajustesIniciales();
      onEnterFrame = function () {
         tfPuntos.text = puntos;
         // izquierda
         if (q == 37) {
            posX--;
            // si colisiona, lo dejamos donde estaba
            if (controlBloque4x4(posX, posY, ficha, color)) {
               posX++;
            }
         }
         // arriba (rotación)  
         if (q == 38) {
            q = ficha++;
            if (!(ficha%4)) {
               ficha -= 4;
            }
            // si colisiona con algo, volvemos donde estábamos
            if (controlBloque4x4(posX, posY, ficha, color)) {
               ficha = q;
            }
         }
         // derecha  
         if (q == 39) {
            posX++;
            if (controlBloque4x4(posX, posY, ficha, color)) {
               posX--;
            }
         }
         q = 300;
         borrarPantalla();
         // ficha siguiente
         controlBloque4x4(11, 3, siguienteFicha, 0xeeeeee);
         // actual
         controlBloque4x4(posX, posY, ficha, color);
         dibujarTablero();
         lineStyle(1);
         // movemos, dibujamos y borramos el anterior (si existe)
         while (q--) {
            // si hay bloque
            if (bloquesOcupados[q]){
               // pintamos estando parado
               beginFill(bloquesOcupados[q]);
               // si es un bloque en movimiento (valor negativo)
               if (bloquesOcupados[q]<0) {
                  beginFill(-bloquesOcupados[q]);
                  // nos cargamos el anterior
                  delete bloquesOcupados[q];
               }
               // y movemos
               moveTo(1+(q%15)*15, 1+Math.floor(q/15)*15);
               lineTo(15+1+(q%15)*15, 1+Math.floor(q/15)*15);
               lineTo(15+1+(q%15)*15, 15+1+Math.floor(q/15)*15);
               lineTo(1+(q%15)*15, 15+1+Math.floor(q/15)*15);
               endFill();
            }
         }
         controlCaida++;
         // cae cada 3 fotogramas o si pulsamos abajo
         if (controlCaida%3 == 0 || Key.isDown(40)) {
            posY++;
            // si el bloque colisiona por la parte inferior
            if (controlBloque4x4(posX, posY, ficha, color)) {
               posY--;
               q--;
               controlBloque4x4(posX, posY, ficha, color);
               for (var cont:Number = 0; cont<20; cont++) {
                  // si es distinto a 0 (tiene el color), le sumamos 1 a x (con 10 hay linea)
                  for (x=0; bloquesOcupados[x+cont*15]; x++) {
                  }
                  // si hay linea
                  if (x == 10) {
                     bloquesOcupados.splice(cont*15, 15);
                     bloquesOcupados.unshift(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
                     puntos += x;
                  }
               }
               // pasaremos a la siguiente ficha
               ficha = siguienteFicha;
               siguienteFicha = random(28);
               color = random(16777215);
               posY = -3;
               posX = 3;
            }
         }
      };
   }
};
tfPuntos.onKeyDown();
Key.addListener(tfPuntos);



Sé que los números del array s[ ] se utilizan solamente para comprobar (en la función controlBloque4x4, anteriormente conocida como "c"), si hay bloque en la ficha pasada como parámetro, pero no entiendo el funcionamiento... ¿qué representan?

A ver si esta vez se atreve alguien más :P

Por [Sheer]

Claber

283 de clabLevel

1 tutorial

Genero:Masculino  

Barcelona

opera
Citar            
MensajeEscrito el 23 Jul 2007 02:37 pm
Ya está, he conseguido descifrar hasta el más mínimo detalle; me he sorprendido a mí mismo :lol:

Respecto a al array s[ ], se utiliza para los llamados "flags". Para los que quieran saber de que va, les dejo con el post donde se explica:

http://www.cristalab.com/foros/t42836.html


Un saludo ^^

Por [Sheer]

Claber

283 de clabLevel

1 tutorial

Genero:Masculino  

Barcelona

opera
Citar            
MensajeEscrito el 23 Jul 2007 03:59 pm
:o
Vi algunas cosas de este tipo!!
Pero como lo hace! Es un genio!!
Logro imitar renderizasiones como las de los programas 3D con AS!!!

Por JaLeRu

Claber

1913 de clabLevel

7 tutoriales

Genero:Masculino  

Existo

msie

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.