Partage
  • Partager sur Facebook
  • Partager sur Twitter

zMorp - 1ère partie

Créer un morpion

    20 juillet 2011 à 22:55:38

    finalement je crois que le zMorp SDL va attendre --'
    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2011 à 12:49:17

      Bonjour,

      J'avais déjà codé ZMorp, mais il n'était pas terrible, et j'ai décidé de le reprendre... seulement voilà : il y a des erreurs que je ne comprends pas o_O
      Si on entre comme cases 1 puis 3 puis 2, il indique que l'entrée n'est pas valide. De plus, on peut modifier les entrées du deuxième joueur... :-°
      Pourtant, les conditions de "testerCoup" me semblent claires, et empêcher ce genre de choses! :(
      Alors merci de m'aider si possible...

      Voici le main :

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      #include <math.h>
      #include "fonction.h"
      
      #define NOMBRE_DE_POINTS 9
      #define LIG_COLL 3
      
      #ifdef __WINDOWS__
      #define EFF_ECR system("cls");
      #endif
      
      #ifdef __APPLE__ 
      #define EFF_ECR system("clear");
      #endif
      
      
      int main()
      {
          int continuer=1;
          while (continuer)
          {
      		int quelJoueur=0, i=0, choixCase=0;
      		int quelsPointsOntEteMis[NOMBRE_DE_POINTS]={0};//tableau pour savoir qui a joué quoi
      		
      		srand(time(NULL));
      		if (rand()<0,5)
      			quelJoueur=1;
      		else
      			quelJoueur=2;
      		
      		printf("\tBienvenue dans le jeu de Morpion!\n\n\n");
      		
      		do
      		{
      			choixCase = 0;
      			i++;
      			jouer (&quelJoueur);
      			affichage(quelsPointsOntEteMis);
      			saisie(&choixCase);
      			
      			if (testerCoup(choixCase, quelsPointsOntEteMis))
      			{
      				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
      			}
      			
      			else
      			{
      				do
      				{
      					EFF_ECR
      					printf ("\n\nCette selection n'est pas valide, veuillez recommencer.\n\n");
      					affichage(quelsPointsOntEteMis);
      					saisie(&choixCase);
      				}while(!testerCoup(choixCase,quelsPointsOntEteMis));
      				
      				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
      			}
      			EFF_ECR
      		}while (i<NOMBRE_DE_POINTS && !testerGagnant(quelsPointsOntEteMis, quelJoueur));
      		
      		
      		if (testerGagnant(quelsPointsOntEteMis, quelJoueur))
      		{
      			EFF_ECR
      			printf("\n\n\tBRAVO, joueur %d, vous avez gagne!!!", quelJoueur);
      		}
      		
      		else
      		{
      			EFF_ECR
      			printf("\n\n\tEGALITE");
      		}
      		
      		printf("\n\nVoulez-vous recommencer?\n\n1 oui\n2 non\n");
      		scanf("%d", &continuer);
      		if (continuer == 2) continuer = 0;
      		if (continuer)
      			EFF_ECR
          }
      	
      	
          return EXIT_SUCCESS;
      }
      



      Puis fonction.h

      #ifndef A
      #define A
      
      void jouer(int* quelJoueur);
      
      void affichage(int quelsPointsOntEteMis[]);
      
      int saisie(int *choixCase);
      
      int testerCoup(int choixCase, int quelsPointsOntEteMis[]);
      
      void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur);
      
      int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur);
      
      #endif
      




      En enfin fonction.c
      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      #include <ctype.h>
      #include <math.h>
      #include "fonction.h"
      
      #define NOMBRE_DE_POINTS 9
      #define LIG_COLL 3
      
      #ifdef __WINDOWS__
      #define EFF_ECR system("cls");
      #endif
      #ifdef __APPLE__ 
      #define EFF_ECR system("clear");
      #endif
      
      
      void jouer(int *quelJoueur)
      {
          *quelJoueur=3-*quelJoueur;//alterne joueur 1 et 2
          printf("\n\nC'est a joueur %d de jouer\n\n", *quelJoueur);
      }
      
      void affichage(int quelsPointsOntEteMis[])
      {
          int i=0;
          for (i=0; i<NOMBRE_DE_POINTS; i++)
          {
              if (!quelsPointsOntEteMis[i])
                  printf(". ");
              else if (quelsPointsOntEteMis[i]==1)
                  printf("X ");
              else if (quelsPointsOntEteMis[i]==2)
                  printf("O ");
              else
                  printf("erreur d'affichage");
      		
              if (!((i+1)% LIG_COLL))
                  printf("\n");
          }
      }
      
      int saisie(int *choixCase)
      {
          printf("\nPour jouer, veuillez entrer un nombre entier naturel entre 1 et 9 inclus. Celui-ci correspodra a une case de la grille ; il vous suffit de compter les points de gauche a droite :");
          scanf ("%d", &*choixCase);
      	return 1;
      }
      
      int testerCoup(int choixCase, int quelsPointsOntEteMis[])
      {
      	return (choixCase <= NOMBRE_DE_POINTS && choixCase > 0 && quelsPointsOntEteMis[choixCase]==0);
      }
      
      void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur)
      {
      	quelsPointsOntEteMis[choixCase-1]=quelJoueur;
      }
      
      int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur)
      {
      	
          if ((quelsPointsOntEteMis[0]==quelJoueur && quelsPointsOntEteMis[1]==quelJoueur && quelsPointsOntEteMis[2]==quelJoueur)||(quelsPointsOntEteMis[3]==quelJoueur && quelsPointsOntEteMis[4]==quelJoueur && quelsPointsOntEteMis[5]==quelJoueur)\
      		||(quelsPointsOntEteMis[6]==quelJoueur && quelsPointsOntEteMis[7]==quelJoueur && quelsPointsOntEteMis[8]==quelJoueur)||(quelsPointsOntEteMis[0]==quelJoueur && quelsPointsOntEteMis[4]==quelJoueur && quelsPointsOntEteMis[8]==quelJoueur)\
      		||(quelsPointsOntEteMis[2]==quelJoueur && quelsPointsOntEteMis[4]==quelJoueur && quelsPointsOntEteMis[6]==quelJoueur))
      		return 1;
      	else
      		return 0;
      }
      




      Bonne lecture, et merci :)
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2011 à 19:15:13

        Tu fais 2 macros dans 2 fichiers différents... pourquoi ne pas les regrouper dans 1 seul ? ça t'éviteras des erreurs par la suite.
        Tu as bien protégé ton fichier contre l'inclusion multiple, mais tu pourrais trouver un autre nom tu ne trouves pas ? A c'est pas génial ! :)
        Tu appelles srand dans la boucle de jeu, sors le de la boucle.
        if (rand()<0,5) > cette condition sera toujours vraie ! rand retourne un entier positif, pas un réel. On utilise le point (.) et pas la virgule pour représenter les nombres flottants. Ta condition revient simplement à faire if (5)... ;)
        Je pense que tu auras un souci avec ta fonction d'affichage, c'est i != 0 && i % LIG_COLL == 0
        Heum, le fait de faire ça scanf ("%d", &*choixCase); revient à faire scanf ("%d", choixCase); ;)
        Ta fonction testerCoup est fausse ! il faut que tu vérifies si 'choixCase' est compris entre 0 inclus et 9 exclus et pas entre 1 et 9 inclus tous deux. Tu le fais dans ta fonction jouerCoup. Du coup la fonction testerCoup vérifie en dehors du tableau si choixCase == 9 et tu vérifies la case d'à côté alors que tu places à la bonne case.
        Tu peux virer les backslash dans ta fonction testerGagnant, ça sert pour les macros, on s'en fou pour les fonctions. ^^

        Bon, tu pourrais améliorer des trucs, mais finis ça déjà. :)
        Bon courage !
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2011 à 21:28:10

          Merci, j'ai suivi tous les conseils... Mais zMorp ne fonctionne toujours pas o_O
          On peut toujours modifier la croix ou le cercle de l'autre joueur
          Le programme ne s'arrête toujours pas si quelqu'un a gagné... :(
          Mais "Patience et longueur de temps font plus que force ni que rage" alors persévérons :p

          Je remets mon code...

          Main.c

          #include <stdio.h>
          #include <stdlib.h>
          #include <time.h>
          #include <math.h>
          #include "fonction.h"
          
          
          int main()
          {
              int continuer=1;
          	srand(time(NULL));
              while (continuer)
              {
          		int quelJoueur=0, i=0, choixCase=0;
          		int quelsPointsOntEteMis[NOMBRE_DE_POINTS]={0};//tableau pour savoir qui a joué quoi
          		
          		quelJoueur = rand() % 2 + 1;
          		
          		printf("\tBienvenue dans le jeu de Morpion!\n\n\n");
          		
          		do
          		{
          			choixCase = 0;
          			i++;
          			jouer (&quelJoueur);
          			affichage(quelsPointsOntEteMis);
          			saisie(&choixCase);
          			
          			if (testerCoup(choixCase, quelsPointsOntEteMis))
          			{
          				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
          			}
          			
          			else
          			{
          				do
          				{
          					EFF_ECR
          					printf ("\n\nCette selection n'est pas valide, veuillez recommencer.\n\n");
          					affichage(quelsPointsOntEteMis);
          					saisie(&choixCase);
          				}while(!testerCoup(choixCase,quelsPointsOntEteMis));
          				
          				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
          			}
          			EFF_ECR
          		}while (i<NOMBRE_DE_POINTS && !testerGagnant(quelsPointsOntEteMis, quelJoueur));
          		
          		
          		if (testerGagnant(quelsPointsOntEteMis, quelJoueur))
          		{
          			EFF_ECR
          			printf("\n\n\tBRAVO, joueur %d, vous avez gagne!!!", quelJoueur);
          		}
          		
          		else
          		{
          			EFF_ECR
          			printf("\n\n\tEGALITE");
          		}
          		
          		printf("\n\nVoulez-vous recommencer?\n\n1 oui\n2 non\n");
          		scanf("%d", &continuer);
          		if (continuer == 2) continuer = 0;
          		if (continuer)
          			EFF_ECR
              }
          	
          	
              return EXIT_SUCCESS;
          }
          


          fonction.h

          #ifndef A_INCL
          #define A_INCL
          
          #ifdef __WINDOWS__
          #define EFF_ECR system("cls");
          #endif
          #ifdef __APPLE__ 
          #define EFF_ECR system("clear");
          #endif
          
          #define NOMBRE_DE_POINTS 9
          #define LIG_COLL 3
          
          void jouer(int* quelJoueur);
          
          void affichage(int quelsPointsOntEteMis[]);
          
          int saisie(int *choixCase);
          
          int testerCoup(int choixCase, int quelsPointsOntEteMis[]);
          
          void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur);
          
          int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur);
          
          #endif
          


          fonction.c

          #include <stdio.h>
          #include <stdlib.h>
          #include <time.h>
          #include <ctype.h>
          #include <math.h>
          #include "fonction.h"
          
          
          
          
          void jouer(int *quelJoueur)
          {
              *quelJoueur=3-*quelJoueur;//alterne joueur 1 et 2
              printf("\n\nC'est a joueur %d de jouer\n\n", *quelJoueur);
          }
          
          void affichage(int quelsPointsOntEteMis[])
          {
              int i=0;
              for (i=0; i<NOMBRE_DE_POINTS; i++)
              {
                  if (!quelsPointsOntEteMis[i])
                      printf(". ");
                  else if (quelsPointsOntEteMis[i]==1)
                      printf("X ");
                  else if (quelsPointsOntEteMis[i]==2)
                      printf("O ");
                  else
                      printf("erreur d'affichage");
          		
                  if (i!=0 && (i+1) % LIG_COLL==0)
                      printf("\n");
              }
          }
          
          int saisie(int *choixCase)
          {
              printf("\nPour jouer, veuillez entrer un nombre entier naturel entre 1 et 9 inclus. Celui-ci correspodra a une case de la grille ; il vous suffit de compter les points de gauche a droite :");
              scanf ("%d", choixCase);
          	return 1;
          }
          
          int testerCoup(int choixCase, int quelsPointsOntEteMis[])
          {
          	return (choixCase < NOMBRE_DE_POINTS && choixCase >= 0 && quelsPointsOntEteMis[choixCase]==0);
          }
          
          void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur)
          {
          	quelsPointsOntEteMis[choixCase-1]=quelJoueur;
          }
          
          int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur)
          {
          	
              if ((quelsPointsOntEteMis[0]==1 && quelsPointsOntEteMis[1]==1 && quelsPointsOntEteMis[2]==1)||(quelsPointsOntEteMis[3]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[5]==1)
          		||(quelsPointsOntEteMis[6]==1 && quelsPointsOntEteMis[7]==1 && quelsPointsOntEteMis[8]==1)||(quelsPointsOntEteMis[0]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[8]==1)
          		||(quelsPointsOntEteMis[2]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[6]==1))
          		return 1;
          	else if ((quelsPointsOntEteMis[0]==2 && quelsPointsOntEteMis[1]==2 && quelsPointsOntEteMis[2]==2)||(quelsPointsOntEteMis[3]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[5]==2)
          			 ||(quelsPointsOntEteMis[6]==2 && quelsPointsOntEteMis[7]==2 && quelsPointsOntEteMis[8]==2)||(quelsPointsOntEteMis[0]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[8]==2)
          			 ||(quelsPointsOntEteMis[2]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[6]==2))
          		return 1;
          	else
          		return 0;
          }
          



          Merci encore! :ange:
          • Partager sur Facebook
          • Partager sur Twitter
            2 novembre 2011 à 23:09:58

            testerCoup et saisieCoup ne sont pas en concordance !
            Dans l'un tu testes une valeur entre 0-8 (inclus) et dans l'autre tu fais un -1 (donc entre -1 et 7 inclus). :s
            Soit tu compares tes nombres moins un dans testerCoup, soit tu compares entre 0-8 et tu ne fais pas de -1 dans saisieCoup. :)
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2011 à 12:24:37

              Heu, par "saisieCoup" tu voulais sans doute dire "jouerCoup", non? Parce que non seulement cette fonction n'existe pas, mais encore il y a -1 dans "jouer coup". :)
              Je vais essayer...
              Merci !
              • Partager sur Facebook
              • Partager sur Twitter
                3 novembre 2011 à 17:00:41

                Oui, pardon, c'est jouerCoup et testerCoup. :)
                • Partager sur Facebook
                • Partager sur Twitter
                  6 novembre 2011 à 12:38:57

                  Voilà ma dernière version du code. Si vous avez des idées d'améliorations... :D

                  Le main :
                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <time.h>
                  #include <math.h>
                  #include "fonction.h"
                  
                  
                  int main()
                  {
                      int continuer=1;
                      char joueur1[16]={0}, joueur2[16]={0};
                  	EFF_ECR
                  	
                  #ifndef __APPLE__
                      system ("color 4e");
                  #endif
                      printf("\n\tBienvenue dans le jeu du MORPION!\n\n\n");
                  	
                      while (!nomsJoueurs(joueur1, joueur2))
                          printf("\n\n\tERREUR, veuillez retenter...\n");
                  	
                  	srand(time(NULL));
                  	
                      while (continuer)
                      {
                  		int quelJoueur=0, i=0, choixCase=0;
                  		int quelsPointsOntEteMis[NOMBRE_DE_POINTS]={0};//tableau pour savoir qui a jouÈ quoi
                  		
                  		quelJoueur = rand() % 2 + 1;
                  		
                  		
                  		do
                  		{
                  			choixCase = 0;
                  			i++;
                  			jouer (&quelJoueur, joueur1, joueur2);
                  			affichage(quelsPointsOntEteMis);
                  			saisie(&choixCase);
                  			
                  			if (testerCoup(choixCase, quelsPointsOntEteMis))
                  			{
                  				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
                  			}
                  			
                  			else
                  			{
                  				do
                  				{
                  					EFF_ECR
                  					printf ("\n\nCette selection n'est pas valide, veuillez recommencer.\n\n");
                  					affichage(quelsPointsOntEteMis);
                  					saisie(&choixCase);
                  				}while(!testerCoup(choixCase,quelsPointsOntEteMis));
                  				
                  				jouerCoup(quelsPointsOntEteMis, choixCase, quelJoueur);
                  			}
                  			EFF_ECR
                  		}while (i<NOMBRE_DE_POINTS && !testerGagnant(quelsPointsOntEteMis, quelJoueur));
                  		
                  		
                  		if (testerGagnant(quelsPointsOntEteMis, quelJoueur))
                  		{
                  			EFF_ECR
                  			affichage(quelsPointsOntEteMis);
                  			if (quelJoueur == 1)
                                  printf("\n\n\tBRAVO, %s, vous avez gagne!!!", joueur1);
                              else
                                  printf("\n\n\tBRAVO, %s, vous avez gagne!!!", joueur2);
                  		}
                  		
                  		else
                  		{
                  			EFF_ECR
                  			affichage(quelsPointsOntEteMis);
                  			printf("\n\n\tEGALITE");
                  		}
                  		
                  		printf("\n\nQue voulez-vous faire?\n\n1 continuer\n2 quitter\n3 changer les noms\n\t");
                  		scanf("%d", &continuer);
                  		if (continuer == 2) continuer = 0;
                  		else if (continuer == 3)
                              nomsJoueurs(joueur1, joueur2);
                  		if (continuer)
                  			EFF_ECR
                  			}
                  	
                  	
                      return EXIT_SUCCESS;
                  }
                  


                  fonction.h
                  #ifndef A_INCL
                  #define A_INCL
                  
                  #ifdef __APPLE__
                  #define EFF_ECR system("clear");
                  #endif
                  #ifndef __APPLE__
                  #define EFF_ECR system("cls");
                  #endif
                  
                  #define NOMBRE_DE_POINTS 9
                  #define LIG_COLL 3
                  
                  void jouer(int* quelJoueur, char joueur1 [], char joueur2 []);
                  
                  void affichage(int quelsPointsOntEteMis[]);
                  
                  int saisie(int *choixCase);
                  
                  int testerCoup(int choixCase, int quelsPointsOntEteMis[]);
                  
                  void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur);
                  
                  int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur);
                  
                  int nomsJoueurs (char joueur1[], char joueur2[]);
                  
                  #endif
                  


                  fonction.c
                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <time.h>
                  #include <math.h>
                  #include "fonction.h"
                  
                  
                  
                  
                  void jouer(int *quelJoueur, char joueur1 [], char joueur2 [])
                  {
                      *quelJoueur=3-*quelJoueur;//alterne joueur 1 et 2
                      if (*quelJoueur == 1)
                          printf("\n\nC'est a %s de jouer\n\n", joueur1);
                      else if (*quelJoueur == 2)
                          printf("\n\nC'est a %s de jouer\n\n", joueur2);
                  }
                  
                  void affichage(int quelsPointsOntEteMis[])
                  {
                      int i=0;
                      for (i=0; i<NOMBRE_DE_POINTS; i++)
                      {
                          if (!quelsPointsOntEteMis[i])
                              printf(". ");
                          else if (quelsPointsOntEteMis[i]==1)
                              printf("X ");
                          else if (quelsPointsOntEteMis[i]==2)
                              printf("O ");
                          else
                              printf("erreur d'affichage");
                  		
                          if (i!=0 && (i+1) % LIG_COLL==0)
                              printf("\n");
                      }
                  }
                  
                  int saisie(int *choixCase)
                  {
                      printf("\nPour jouer, veuillez entrer un nombre entier naturel entre 1 et 9 inclus. Celui-ci correspodra a une case de la grille ; il vous suffit de compter les points de gauche a droite :");
                      scanf ("%d", choixCase);
                  	return 1;
                  }
                  
                  int testerCoup(int choixCase, int quelsPointsOntEteMis[])
                  {
                  	return (choixCase-1 < NOMBRE_DE_POINTS && choixCase-1 >= 0 && quelsPointsOntEteMis[choixCase-1]==0);
                  }
                  
                  void jouerCoup(int quelsPointsOntEteMis[], int choixCase, int quelJoueur)
                  {
                  	quelsPointsOntEteMis[choixCase-1]=quelJoueur;
                  }
                  
                  int testerGagnant(int quelsPointsOntEteMis[], int quelJoueur)
                  {
                  	
                      if ((quelsPointsOntEteMis[0]==1 && quelsPointsOntEteMis[1]==1 && quelsPointsOntEteMis[2]==1)||(quelsPointsOntEteMis[3]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[5]==1)
                  		||(quelsPointsOntEteMis[6]==1 && quelsPointsOntEteMis[7]==1 && quelsPointsOntEteMis[8]==1)||(quelsPointsOntEteMis[0]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[8]==1)
                  		||(quelsPointsOntEteMis[2]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[6]==1)||(quelsPointsOntEteMis[0]==1 && quelsPointsOntEteMis[3]==1 && quelsPointsOntEteMis[6]==1)
                          ||(quelsPointsOntEteMis[1]==1 && quelsPointsOntEteMis[4]==1 && quelsPointsOntEteMis[7]==1)||(quelsPointsOntEteMis[2]==1 && quelsPointsOntEteMis[5]==1 && quelsPointsOntEteMis[8]==1))
                  		return 1;
                  	else if ((quelsPointsOntEteMis[0]==2 && quelsPointsOntEteMis[1]==2 && quelsPointsOntEteMis[2]==2)||(quelsPointsOntEteMis[3]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[5]==2)
                  			 ||(quelsPointsOntEteMis[6]==2 && quelsPointsOntEteMis[7]==2 && quelsPointsOntEteMis[8]==2)||(quelsPointsOntEteMis[0]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[8]==2)
                  			 ||(quelsPointsOntEteMis[2]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[6]==2)||(quelsPointsOntEteMis[0]==2 && quelsPointsOntEteMis[3]==2 && quelsPointsOntEteMis[6]==2)
                               ||(quelsPointsOntEteMis[1]==2 && quelsPointsOntEteMis[4]==2 && quelsPointsOntEteMis[7]==2)||(quelsPointsOntEteMis[2]==2 && quelsPointsOntEteMis[5]==2 && quelsPointsOntEteMis[8]==2))
                  		return 1;
                  	else
                  		return 0;
                  }
                  
                  
                  int nomsJoueurs (char joueur1[], char joueur2[])
                  {
                      printf("\n\nJoueur 1, veuillez entrer votre nom (max 15 caracteres):");
                      scanf("%s", joueur1);
                      printf("\n\nJoueur 2, veuillez entrer votre nom (max 15 caracteres):");
                      scanf("%s", joueur2);
                      return 1;
                  }
                  


                  Merci encore! :ange:
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 novembre 2011 à 20:19:38

                    Merci pour cet exercice génial !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juin 2012 à 19:07:41

                      Uhm, pourquoi ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Staff désormais retraité.
                        20 juin 2012 à 19:14:42

                        parce que j'aime ce morpion et que je vais bientôt en refaire un :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 juin 2012 à 2:21:29

                          Ca date mais j'ai vu ça ce soir et j'ai décidé de le faire afin de me détendre, je n'ai pas cherché très loin s'il y avait des bugs vu l'heure (j'ai bac demain...) et je ne sais pas non plus si je n'ai pas oublié certaines conditions de l'exo, enfin, sinon voilà !

                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <time.h>
                          
                          #define NB_PLAYER       2
                          #define NB_CASE         3
                          
                          typedef struct
                          {
                              int keyPush;
                              int firstPlayer;
                              int actualPlayer;
                              int replay;
                          } SPlayer;
                          
                          typedef struct
                          {
                              char bGame[NB_CASE][NB_CASE];
                              int turn;
                              int inGame;
                              int win;
                          } SGame;
                          
                          void play();
                          void init_sPlayer(SPlayer *sPlayer);
                          void init_sGame(SGame *sGame);
                          void drawGrid(SGame *sGame);
                          void getTurn(SGame *sGame, SPlayer *sPlayer);
                          void changePlayer(SPlayer *sPlayer);
                          void testWin(SGame *sGame);
                          void testRegame(SGame *sGame);
                          void newGame();
                          
                          int main()
                          {
                            srand(time(NULL));
                            play();
                          }
                          
                          void play()
                          {
                              SPlayer sPlayer;
                              SGame sGame;
                              sGame.turn = 0;
                              sGame.inGame = 1;
                              while(sGame.inGame)
                              {
                                  if(!sGame.turn)
                                  {
                                      init_sPlayer(&sPlayer);
                                      init_sGame(&sGame);
                                      printf("Le joueur %d commence\n", sPlayer.firstPlayer);
                                  }
                                  if(sGame.turn > 0)
                                      printf("Joueur %d c'est a votre tour\n", sPlayer.actualPlayer);
                                  drawGrid(&sGame);
                                  getTurn(&sGame, &sPlayer);
                                  editGrid(&sGame, &sPlayer);
                                  if(!sPlayer.replay)
                                  {
                                      changePlayer(&sPlayer);
                                      testWin(&sGame);
                                  }
                                  if(sGame.win)
                                  {
                                      printf("\nBravo, le jouer %d a gagne\n" , sPlayer.actualPlayer);
                                      testRegame(&sGame);
                                  }
                              }
                          }
                          
                          void init_sPlayer(SPlayer *sPlayer)
                          {
                              sPlayer->firstPlayer = (rand() % NB_PLAYER) + 1;
                              sPlayer->actualPlayer = sPlayer->firstPlayer;
                              sPlayer->keyPush = 0;
                              sPlayer->replay = 0;
                          }
                          
                          void init_sGame(SGame *sGame)
                          {
                              int i, j;
                          
                              for(i = 0; i < NB_CASE; i++)
                                  for(j = 0; j < NB_CASE; j++)
                                      sGame->bGame[i][j] = '.';
                          
                              sGame->inGame = 1;
                              sGame->win = 0;
                          }
                          
                          void drawGrid(SGame *sGame)
                          {
                              int i, j;
                          
                              for(i = 0; i < NB_CASE; i++)
                              {
                                  for(j = 0; j < NB_CASE; j++)
                                      printf(" %c ", sGame->bGame[i][j]);
                                  printf("\n");
                              }
                          }
                          
                          void getTurn(SGame *sGame, SPlayer *sPlayer)
                          {
                              do
                              {
                                  if(sPlayer->replay)
                                      printf("La case que vous avez selectionnee est deja utilisee");
                                  scanf("%d", &sPlayer->keyPush);
                                  if(sPlayer->keyPush < 1
                                     || sPlayer->keyPush > 9)
                                      printf("Rejouez votre tour, cette case n'existe pas !\n");
                              }while(sPlayer->keyPush < 1 || sPlayer->keyPush > 9);
                          
                              sGame->turn++;
                          }
                          
                          void editGrid(SGame *sGame, SPlayer *sPlayer)
                          {
                              int column, line;
                              if(!(sPlayer->keyPush % 3))
                                  column = 2;
                              else if(sPlayer->keyPush % 3 == 1)
                                  column = 0;
                              else
                                  column = 1;
                          
                              if(sPlayer->keyPush <= 3)
                                  line = 2;
                              else if(sPlayer->keyPush > 3
                                      && sPlayer->keyPush <= 6)
                                  line = 1;
                              else
                                  line = 0;
                          
                              if(sGame->bGame[line][column] != '.')
                              {
                                  sPlayer->replay = 1;
                                  sGame->turn--;
                              }
                              else if(sPlayer->actualPlayer == 1)
                              {
                                  sGame->bGame[line][column] = 'X';
                                  sPlayer->replay = 0;
                              }
                              else
                              {
                                  sGame->bGame[line][column] = 'O';
                                  sPlayer->replay = 0;
                              }
                          }
                          
                          void changePlayer(SPlayer *sPlayer)
                          {
                              if(sPlayer->actualPlayer == 1)
                                  sPlayer->actualPlayer = 2;
                              else
                                  sPlayer->actualPlayer = 1;
                          }
                          
                          void testWin(SGame *sGame)
                          {
                              int i;
                          
                              for(i = 0; i < NB_CASE; i++)
                                  if(sGame->bGame[i][0] == sGame->bGame[i][1]
                                  && sGame->bGame[i][1] == sGame->bGame[i][2]
                                  && sGame->bGame[i][0] != '.'
                                  || sGame->bGame[0][i] == sGame->bGame[1][i]
                                  && sGame->bGame[1][i] == sGame->bGame[2][i]
                                  && sGame->bGame[1][i] != '.')
                                      sGame->win = 1;
                          
                              i = 0;
                          
                              if(sGame->bGame[i][i]
                                 == sGame->bGame[i+1][i+1]
                                 && sGame->bGame[i+1][i+1]
                                 == sGame->bGame[i+2][i+2]
                                 && sGame->bGame[i+1][i+1] != '.')
                                      sGame->win = 1;
                          
                              if(sGame->bGame[0][2]
                                 == sGame->bGame[1][1]
                                 && sGame->bGame[1][1]
                                 == sGame->bGame[2][0]
                                 && sGame->bGame[1][1] != '.')
                                      sGame->win = 1;
                          }
                          
                          void testRegame(SGame *sGame)
                          {
                              printf("Rejouer ?\n 1 : Oui\n0 : Non\n");
                              do
                              {
                                  if(sGame->inGame < 0 || sGame->inGame > 1)
                                  {
                                      printf("Choix impossible, merci de donner une reponse demandee !\n");
                                      printf("Rejouer ?\n 1 : Oui\n0 : Non\n");
                                  }
                                  scanf("%d", &sGame->inGame);
                              } while(sGame->inGame != 0 && sGame->inGame != 1);
                          
                              if(sGame->inGame)
                              {
                                  sGame->turn = 0;
                                  newGame();
                              }
                          
                          }
                          
                          void newGame()
                          {
                              int i;
                          
                              for (i = 0; i < 10; i++)
                                  printf("\n");
                          }
                          


                          J'ai essayé de faire en sorte de ne pas avoir à scroller le code SDZ pour lire mon code ^^ Sinon contrairement à l'exemple, j'ai fait que quand on clique sur 7 c'est la première case, je trouve ça plus "logique" si on prend la vision d'un pavé numérique avec la grille ^^ Voilà voilà !
                          • Partager sur Facebook
                          • Partager sur Twitter

                          zMorp - 1ère partie

                          × 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