Partage
  • Partager sur Facebook
  • Partager sur Twitter

[FAIT][Défis] #2 : Le jeu de la vie !

SDL

    9 septembre 2011 à 18:29:06

    Bonjour à tous les zéros,

    Cette semaine, nous vous proposons de réaliser à l'aide de la SDL, le jeu de la vie. Ne vous inquiétez pas si vous ne savez pas ce que c'est, le principe et les règles vous seront expliqués.

    Si vous souhaitez plus de renseignements sur les défis, rendez vous sur le topic de recensement des défis, vous y trouverez également les règles principales.

    Jeu de la vie


    Cet exercice a été écrit par _Fender_ et GuilOooo, un grand merci à eux !

    Le jeu de la vie... c'est quoi ?



    Le jeu de la vie n'est pas un jeu au sens ludique du terme, car le "joueur" reste passif une fois l'animation lancée. C'est en réalité un automate cellulaire qui passione les mathématiciens depuis son invention en 1970 par John Horton Conway.

    Un automate cellulaire se base sur une grille de cases (cellules) qui sont chacune dans un certain état, à un certain instant. Un tel automate comporte des règles qui disent comment les états des cellules évoluent dans le temps. Dans le cas du jeu de la vie, les cellules peuvent être dans 2 états différents : vivantes ou mortes.

    Les règles sont plutôt simples :

    • Si une cellule morte à exactement trois voisines vivantes, elle devient alors vivante à son tour.
    • Si une cellule vivante à deux ou trois voisines vivantes, elle le reste. Elle meurt dans tous les autres cas.


    Une image vaudra mieux que tout discours, alors voici un lien qui vous permettra de voir a quoi ressemble une simulation du jeu de la vie. Il est également possible de faire des choses encore plus fascinantes, comme ce canon, qui fonctionne uniquement avec les règles citées plus haut. ;)

    Notre fenêtre sera donc une grille 2D de cellules. Au départ, certaines seront vivantes, et d'autres mortes.


    Vous êtes curieux ? En savoir plus sur :

    Consignes



    Notre objectif sera donc de réaliser un simulateur du jeu de la vie.

    Vous pouvez, par exemple, représenter les cellules vivantes par des cases noires et les cellules mortes par des cases blanches. Au lancement du jeu, l'utilisateur doit pouvoir changer l'état de chaque cellule en cliquant dessus pour la faire vivre/mourir. Une fois le jeu lancé, la grille évolue selon les règles définies plus haut.

    Objectifs


    • Premier contact avec le monde des automates cellulaires.
    • Application pratique de l'apprentissage de la SDL.
    • Manipulation des tableaux à deux dimensions.

    Enoncé



    Niveau 1

    Mettre en place les fonctionnalités de base : choisir les cellules mortes/vivantes en début d'animation et lancer l'animation à l'appui d'une touche.

    Niveau 2

    Pouvoir mettre en pause/relancer l'animation et changer l'état de cellules pendant la pause.

    Niveau 3

    Vous avez trouvé une belle séquence et vous voulez l'envoyer à vos amis ? :) Mettez donc en place un système de sauvegarde dans des fichiers, ou vous pouvez charger/sauvegarder une disposition de cellules.

    Et après... ?



    Si ce jeu vous passionne autant que moi, pourquoi ne pas vous amuser à changer les règles ? ^^

    Modifiez les conditions de naissance et de mort, ajoutez des couleurs, etc... Encore une fois, laissez parler votre imagination et votre créativité !

    Bon courage. ;)

    S'il y a quelque chose que vous ne comprenez pas, n'hésitez pas à poser vos questions sur ce sujet, nous vous répondrons avec plaisir ! :)


    Participants


    Participants Code
    Loadware Le jeu de la vie
    axelorque Le jeu de la vie - niveau 2
    Mon ouïe Le jeu de la vie
    Damien7877 Le jeu de la vie - niveau 2
    lucas-84 Le jeu de la vie - niveau 3
    yoch Le jeu de la vie - niveau 2
    florent m Le jeu de la vie
    drx Le jeu de la vie - niveau 2
    MaitreZur Le jeu de la vie - niveau 2
    kaka551 Le jeu de la vie - niveau 2
    • Partager sur Facebook
    • Partager sur Twitter
      9 septembre 2011 à 18:53:01

      Je m'y met demain ! :D
      Bonne chance à tous. :)
      • Partager sur Facebook
      • Partager sur Twitter
      Staff désormais retraité.
        9 septembre 2011 à 19:16:29

        Si quelqu'un à soif d'un niveau 4, j'trouve que ça serait trop énorme de mettre dans le programme deux molettes pour accélérer; ralentir; mettre en arrière l'animation.

        Exactement comme ce qu'il y a en dessous du bouton play ici:
        http://www.maxiorel.cz/files/pictures/ [...] e_Pro_CS5.png

        La molette permet de se déplacer dans l'anim avant arrière à la vitesse qu'on veut, et le bouton juste au dessus permet de fixer la vitesse pour de bon sans que nous ayons a garder le bouton enfoncé.

        Bon finalement c'est peut être niveau 7 ou 8 là du coup, mais si ça n'a pas déjà été fait sur le net, ça serait géant de tester :D
        • Partager sur Facebook
        • Partager sur Twitter
          9 septembre 2011 à 19:25:57

          La taille du tableau n'est pas précisée, normalement avec un 'vrai' jeu de la vie, il faudrait avoir un tableau de taille infinie. :-°
          • Partager sur Facebook
          • Partager sur Twitter
            9 septembre 2011 à 19:55:23

            Salut,

            bon sujet par contre je crois que je vais pas avoir la motivation de le coder la sdl me rebute un peu xd. Je vais peut etre le faire en console. Enfin a voir.... On sait jamais si je m'ennuis vraiment.
            • Partager sur Facebook
            • Partager sur Twitter
              9 septembre 2011 à 20:12:20

              Franchement, côté SDL, c'est vraiment pas dur, le plus dur c'est l'algo et la gestion de toutes les cases.
              • Partager sur Facebook
              • Partager sur Twitter
              "If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
                9 septembre 2011 à 20:26:13

                Le problème n'est pas de coder ce 'jeu'. C'est vraiment la SDL, je l'aime plus :s
                • Partager sur Facebook
                • Partager sur Twitter
                  9 septembre 2011 à 20:34:58

                  C'est sur que quand on a gouté à la simplicité de SFML, dur de repasser en SDL. ;)

                  Citation : Pouet_forever

                  La taille du tableau n'est pas précisée, normalement avec un 'vrai' jeu de la vie, il faudrait avoir un tableau de taille infinie. :-°



                  J'ai pensé qu'on pourrait laisser ce choix à l'appréciation de chaque personne, autant laisser le moins de contraintes possibles, non ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Bla bla bla
                    9 septembre 2011 à 20:36:49

                    ^^ ouai en fait je crois que c'est le mode graphique que j'aime pas :'( ca me gonfle, j'arrive pas a avoir un code propre. On ma pas appris à coder correctement, et tout seul j'arrive pas a mettre en place un MVC.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 septembre 2011 à 20:38:26

                      Il a dit "normalement". Après, oui tout le monde est libre de faire ce qu'il veut, c'est pas une corvée, c'est un entrainement.
                      Sinon, pas de débat SDL/SFML ici. C'est SDL et pis c'est tout. :p Merci.

                      dark-lord -> Un MVC ? :lol: Tu fais un jeu de la vie hin. ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      "If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
                        9 septembre 2011 à 20:41:24

                        Je sais que c'est une jeu de la vie mais je parle pour d'autre projet. Pfff et la je commence à coder le jeu de la vie en C on dirait que je fais de la POO Oo, je suis pervertis ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 septembre 2011 à 20:53:19

                          Edit 3 : Donc voici ma participation. Désolé d'avoir enlevé ce code pendant un moment :-°
                          Edit 4 : J'ai corrigé le bug trouvé par Twisted Destiny.
                          /*-ansi -O -Wall -Wextra -Wswitch-default -Wwrite-strings -Wstrict-prototypes -std=c89 -lmingw32 -lSDLmain -lSDL*/
                          #include <time.h>
                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <SDL/SDL.h>
                          
                          #define PIX 2 /*Taille en pixels d'une cellule.*/
                          
                          int main(int argc, char *argv[])
                          {
                              int recommencer = 1, continuer = 1, permutation = 0; /*Booléens.*/
                              int **grille, **grilleModif, **grilleTest; /*Grilles de cellules.*/
                              int i = 0, j = 0, somme = 0, compteur = 0, lngX = 640, lngY = 480;
                              SDL_Surface *ecran = NULL, *vie = NULL, *mort = NULL;
                              SDL_Event event;
                              SDL_Rect position, **taille;
                              
                              srand(time(NULL));
                              
                              SDL_Init(SDL_INIT_VIDEO); /*Lancement de la SDL.*/
                              
                              SDL_ShowCursor(SDL_DISABLE);
                              
                              taille = SDL_ListModes(NULL, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
                              lngX = taille[0]->w; /*Récupération de la résolution maximale de l'écran.*/
                              lngY = taille[0]->h;
                              
                              grille = malloc((lngX / PIX + 2) * sizeof(int*));
                              grilleModif = malloc((lngX / PIX + 2) * sizeof(int*));
                              grilleTest = malloc((lngX / PIX + 2) * sizeof(int*));
                              
                              for(i = 0 ; i <= lngX / PIX + 1 ; i++) /*Allocation dynamique des tableaux en fonction de la résolution.*/
                              {
                                  grille[i] = malloc((lngY / PIX + 2) * sizeof(int));
                                  grilleModif[i] = malloc((lngY / PIX + 2) * sizeof(int));
                                  grilleTest[i] = malloc((lngY / PIX + 2) * sizeof(int));
                              }
                              
                              ecran = SDL_SetVideoMode(lngX, lngY, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);    
                              SDL_WM_SetCaption("Jeu de la vie par Loadware", NULL); /*Création de la fenêntre en plein écran.*/
                              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 128, 0));
                              
                              vie = SDL_CreateRGBSurface(SDL_HWSURFACE, PIX, PIX, 32, 0, 0, 0, 0);
                              SDL_FillRect(vie, NULL, SDL_MapRGB(ecran->format, 128, 0, 0)); /*Création de la cellule vivante rouge.*/
                              
                              mort = SDL_CreateRGBSurface(SDL_HWSURFACE, PIX, PIX, 32, 0, 0, 0, 0);
                              SDL_FillRect(mort, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); /*Création de la cellule morte noire.*/
                              
                              while(recommencer) /*Boucle permettant de recommencer une simulation.*/
                              {
                                  for(i = 1 ; i <= lngX / PIX ; i++) /*Remplissage de la grille principale et de la grille des modifications.*/
                                      for(j = 1 ; j <= lngY / PIX ; j++)
                                          grille[i][j] = (grilleModif[i][j] = rand() % 2);
                                  
                                  while(continuer) /*Boucle principale de la simulation*/
                                  {
                                      SDL_Delay(80);
                                      
                                      SDL_PollEvent(&event);
                                      
                                      if(event.type == SDL_KEYDOWN)
                                      {
                                          recommencer = 0;
                                          continuer = 0; /*N'importe quelle touche du clavier arrête la simulation.*/
                                      }
                                      
                                      for(i = 1 ; i <= lngX / PIX ; i++)
                                      {
                                          for(j = 1 ; j <= lngY / PIX ; j++)
                                          {
                                              position.x = (i - 1) * PIX;
                                              position.y = (j - 1) * PIX;
                                              
                                              SDL_BlitSurface(grille[i][j] ? vie : mort, NULL, ecran, &position); /*Affichage de chaque cellule morte ou vivante suivant la grille principale.*/
                                          }
                                      }
                                      
                                      SDL_Flip(ecran); /*Mise à jour de l'écran.*/
                                      
                                      for(i = 1 ; i <= lngX / PIX ; i++)
                                      {
                                          for(j = 1 ; j <= lngY / PIX ; j++)
                                          {
                                              somme = grille[i-1][j-1] + grille[i][j-1] + grille[i+1][j-1] + grille[i-1][j] + grille[i+1][j] + grille[i-1][j+1] + grille[i][j+1] + grille[i+1][j+1];
                                              
                                              if(grille[i][j]) /*Coeur de la simulation : suivant le nombre de cellules adjacentes à la cellule courante, celle-ci meurt ou vie.*/
                                                  grilleModif[i][j] = (somme < 2 || somme > 3) ? 0 : 1;
                                              else
                                                  grilleModif[i][j] = (somme == 3) ? 1 : 0;
                                          }
                                      }
                                      
                                      for(i = 1 ; i <= lngX / PIX ; i++) /*Application des modifications à la grille principale.*/
                                          for(j = 1 ; j <= lngY / PIX ; j++)
                                              grille[i][j] = grilleModif[i][j];
                                      
                                      if(permutation) /*Condition vraie tous les deux tours.*/
                                      {
                                          for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                                              for(j = 0 ; j <= lngY / PIX + 1 ; j++)
                                                  if(grilleTest[i][j] == grille[i][j])
                                                      compteur++; /*On compte le nombre de cellules identiques entre la grille principale et la grille précédente de deux tours.*/
                                          
                                          if(compteur == (lngX / PIX + 2) * (lngY / PIX + 2))
                                              continuer = 0; /*Si les grilles sont identiques la simulation recommence.*/
                                          else
                                              for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                                                  for(j = 0 ; j <= lngY / PIX + 1 ; j++)
                                                      grilleTest[i][j] = grille[i][j]; /*Sinon on copie la grille principale dans la grille précédente.*/
                                          
                                          compteur = 0; /*On réinitialise le compteur.*/
                                      }
                                      
                                      permutation = !permutation;
                                  }
                                  
                                  continuer = 1; /*On réinitialise la boucle principale.*/
                              }
                              
                              for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                              {
                                  free(grille[i]); /*Libération des tableaux alloués dynamiquement.*/
                                  free(grilleModif[i]);
                                  free(grilleTest[i]);
                              }
                              
                              free(grille);
                              free(grilleModif);
                              free(grilleTest);
                              
                              SDL_FreeSurface(vie); /*Libération des cellules.*/
                              SDL_FreeSurface(mort);
                              
                              SDL_Quit(); /*Arrêt de la SDL*/
                              
                              return EXIT_SUCCESS; /*Fin du programme.*/
                          }
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 septembre 2011 à 10:24:15

                            Elles sont où les fonctions ? :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Staff désormais retraité.
                              10 septembre 2011 à 11:14:48

                              Mais pourquoi tu mets une licence sur un code bourrin non optimisé et personnel ? Qui aurait envie de le copier ? Bienvenue dans le monde de la pop-programmation.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              "If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
                                10 septembre 2011 à 11:39:48

                                @lucas-84 : Pour un code aussi court, je ne vois pas l'intérêt de créer des fonctions.

                                @schadocalex : Etant contre la pop-programmation je trouve ça insultant de dire que mettre une licence sur un projet est de la pop-programmation...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 septembre 2011 à 11:44:05

                                  128 lignes le main quand même. :p (enfin je dis ça, je dis rien... :-°)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Staff désormais retraité.
                                    10 septembre 2011 à 11:52:35

                                    @lucas-84 : Je suis d'accord, mais pour moi une fonction est quelque chose qui doit être appelée plusieurs fois dans le code, or ici aucun morceau de code ne se répéte plusieurs fois...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 septembre 2011 à 11:53:55

                                      Citation : lucas-84

                                      128 lignes le main quand même. :p (enfin je dis ça, je dis rien... :-°)


                                      +1

                                      Moi, c'est ce qui est avant la boucle principale qui me dérange un peu plus que le reste, c'est trop lourd.
                                      En fait, en utilisant juste une fonction d'initialisation et de libération; ça irait déjà mieux. :)

                                      Sinon, le code est bien commenté et tout ça. ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 septembre 2011 à 11:58:31

                                        Citation : Loadware

                                        @lucas-84 : Je suis d'accord, mais pour moi une fonction est quelque chose qui doit être appelée plusieurs fois dans le code, or ici aucun morceau de code ne se répéte plusieurs fois...



                                        Pas pour moi. :euh:
                                        Si tu as une fonction de 10 000 lignes sans répétition, tu ne divises pas ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Staff désormais retraité.
                                          10 septembre 2011 à 12:02:28

                                          J'avoue :-° , je pourrais faire comme paraze "en utilisant juste une fonction d'initialisation et de libération" mais ma fonction main ne fait pas 10000 lignes, juste 128 ^^
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 septembre 2011 à 12:58:00

                                            Loadware > Un code à trou comme ça avec une license ? alalalala, le monde est tombé bien bas. Je vais poster un code whil(i++) et je vais mettre une licence tiens !
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              10 septembre 2011 à 12:59:45

                                              lucas-84> C'est marrant il y a eu un sujet à ce propos, il y a quelques jours. Tu devrais jeter un coup d'oeil à la réponse de Renault.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 septembre 2011 à 13:04:14

                                                Citation : schadocalex

                                                Mais pourquoi tu mets une licence sur un code bourrin non optimisé et personnel ? Qui aurait envie de le copier ? Bienvenue dans le monde de la pop-programmation.

                                                Citation : Pouet_forever

                                                Loadware > Un code à trou comme ça avec une license ? alalalala, le monde est tombé bien bas. Je vais poster un code whil(i++) et je vais mettre une licence tiens !

                                                Il me semble que le but de ce topic c'est de donner des réponses constructives non?


                                                J'ai remarqué un petit bug ici :
                                                grille = malloc((lngX / PIX + 2) * sizeof(int));
                                                    grilleModif = malloc((lngX / PIX + 2) * sizeof(int));
                                                    grilleTest = malloc((lngX / PIX + 2) * sizeof(int));
                                                    
                                                    for(i = 0 ; i <= lngX / PIX + 1 ; i++) /*Allocation dynamique des tableaux en fonction de la résolution.*/
                                                    {
                                                        grille[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                        grilleModif[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                        grilleTest[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                    }
                                                
                                                Tu dois inverser, mettre sizeof int* avant la boucle et sizeof int dans la boucle.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  10 septembre 2011 à 13:06:25

                                                  Alors déjà une fonction n'est pas censé faire plus de 30 lignes.
                                                  Et de deux on ne code pas dans le main, parce que si tu veux intégrer ce mini projet à un autre programme tu fais comment?
                                                  Y'aura deux main() du coup?

                                                  Un programme avec deux main() à du mal à compiler.

                                                  Loadware, peut être que ton code marche bien mais ils ont raison, il est pas propre...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 septembre 2011 à 13:11:46

                                                    Citation : Mr21

                                                    Alors déjà une fonction n'est pas censé faire plus de 30 lignes.

                                                    :lol:
                                                    Mais lol ! Mais ce n'est pas le sujet. Juste pour dire qu'en plus le nombre de lignes n'est pas significatif, ça dépend de l'indentation toussa. On continue sur un autre topic.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    "If debbugging is the process of removing bugs, then programming must be the process of putting them in." (Edsger Dijkstra)
                                                      10 septembre 2011 à 14:23:49

                                                      Citation : neowillow

                                                      lucas-84> C'est marrant il y a eu un sujet à ce propos, il y a quelques jours. Tu devrais jeter un coup d'oeil à la réponse de Renault.



                                                      Oui, justement j'avais suivi de loin le sujet en question. C'est peut-être une question subjective, mais de manière générale, vous ne pouvez nier que voir une fonction main de 128 lignes, c'est pas trop agréable. On s'y perd vite.

                                                      Citation : schadocalex

                                                      Citation : Mr21

                                                      Alors déjà une fonction n'est pas censé faire plus de 30 lignes.

                                                      :lol:
                                                      Mais lol ! Mais ce n'est pas le sujet. Juste pour dire qu'en plus le nombre de lignes n'est pas significatif, ça dépend de l'indentation toussa. On continue sur un autre topic.



                                                      Bah si on est dans le sujet, on essaie de débattre sur l'optimisation d'un code...
                                                      Ah, en fait, après avoir regardé ci-dessus, je viens de remarquer que l'auteur du code a supprimé ce dernier. Là, effectivement, on est dans le hors sujet... :-°
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Staff désormais retraité.
                                                        10 septembre 2011 à 14:31:52

                                                        @lucas-84 : J'ai supprimé mon code car le but de ce sujet n'est pas de débattre dessus, d'autant plus qu'il n'intervient pas de le défi.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          10 septembre 2011 à 14:42:01

                                                          Mais non, c'est instructif. Je remets ton code sans la pollution que tu avais mise :

                                                          #include <time.h>
                                                          #include <stdio.h>
                                                          #include <stdlib.h>
                                                          #include <SDL/SDL.h>
                                                          
                                                          #define PIX 2 /*Taille en pixels d'une cellule.*/
                                                          
                                                          int main(int argc, char *argv[])
                                                          {
                                                            int recommencer = 1, continuer = 1, permutation = 0; /*Booléens.*/
                                                            int **grille, **grilleModif, **grilleTest; /*Grilles de cellules.*/
                                                            int i = 0, j = 0, somme = 0, compteur = 0, lngX = 640, lngY = 480;
                                                            SDL_Surface *ecran = NULL, *vie = NULL, *mort = NULL;
                                                            SDL_Event event;
                                                            SDL_Rect position, **taille;
                                                            
                                                            srand(time(NULL));
                                                            
                                                            SDL_Init(SDL_INIT_VIDEO); /*Lancement de la SDL.*/
                                                            
                                                            SDL_ShowCursor(SDL_DISABLE);
                                                            
                                                            taille = SDL_ListModes(NULL, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
                                                            lngX = taille[0]->w; /*Récupération de la résolution maximale de l'écran.*/
                                                            lngY = taille[0]->h;
                                                            
                                                            grille = malloc((lngX / PIX + 2) * sizeof(int));
                                                            grilleModif = malloc((lngX / PIX + 2) * sizeof(int));
                                                            grilleTest = malloc((lngX / PIX + 2) * sizeof(int));
                                                            
                                                            for(i = 0 ; i <= lngX / PIX + 1 ; i++) /*Allocation dynamique des tableaux en fonction de la résolution.*/
                                                            {
                                                              grille[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                              grilleModif[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                              grilleTest[i] = malloc((lngY / PIX + 2) * sizeof(int*));
                                                            }
                                                            
                                                            ecran = SDL_SetVideoMode(lngX, lngY, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);    
                                                            SDL_WM_SetCaption("Jeu de la vie par Loadware", NULL); /*Création de la fenêntre en plein écran.*/
                                                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 128, 0));
                                                            
                                                            vie = SDL_CreateRGBSurface(SDL_HWSURFACE, PIX, PIX, 32, 0, 0, 0, 0);
                                                            SDL_FillRect(vie, NULL, SDL_MapRGB(ecran->format, 128, 0, 0)); /*Création de la cellule vivante rouge.*/
                                                            
                                                            mort = SDL_CreateRGBSurface(SDL_HWSURFACE, PIX, PIX, 32, 0, 0, 0, 0);
                                                            SDL_FillRect(mort, NULL, SDL_MapRGB(ecran->format, 0, 0, 0)); /*Création de la cellule morte noire.*/
                                                            
                                                            while(recommencer) /*Boucle permettant de recommencer une simulation.*/
                                                            {
                                                              for(i = 1 ; i <= lngX / PIX ; i++) /*Remplissage de la grille principale et de la grille des modifications.*/
                                                                for(j = 1 ; j <= lngY / PIX ; j++)
                                                                  grille[i][j] = (grilleModif[i][j] = rand() % 2);
                                                              
                                                              while(continuer) /*Boucle principale de la simulation*/
                                                              {
                                                                SDL_Delay(80);
                                                                
                                                                SDL_PollEvent(&event);
                                                                
                                                                if(event.type == SDL_KEYDOWN)
                                                                {
                                                                  recommencer = 0;
                                                                  continuer = 0; /*N'importe quelle touche du clavier arrête la simulation.*/
                                                                }
                                                                
                                                                for(i = 1 ; i <= lngX / PIX ; i++)
                                                                {
                                                                  for(j = 1 ; j <= lngY / PIX ; j++)
                                                                  {
                                                                    position.x = (i - 1) * PIX;
                                                                    position.y = (j - 1) * PIX;
                                                                    
                                                                    SDL_BlitSurface(grille[i][j] ? vie : mort, NULL, ecran, &position); /*Affichage de chaque cellule morte ou vivante suivant la grille principale.*/
                                                                  }
                                                                }
                                                                
                                                                SDL_Flip(ecran); /*Mise à jour de l'écran.*/
                                                                
                                                                for(i = 1 ; i <= lngX / PIX ; i++)
                                                                {
                                                                  for(j = 1 ; j <= lngY / PIX ; j++)
                                                                  {
                                                                    somme = grille[i-1][j-1] + grille[i][j-1] + grille[i+1][j-1] + grille[i-1][j] + grille[i+1][j] + grille[i-1][j+1] + grille[i][j+1] + grille[i+1][j+1];
                                                                    
                                                                    if(grille[i][j]) /*Coeur de la simulation : suivant le nombre de cellules adjacentes à la cellule courante, celle-ci meurt ou vie.*/
                                                                      grilleModif[i][j] = (somme < 2 || somme > 3) ? 0 : 1;
                                                                    else
                                                                      grilleModif[i][j] = (somme == 3) ? 1 : 0;
                                                                  }
                                                                }
                                                                
                                                                for(i = 1 ; i <= lngX / PIX ; i++) /*Application des modifications à la grille principale.*/
                                                                  for(j = 1 ; j <= lngY / PIX ; j++)
                                                                    grille[i][j] = grilleModif[i][j];
                                                                
                                                                if(permutation) /*Condition vraie tous les deux tours.*/
                                                                {
                                                                  for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                                                                    for(j = 0 ; j <= lngY / PIX + 1 ; j++)
                                                                      if(grilleTest[i][j] == grille[i][j])
                                                                        compteur++; /*On compte le nombre de cellules identiques entre la grille principale et la grille précédente de deux tours.*/
                                                                  
                                                                  if(compteur == (lngX / PIX + 2) * (lngY / PIX + 2))
                                                                    continuer = 0; /*Si les grilles sont identiques la simulation recommence.*/
                                                                  else
                                                                    for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                                                                      for(j = 0 ; j <= lngY / PIX + 1 ; j++)
                                                                        grilleTest[i][j] = grille[i][j]; /*Sinon on copie la grille principale dans la grille précédente.*/
                                                                  
                                                                  compteur = 0; /*On réinitialise le compteur.*/
                                                                }
                                                                
                                                                permutation = !permutation;
                                                              }
                                                              
                                                              continuer = 1; /*On réinitialise la boucle principale.*/
                                                            }
                                                            
                                                            for(i = 0 ; i <= lngX / PIX + 1 ; i++)
                                                            {
                                                              free(grille[i]); /*Libération des tableaux alloués dynamiquement.*/
                                                              free(grilleModif[i]);
                                                              free(grilleTest[i]);
                                                            }
                                                            
                                                            free(grille);
                                                            free(grilleModif);
                                                            free(grilleTest);
                                                            
                                                            SDL_FreeSurface(vie); /*Libération des cellules.*/
                                                            SDL_FreeSurface(mort);
                                                            
                                                            SDL_Quit(); /*Arrêt de la SDL*/
                                                            
                                                            return EXIT_SUCCESS; /*Fin du programme.*/
                                                          }
                                                          
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            10 septembre 2011 à 15:10:09

                                                            Citation : Loadware

                                                            @lucas-84 : J'ai supprimé mon code car le but de ce sujet n'est pas de débattre dessus, d'autant plus qu'il n'intervient pas de le défi.



                                                            Bah si, le but du sujet c'est d'améliorer les codes des participants. De plus, ton code représentait un jeu de la vie, ce qui correspond au sujet...
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Staff désormais retraité.

                                                            [FAIT][Défis] #2 : Le jeu de la vie !

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown