Tetris::explication

Contenu du snippet

suite a la source precedente, voici les commentaires de cette source de www.Strille.net
d'un tetris optimisé a 1kb.

Source / Exemple :


//--- Tetris Game 1Kb by Strille. Version 1.2, 1000 bytes
//--- Paste this code on frame 1 and set scene size to 240x360 and Frame Rate to 18
//--- The code is not written with speed in mind, only small file size
//
//
// creation du champ de texte t pour le score
createTextField("t", 1, 0, 300, 239, 24);
//fonction qui test le nouvel emplacement d'une piece ou qui calcul (mappage) une piece sur le tableau de jeu
function c(a, b, g, h) {
	//a : position x de la piece
	//b : position y de la piece
	//g : piece
	//h : couleur
	//chaque piece fais 4*4 cases 
	for (var y = 0; y<4; y++) {
		for (var x = 0; x<4; x++) {
			// si il y a une case dans la piece
			//
			//un petit test sympatique :
			// pour la case a tester ( s[x+y*4], si la valeur n'est pas nulle ( n&1->1 si n!=0 ) = aucune commbinaison de forme n'occupe cette case
			// on decale a 'gauche au niveau du bit' g fois  :)
			//en fait on recupere la valeur en binaire pour notre combinaison :
			// si  s[x+y*4] = 2183168 (en binaire = 0000001000010101000000000000) on decale g fois vers la gauche et i g=13 on obtient 1 c'est a dire que pour la combinaison 13 , cette case est occupée
			if (s[x+y*4] & 1 << g) {
				// q == 300 c'est que l'appel de la fonction correspond a une piece non figée
				if (q == 300) {
					//on affecte la couleur de la piece a m[case concernée] en negatif pour pouvoir la differencier d'une case deja figée
					m[(a+x)+(b+y)*15] = -h;
					// et on zappe le reste des tests ...
					continue;
				}
				// sinon, il s'ajit des test de position
				//
				//
				// si une case est deja occupé (comparaisaon avec le tableau des cases fixées m[]
				// ou si la case est au dela des limites 																							
				if (m[(a+x)+(b+y)*15]>0 or b+y>=20 or a+x<0 or a+x>=10) {
					//la fonction retourne 1 , donc la position n'est pas accessible
					return 1;
				}
				// si q == -2 c'est que c'est une piece a figer
				if (q == -2) {
					//donc on met la case a la valeur de h 
					m[(a+x)+(b+y)*15] = h;
					//si une case de la piece a figer est au dessus la premiere ligne, c'est la fin de partie
					if (b+y<0) {
						delete onEnterFrame;
						//mise a jour du texte
						t.text = z+"\tPress a key";
					}
				}
			}
		}
	}
}
function p() {
	//si w est faux, c'est que c'est la premiere fois donc on ne traite que les choix de pieces et de couleurs
	if (w) {
		// on decremente q pour avoir q=-1 en cas de fixage d'une piece
		q--;
		// on calcul (mappage) le fixage de piece
		c(u, v, i, d);
		// pour les 20 lignes
		for (var y = 0; y<20; y++) {
			// on traite les 10 colonnes
			for (var x = 0; x<10; x++) {
				// des que la case est  vide , on passe a la ligne suivante (et x!=10 )
				if (!m[x+y*15]) {
					break;
				}
			}
			//si x==10 c'est que les 10 premieres cases sont occuppées donc c'est qu'il y a une ligne pleine
			if (x == 10) {
				x = 16;
				//supprime la ligne y (de 15 cases
				m.splice(y*15, 15);
				//ajoute 15 nouvelles cases vierges
				while (--x) {
					m.unshift(0);
				}
				//on incremente le score de 10
				z += 10;
			}
		}
	}
	// i (la nouvelle piece) = j (la piece previsualisé)
	i = j;
	// on choisi une nouvelle pré-piece parmi 28 ( 7 pieces * 4 rotations )
	j = random(28);
	//on choisi la couleur parmis les 16 millions dispo :)  (  0xFFFFFF + 1  )
	d = random(16777216);
	// positions de depart d'une nouvelle piece y=-3 et x=3
	v = -(u=3);
}
//moteur du jeu (en fait une fonction onKeyDown du textfield "t")appellée a chaque image
//et qui contient un onEnterframe .
t.onKeyDown = function() {
	//q = code de la touche enfoncée
	q = Key.getCode();
	//si onEnterframe pas encore lancée ...
	if (!onEnterFrame) {
		//init le compteur general w et le score z
		w = z=0;
		//un tableau avec la valeur des pieces
		//chaque valeur represente une case de la matrice 4*4  pour chacune des 28 combinaisons de pièces 
		// exemple : 4325376 en binaire = 0000010000100000000000000000
		//donc pour la combinaison 18('L' a l'envers jambe a gauche) et 23 ('L' couché jambe vers le haut) il y a une case en 0 (x=0/y=0)
		// ex2     : 2183168 en binaire = 0000001000010101000000000000
		//donc pour la combinaison 13,15,17 et 22, il y a une case en 8 (x=0,y=2)
		//etc...
		//optimisé mais il est difficile d'ajouter une nouvelle piece, il faut recalculer toutes les valeurs !!!
		s = [4325376, 178954464, 8653312, null, 89458032, 268435455, 89520863, 83886080, 2183168, 178937791, 1615119, null, null, 167772160];
		// un tableau vide pour les cases a colorier
		m = [];
		// on appelle la fonction p pour choisir la pre-piece et la piece de départ
		p();
		// fonction appelée a chaque image
		onEnterFrame = function () {
			// on affiche le score z
			t.text = z;
			// si touche gauche
			if (q == 37) {
				// on decremente u (deplacement a gauche)
				u--;
				// si le deplacement est impossible
				if (c(u, v, i, d)) {
					// on reincremente u
					u++;
				}
			}
			// si touche haut (on tourne)
			if (q == 38) {
				// on passe a la piece suivante mais on garde la piece en cours dans q
				q = i++;
				// ...qu'on module par 4 pour rester sur la meme forme
				if (!(i%4)) {
					i -= 4;
				}
				// et si la rotation est impossible
				if (c(u, v, i, d)) {
					// on remet la piece en cours dans i
					i = q;
				}
			}
			// si touche droite
			if (q == 39) {
				// on incremente u (deplacement a droite)
				u++;
				// si le deplacement est impossible
				if (c(u, v, i, d)) {
					// on redecremente u
					u--;
				}
			}
			// on traite les 300 cases ... 15*20
			q = 300;
			// calcul de la pre-piece j en position x=11, y=3 de couleur gris (en hexa)
			c(11, 3, j, 0xeeeeee);
			// puis calcul de la piece en cours i
			c(u, v, i, d);
			// nettoyage de l'ecran
			clear();
			// debut du remplissage du fond de jeu
			beginFill(0xeeeeee);
			lineStyle(0);
			lineTo(151, 0);
			lineTo(151, 301);
			lineTo(0, 301);
			// fin du fond de jeu
			endFill();
			// nouvelle epaisseur pour les formes
			lineStyle(2);
			// tant qu'il reste des cases
			while (q--) {
				// si la case m[q] n'est pas vide
				if (m[q]) {
					// on recupere la couleur contenu dans m[q] pour le remplissage
					beginFill(m[q]);
					// si cette la couleur est negative, c'est qu'il sagit d'une piece non figée
					if (m[q]<0) {
						// on recupere la couleur pour le remplissage
						beginFill(-m[q]);
						// et on efface la valeur de m[q] (effacement derriere des pieces non figées )
						delete m[q];
					}
					// on dessine  la case correspondante (un carré quoi)
					moveTo(1+(q%15)*15, 1+int(q/15)*15);
					lineTo(15+1+(q%15)*15, 1+int(q/15)*15);
					lineTo(15+1+(q%15)*15, 15+1+int(q/15)*15);
					lineTo(1+(q%15)*15, 15+1+int(q/15)*15);
					endFill();
					// fin du dessin
				}
				// fin des cases( q est alors = -1 ... )
			}
			// la c'est plus chaud deja ...
			// en fait , w (qui est incrementé a chaque frame) est modulé par 3 (ou 3-2=1 si descente rapide) et si le resultat est 0 alors on descend
			// bon ce test O_o
			if (!(w++%(3-2*Key.isDown(40)))) {
				// descente (incrementation de v)
				v++;
				// si le deplacement est impossible ( c en test )
				if (c(u, v, i, d)) {
					// on decremente v ...
					v--;
					// et on fixe la piece en cours (q=-1)
					p();
				}
			}
		};
		// fin onEnterFrame
	}
	//fin if !onEnterFrame
};
//fin onKeyDown
//
//on appelle la fonction onkeyDown() de l'objet t
t.onKeyDown();
//et on ajoute l'objet a l'ecouteur de touche
Key.addListener(t);

Conclusion :


j'ai été le plus précis possible afin que tous le monde puisse comprendre cette source .
plus de bonheur sur www.strille.net ;) et je ne connais pas personellement ce type !!!

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.