mardi 31 juillet 2012

[Prog] Mini-Instant Programmation : Bust-A-Move et la récursivité


Salut à tous! Aujourd'hui,  le temps de réalisation du prochain billet tend un peu vers +inf car mes vacances sont très chargées. Je vais par contre vous montrer un petit exemple pratique de la récursivité sur un problème qui m'est apparu lors de la programmation d'un projet.
Planète Casio - Add-in Casio - bust-a-move - eiyeron - Calculatrices
Mon petit jeu, WIP, mais plus pour longtemps ^^

Je suis en train de programmer une adaptation de Bust-A-Move sur Casio Prizm (oui, une calculatrice ). Si vous voulez savoir à quoi il ressemble, c'est à côté. C'est un jeu précurseur, sorti sur arcade. On doit envoyer des bulles colorées afin de les regrouper par paquets de 3 ou plus pour les faire exploser, dans le but de vider la map.
J'ai déjà fini le placement de la bulle, la prochaine étape sera faire exploser ces dernières si j'ai formé un groupe de bulles suffisamment gros. Manque de bol, j'ai pas d'idées pour gérer lesdites bulles, c'est un type de problème jamais vu auparavant. J'avais trouvé une solution relativement peu aisée à gérer, et surtout bizarre : j'aurais recherché en suivant des cercles concentriques les bulles adjacentes. J'ai rapidement laissé tomber cette idée bancale pour une solution récursive, car je ne savais absolument pas comment gérer ces fameux cercles. Voici mon idée :
Je pars de la bulle lancée, je la marque, et je regarde ses voisines. Si une de ses voisines est de la même couleur et non marquée (cette condition est très importante, si vous l'omettez, vous ferez planter l'algorithme), je la marque, et je refais la même chose en partant de celle-ci. Si une bulle n'a pas de voisine de la même couleur non marquée, je reviens sur la bulle précédente. Si on revient sur la bulle lancée, on a fait le tour, on a fini la recherche, on peut vérifier si on doit effacer les bulles, et on agit.
Cette méthode est programmable de deux façons différentes: soit le backtracking ou la méthode récursive. Le backtracking est une méthode où dans une boucle on réitère nos opérations en ajoutant notre position dans une pile à chaque fois qu'on avance, et en récupérant la précédente si on doit reculer. La méthode récursive est un poil différente : on appèle la fonction recursive si on doit avancer, et on quitte l'appel actuel si on doit reculer. La pile d'appel sera similaire à celle du backtracking. Le backtracking étant déjà été fait pour un autre projet, je décide donc de faire la 2e option, cela sera ma première proche avec du récursif. Ca n'est pas forcément pas la meilleure solution, mais ici, ça marche, et j'étais content de voir que ça pouvait me donner le résultat escompté! A vrai dire, cette méthode peut paraître gourmande, mais j'pense avoir trouvé une alternative encore plus lente: je parcoure le tableau pour trouver des bulles adjacentes à celles déjà marquées jusqu'à que j'en trouve plus. Ca, c'est la pire idée que j'ai pu avoir! Ici, ca n'aurait pas trop de problèmes de lenteur car j'ai une map de 8*13 bulles, mais imaginez sur une map de 200*402!

Pour finir ce "mini-billet", je vous dirai que pour un problème, il ne faut pas hésiter à chercher des idées qui peuvent paraître farfelues, mais possibles!

dimanche 15 juillet 2012

[Prog] Avoir commencé la programmation sur calculatrice


Salut à tous! Aujourd'hui je vais un peu parler de mon passé (un peu), et surtout de cette plateforme ésotérique de programmation: la calculatrice graphique.

Je n'ai pas tellement programmé pendant des années, à l'heure où je tapote ce clavier, ça fait un peu plus de trois ans, dont au moins une et demie sur calculatrice seulement. Ce furent mes premières réactions avec la programmation : j'ai découvert une étrange calculatrice en 3e, plus grosses que les autres. Par curiosité, je demanda la bête. Tiens, ça ressemble à rien de ce que j'ai pu voir : on peut afficher plusieurs calculs, on peut stocker pas 8, mais 26 valeurs dans des lettres, et un menu avec des modes existe! Mon premier contact avec une Casio Graph 25. Dans ce menu, un bouton attisa mon regard: PRGM. Il semblerait qu'on puisse programmer dessus... Je me renseignai sur Internet, tombai sur le cher Site du Zéro qui avait justement un tutoriel sur la programmation Casio. J'ouvris la boîte de Pandore... Ce fût le point de départ. De là me vint une envie d'essayer les programmes inclus dans le tuto, puis d'innover, créer des jeux...

