Faire un jeu avec l'automate ? ... Le judootomate |
Quels jeux pourrait-on faire en partant de la base d'automate cellulaire présentée précédemment ? Le Judootomate est
une proposition mais le sujet n'est pas clôt ! L'objectif est d'illustrer
le fait qu'il est possible de réinvestir de sens une proposition
initiale et de dériver à partir d'un sujet vers quelque
chose d'autre. |
![]() |
TELECHARGER aaaTexte des explications, aaaExecutable (Windows), aaaSource (utilise la librairie Allegro)
|
![]() |
EXPLICATIONS 1. Principe En utilisant le moteur d'automate cellulaire précédent l'idée est de provoquer une lutte entre l'utilisateur et l'automate : l'utilisateur doit vaincre l'automate soit en détruisant toutes ses cellules, soit en contribuant à l'apparition d'une figure qui ne peut plus être sujette à évolution. Du point de vue de
l’automate cellulaire le moteur est celui l’automate cellulaire
présenté précédemment mais au lieu de faire
évoluer la totalité du plan il s’agit d’en faire
évoluer uniquement des portions. Ces portions sont localisées
à partir de la position du curseur de la souris et le moteur est
actionné sur ces portions à chaque clic gauche. Eventuellement
un clic droit permet de forcer une cellule à la valeur 1 afin de
modifier la configuration de la zone pointée. 2. Mise en forme et initialisation Comme dans le programme
initial, le plan est défini par une matrice d’entiers et
une seconde matrice-miroir est là pour stocker les résultats
du calcul. Ces matrices de la même taille sont déclarées
en globales à l’aide de deux macros TX et TY qui déterminent
le nombre des cases de la zone de jeu. Les macros PASX et PASY donnent
la taille en pixels de chaque case. La zone de jeu est représentée
par un quadrillage centré à l’écran, les macros
DECX et DECY donnent le décalage par rapport à l’origine.
Le s macros Xe(n) et Ye(n) permettent d’obtenir une position à
l’écran à partir d’une position dans la matrice. aaaaint MAT[TY][TX]; aaaavoid init (void) (1) Mise à 0 de la matrice MAT (2) Des positions sont mises à 1 uniquement lorsque la fonction rand() renvoie une valeur supérieure à la moitié de valeur maximum qu’elle peut renvoyer (RAND_MAX/2) (3) la matrice MAT
est recopiée dans la matrice SAV. A la différence du programme précédent le développement de l’automate est interactif, piloté avec la souris ce qui donne essentiellement les lignes suivantes : aaaaaawhile( ! key[KEY_ESC]) { (1) le clic est récupéré dans la variable « clic » (2) Si clic c’est la position de la souris qui est récupérée mais convertie en position matrice. (3) S’il s’agit
d’un clic gauche le calcul est effectué à partir de
la position de la souris convertie en position (x,y) dans la matrice MAT
et les résultats sont reportés dans la matrice SAV. La fonction
calcul est modifiée par rapport au programme précédent
: elle prend en argument une position dans la matrice et va s’exercer
uniquement autour de cette position et non sur toute la matrice. (4) En cas de clic droit, la position courante de la matrice désignée par la position de la souris est mise à 1 pour MAT et SAV simultanément afin d’éviter une recopie un peu lourde. (5) L’affichage
se fait via la bitmap intermédiaire passée en argument à
la fonction affiche qui gère ensuite le passage à l’écran.
Les fonctions scare_mouse() et unscare_mouse() servent à cacher
la bitmap du curseur souris au moment de l’affichage afin qu’il
ne soit pas au dessous d’un affichage mais toujours au-dessus (sinon
il se produit un trou dans l’image à l’écran
lorsque sa position est modifiée ensuite). aaaaaavoid calcul(int xo,int yo) (1)aaaa aaafor(y=yo-1; y<=yo+1; y++){ (1) Les seules cellules examinées sont celles comprises entre xo-1 et xo+1 pour l’horizontal et yo-1 et yo+1 pour la verticale. (2) Le compte de voisins n’est possible que s’il n’y a pas de débordement du fait des cellules en bordure. Le test permet de s’assurer que la position aura bien huit positions voisines. (3) Appel de la fonction de compte des cellules voisines sur 1. Cette fonction est identique à celle de l’automate original et suppose que x et y sont compris dans la matrice. Pour mémoire : aaaaaaint compte (int x, int y) aaaaaavoid affiche(BITMAP *bmp) (1)aaaaaaa for (y=0; y<TY; y++) (1)(2) Toutes les positions de la matrice MAT sont passées en revue et coloriées lorsqu’elles sont à un. (3) Est ajouté le dessin du quadrillage. (4) Lorsque l’image
est prête elle est plaquée à l’écran
via un appel à la fonction « blit ». aaaaaavoid copie(void) |
![]() |