Bonjour, bienvenue dans la communauté des programmeurs en C !
J'ai testé ton jeu et je l'ai trouvé bien fait !
Cependant,en ayant regardé la taille de l'addin (60ko), nous nous sommes dit (Lephenixnoir et moi) que l'on devrait regarder un peu le code et donc on s'est penché sur ton stockage des niveaux !
Ce que je vais te proposer comme optimisation te permettra de stocker chaque niveau sur *hum* 19 octets maximum et donc tes 160 niveaux sur 3040 octets ! Ce qui est ridicule !
Notons que tes niveaux sont codés en [i]unsigned char[/i] ce qui fait que chaque nombre que tu stockes prend chacun 1 octet. Donc chaque niveau fait donc 1*18*10 + 1 (nombre max de coups) => 181 octets !
Si on enlève les bordures extérieures (qui sont toujours à 1), on se retrouve maintenant à stoker chaque niveau sur 16*8 octets (128 octets).
Notre méthode d'optimisation serait de stocker chaque "1" ou "0" sur chaque bit d'un nombre (et pas 1 octet avant).
Si chaque ligne est codée sur 2 octets ([i]unsigned short[/i]) * 8 lignes, on arrive donc à 16 octets pour le dessin du niveau. (1 octet = 8 bits)
L'autre problème est de stocker aussi le nombre de coups maximum ainsi que l'emplacement de départ (bloc n°9) et d'arrivée (bloc n°8) du bloc noir.
On va donc stocker les coordonnées (x,y) du bloc de départ dans 1 seul octet (avec x qui prend 4 bits et y, les 4 autres bits) et le nombre de coup maximum dans un octet entier.
On arrive donc à stocker le départ et l'arrivée dans 2 octets + 1 octet (pour le nombre maximum de coups) => 3 octets.
Récapitulons : on a donc les 16 octets du niveau + 3 octets pour le reste => 19 octets
Avec cette méthode, on peut donc écrire :
static const unsigned char map1[]={
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; // ton niveau
Si on optimise :
0000000000000000 => 0 // 1ere ligne de ton niveau
0000000000000000 => 0 // 2eme ligne de ton niveau
1000000000000000 => 32768 // 3eme ligne de ton niveau
0000000000000000 => 0
etc ...;
Pour les coordonées : le départ (bloc n°9) (on part sur un repère orthonomé)
x => 0000 et y => 0100
Donc un octet : 00000100
Idem pour l'arrivée
Et on stocke le nombre de coup dans un `unsigned char`
Pour éditer ou récupérer chaque valeur, les opérateurs bitwise du C te seront d'une grande aide !
En espérant que tu en tiennes compte. Je te souhaite beaucoup de courage pour la suite !
Si tu as des questions, n'hésite pas à la poser ! |