Trois ans plus tard, je m'attaque à Android, et l'expérience que j'ai obtenue en programmant sur calculatrice risque de m'être fort utile. Vous deviez vous dire certainement "Pourquoi nous a-t-il parlé de sa calculatrice "? (Écrivons calto, c'est plus court sans pour autant être du SMS.) Sans cette G25, je ne serais pas là en train de vous écrire, ni en train d'imaginer quel jeu pourrais-je faire, je n'aurais certainement pas la même orientation pour ma vie future! Nous - ou plutôt moi - nous éloignons du sujet. Pour vous dire, j'estime que programmer sur un support tel qu'une calto est très bénéfique pour la programmation en général par la suite. OK, c'est lent, on a un écran en noir et blanc aux dimensions ridicules, et très peu de mémoire, mais suffisamment pour créer des minis prototypes de jeux, comme des RPG, des platformers, ou même un RTS! Pour ma part, je trouve que le Basic, que ce soit sur TI ou Casio, est un très bon moyen de se lancer dans la programmation, il est assez simple d'accès, et le fait qu'il soit un langage interprété évite la partie compilation. Après, il faudra trouver des combines pour réaliser des jeux avancés, comme par exemple utiliser les matrices comme données de sauvegardes et les listes comme de la mémoire volatile. Après, il sera judicieux d'apprendre un langage supérieur dessus, tel que le C ou le Lua pour Casio ou l'Axe Parser pour TI, permettant de meilleures performances, et une gestion plus avancée des données. Le C ou le Lua étant acquis, vous pourrez toujours vous engager dans l'assembleur SH3 pour Casio ou le Z80, mais je ne vous le conseille pas, le SH3 n'est pas tellement répandu de nos jours, par contre, je ne sais pas pour le Z80... mais déjà avec le C/Lua, vous pouvez commencer à programmer sur ordi! Je ne suis pas le seul à programmer sur calculatrice, si vous voulez savoir, je traîne sur le site Planète-Casio, où je suis modérateur (surtout fouteur de merde, mais chut :p ), sur TiPlanet, ou chez les anglais avec Omnimaga et Cemetech.

A vous de vous lancer! ;)

mardi 10 juillet 2012

[C/C++] [Astuce] Initialiser un struct

Salut à tous!
Je poste ici un petit mot concernant une astuce que j'ai trouvé, et qui mérite d'être vue: les Designated Initializers.

J'ai trop souvent vu des choses comme ceci :
typedef struct {
 int x;
 int y;
}point;

point pt;
pt.x = 7;
pt.y = 6;
Alors qu'il existe une méthode qui simplifie la chose en C89, et une autre méthode qui est plus pratique à mes yeux en C99.
typedef struct {
 int x;
 int y;
}point;

point pt = {5, 2};
point pt2 = {.x = 5, .y = 2};
Cela raccourcit peut-être qu'un tout petit peu le code qui sert d'exemple, mais par exemple dans un de mes projets, j'ai à peu près 8-10 membres d'une structure, et un autre 20!

Ceci ne marche que lors de l'initialisation!
Ça ne marchera pas après! Cela provoquera une erreur de compilation, faites attention!
typedef struct {
 int x;
 int y;
}point;

point pt;
pt = {5,2}; // NE MARCHERA PAS!
pt = {.x = 5, .y = 2}; // NE MARCHERA PAS NON PLUS!
La grande différence entre ces deux méthodes est capitale: celle du C89 initialise les variables dans l'ordre auquel on lui donne:
typedef struct {
 int x;
 int y;
}point;

point pt = {5, 2};
Ici, pt aura un membre x qui est égal à 5, et y à 2 alors que
typedef struct {
 int y;
 int x;
}point;

point pt = {5, 2};
Ici, ce sera l'inverse: y sera égal à 5 et x égal à 2.

Faites très attention quand vous modifiez/utilisez des structures, car seule la version C99 est indépendante de la disposition de la structure! Voilà, j'espère que cela vous servira beaucoup pour éclaircir et réduire le code source de vos projets! ;)

dimanche 8 juillet 2012

[Rétro-Instant] Mario&Luigi Superstar Saga

Salut à tous! Pour cette première rétrospective, j'aimerais parler d'un jeu que j'ai toujours voulu avoir pendant 9 ans, et enfin terminé en l'espace de quelques jours: Mario&Luigi Superstar Saga, sur Game Boy Advance.

Avant toute chose, revenons un peu en arrière avant même ce jeu, en 1996 sur SNES. Le 9 mars sortit le premier RPG dans l'univers de Mario: Super Mario RPG: Legend of the Seven Stars. Ce jeu posera toutes les bases de presque tous les RPG Mario, dont notamment le combat en tour à tour, le système de compagnons, ou bien une gestion (souvent simpliste) des caractéristiques des persos, avec ou sans inventaire.

