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 !!!
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.