Revenons en 2003, 17 Novembre (les nord-américains auront le jeu avant les autres, fait assez rare). J'entends parler du jeu, je ne savais où le trouver, puis j'entends parler des émulateurs GBA. Oui, l'émulation de jeu téléchargés, c'est le mal, mais bon, j'ai dumpé (copié le jeu de ma propre cartouche sur mon ordi) la rom depuis. Donc je récupère la rom de ce jeu, et en avant! Mes premières approches avec le jeu auront vite fait de me rendre fan des jeux de cette série. Pourquoi?

-Point de vue joueur-

Ici, un Mario écrasé fera l'affaire
Déjà, le jeu adopte un humour quasi-omniprésent, quoique assez enfantin. Le monde en lui-même porte les couleurs du rire et de l'humour: vous irez chercher à un moment le soda hilaro, fermenté pendant des siècles à coup de vannes, vous tomberez certainement sur des pois Hihi, Haha, etc... Une autre caractéristique de ce jeu est que vous devrez utiliser des outils/pouvoirs pour avancer dans le monde assez hostile. Ça ne paraît pas vraiment original, on pensera tout de suite à Golden Sun, ou d'autres jeux, mais vous ne verrez jamais ailleurs Luigi écraser Mario à coup de marteau pour le faire réduire sa taille de moitié, pouvant accéder à des chemins trop petits auparavant. D'autres actions seront disponibles au fil du jeu, et presque toutes auront aussi une implication dans le combat.

Ici, c'est l'attaque Frères Feu
Notez le halo qui indique que l'on doit appuyer sur le bouton.
Les combats sont assez actifs: vous êtes obligés d’interagir durant la phase d'attaque ou de défense, en appuyant/maintenant le bouton assigné au frère au bon moment (A pour Mario, B pour Luigi). Si vous appuyez/maintenez/spammez le bouton en question au bon moment, l'attaque n'en sera que meilleure, sinon, votre attaque ne fera autant de dégâts qu'un pétard mouillé. Pareil pour la défense: vous pouvez esquiver/contrer les attaques ennemies en appuyant au bon moment. Cela force le joueur à suivre et être dans le combat, et éviter qu'il ne fasse que suivre comme une larve les animations.


C'est le virus bleu qui vient de Dr.Mario
Une caverne, habitée par des ennemis.
Notez la référence à Dr.Mario. Les clins
d'œil sont peu nombreux dans ce jeu
Les graphismes sont très bons: c'est coloré, il y a quelques détails, mais pas trop pour garder un aspect cartoon, ça se tient, c'est beau, et ça ne pique pas aux yeux: je verrais bien un jeu next gen avec ce style graphique, quoique avec un peu plus de détails, écrans HD oblige. Les animations des PNJ hors combat sont assez banales, limites répétitives: on voit les PNJ marcher, même si ils ne se déplacent pas! Oo" Mais en combat, c'est toute une autre histoire: Les animations de Mario et Luigi sont extrêmement détaillés: il y a des sprites originaux pour quasiment toute attaques, que ce soit les attaques, les actions frères, ou bien leur ratages! C'est pourquoi on verra Mario avec un marteau sans tête si il échoue l'attaque au marteau, Luigi se tenant le pied de douleur si il saute sur un ennemi pointu, et la liste est assez longue, mais amusant à voir dans certains cas!

-Point de vue programmeur-
/!\ Langage technique en vue.

Le jeu paraît très bien conçu: je n'ai eu affaire à aucun bug depuis que j'y joue. Le moteur de combat serait intéressant à décompiler, et à observer: il y a des évènements à peu près partout: que ce soit avant une attaque, après, ou même pendant une action. Des actions sont impossibles dans certains cas (quand un Boo vous vole le "cube" de ces actions, ou les attaques duo quand un des frères est à terre), es pas mal de réactions sont à observer notamment avec les équipements: un badge vous permettra de sauter sur les ennemis pointu, un jean va vous restaurer des PV tour à tour, ou même un badge va vous augmenter l'attaque en fonction du nombre de Champignons dans l'inventaire!

Si vous donnez deux fois d'affilé un bonus à la même caractéristique, le deuxième sera quasi-nul (généralement 1). Ca évite de rendre un perso trop déséquilibré.
Le système d'évolution des frères est doté d'un bonus de
points que l'on peut ajouter à sa guise, mais il faudra éviter
de les mettre dans la même caractéristique.
Du coté gameplay, le jeu forçant à suivre le combat est une très bonne idée: on apprend plus facilement les patterns régissant les IA des monstres, et leurs attaques: on se voit faire ce qu'il faut au bon moment pour contrer une attaque d'un ennemi. Le jeu vous permettra même de doubler le nombre d'attaques duo après les avoir utilisés suffisamment pour qu'en plein combat, Mario et Luigi discutent sur une nouvelle attaque basée sur la précédente: l'Avancée, souvent plus destructrice que la précédente. Ça permettra de changer parfois le type de l'attaque: L'attaque Frère tonnerre, attaque de type AOE, deviendra une attaque ciblée par exemple.

Le jeu repose sur une histoire à rebondissements, on peut se trouver à nourrir des Yoshis à coup de pois spéciaux pour avancer dans la quête! Mais dans l'ensemble, il n'y a pas d'incohérences, le scénario se poursuit, avec toujours plein d'humour, c'est un plutôt bon exemple de scénario, pas trop facile à deviner.
Il faudra noter aussi la présence soutenue de mini-jeux, la plupart étant nécessaires à réaliser pour poursuivre, ils casseront la routine du combat-combat-combat.

-Derniers points-

Pour finir, ce jeu est un type de jeu à essayer, je parlerais plutôt de TRPG pour enfants, tant sa simplification permet aux plus jeunes de savoir ce qu'est un TRPG, tout en restant assez sympa et amusant. Ce sera le premier de la série de RPG Marios sur consoles portables, mais sur consoles de salon, la série de Paper Mario tient la relève de Super Mario RPG. C'est un bon jeu, avec une durée de vie plutôt faiblarde : 10-13 heures de jeu pour le finir, mais avec des graphismes assez sympa, une musique (j'ai pas parlé de la musique!) pas tellement marquante (sauf peut-être celle du combat), et une histoire assez sympa pour le coup, même si on doit sauver une fois de plus la princesse, elle ne restera pas longtemps le centre du sujet!Un bon jeu, à essayer si vous voulez vous frotter aux RPG du moustachu plombier.

samedi 7 juillet 2012

Fin temporaire du bidouillage

Bon, après avoir bidouillé pendant un petit moment ce thème, je pense l'avoir suffisamment modifié à mon goût.
Donc vous voici en présence du thème SARL Fantastisque, fourni par défaut, arrangé par mes soins à plusieurs niveaux.
Je commencerai à rassembler deux ou trois screenshots pour le premier vrai article. En attendant, je laisse à disposition un petit sondage pour vous demander si ces modifications, et je vous laisse! ^^

vendredi 6 juillet 2012

First Steps

Salut à tous!
Désormais, une place sur Internet a été réservée pour du rétrogaming, de la programmation sur différents supports, dont certains assez ésotériques, et puis un peu de tout (surtout de tout), et un peu de rien.
A l'heure actuelle, ce blog est encore en travaux, c'est pourquoi ça risque un peu de secouer pendant le trajet.
?- Qui es-tu?
-> D'abord je suis Eiyeron Fulmicendii, de mon nom de "scène". Je suis avant tout un rétrogamer assez taré axé sur la période 85-2004, c'est à dire NES, SNES, Mégadrive, N64, Gameboy, etc... Seront évitées pour le moment la DS (pré 2004), La Saturn, Dreamcast (je ne les ai pas, et elle ne m’intéressent pas), la PS2 (le premier qui me parle de rétrogaming PS2, je le brûle) et la Virtual BOy (qui a ENVIE d'avoir cette boucherie oculaire? J'en sortirai deux-trois mots dessus).

La période Snes<->GBA + Mégadrive m'a beaucoup inspiré, j'ai adoré beaucoup de jeux, notamment Yoshi Island, Pokémon (eh oui, j'ai été littéralement lobotomisé par cette licence, ce qui fait que je rattrape aujourd'hui), la série des Mario, et puis récemment les jeux Sonic sur Mégadrive.
De ce fait, je suis devenu programmeur, parce que j'ai été longtemps bercé dans l'informatique, et pour le plaisir de voir des gens s'acharner sur mes programmes/jeux.


Pour finir ce post, je vais vite signaler que j'ai commencé à programmer sur des calculatrices graphiques Casio, notamment pour leur langages intégrés, et leur portabilité (les ordis étant interdits au lycée...). De ce fait, j'ai appris le C pour les modèles Graph 75/85/95 (SD ou +, ça m'est égal), le LUA (nouveauté auquel j'ai participé surtout comme testeur) pour G100/75/85/95, et désormais, je m'attaque au Java, et Android!

Donc ne vous étonnez pas de voir du contenu assez hétéroclite, c'est prévu, pour votre plus grand plaisir!

Ahoui, Et si on finissait sur une quote? "For science, you monster." -GLaDOS, Portal 2.