Débutant en C rencontre quelques soucis...

Débutant en C rencontre quelques soucis... - C - Programmation

Marsh Posté le 15-04-2018 à 19:51:21    

Bonjour,
Je suis débutant en C (moins de 4 mois de cours en fac) et je dois coder un Mastermind, grosso modo...
Voilà quelques jours que j'avance à taton, decouvrant les bugs de mon code anarchique et les resolvants.  
Mais voilà, là, est le bug de trop...  
 
Pour faire simple, c'est comme si l'ordinateur sautait une ligne de code.  
Je vais vous épargner mon code entier et le mettre en spoiler:
 
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. //Fonctions Utiles-----------------------------------------------------------------------------------------------------
  5. void CopieTableau(int n,int T_ctrlC[n],int T_ctrlV[n]){
  6.     for(int i=0; i<n; i++){
  7.         T_ctrlV[i]=T_ctrlC[i];
  8.     }
  9. }
  10. void EchangeurRand(int t_a_interchanger[4],int* change1, int* change2){
  11.     int a=rand()%4;
  12.     printf("\ncode 7 echange 2/2\n" );
  13.     int b=a;
  14.     while(b==a){b=rand()%4;}
  15.     int aux;
  16.     aux=t_a_interchanger[a];
  17.     t_a_interchanger[a]=t_a_interchanger[b];
  18.     t_a_interchanger[b]=aux;
  19.     *change1=a;
  20.     *change2=b;
  21. }
  22. void Shuffle(int n, int tshuffle[n]){ // Inspire de Knuth
  23.   int aux; int r;
  24.     srand(time(NULL));
  25.     for (int i=n-1; i>=0; --i) { // Change chaque case avec une autre ou elle meme aleatoirement.
  26.        r=rand()%(i+1);
  27.        aux=tshuffle[r];
  28.        tshuffle[r]=tshuffle[i];
  29.        tshuffle[i]=aux;
  30.     }
  31. }
  32. void GenTab(int T_a_generer[4]){
  33.     srand(rand());
  34.     for(int i=0; i<4; i++){
  35.         T_a_generer[i]=rand()%6;
  36.     }
  37. }
  38. void ImpTab(int n, int TImp[n]){
  39.   for(int i=0; i<n ;i++){
  40.     printf("%d\t", TImp[i]);
  41.   }
  42.   printf("\n" );
  43. }
  44. void ImpMat(int n, int m, int MatImp[n][m]){
  45.   for(int M=0; M<m; M++){
  46.     for(int N=0; N<n; N++){
  47.       printf("%d\t", MatImp[N][M]);
  48.     }
  49.   printf("\n" );
  50.   }
  51. }
  52. void EchangeurPrecis(int a, int b, int t[4]){
  53.     int tab[4]={0,1,2,3};
  54.     int bon1=-1;
  55.     int bon2=-1;
  56.     int aux;
  57.     int attente;
  58.     for(int i=0; i<4;i++){
  59.         if(i!=a){
  60.             if(i!=b){bon1=i;}
  61.         }
  62.     }
  63.     for(int j=0; j<4;j++){
  64.         if(j!=a){
  65.             if(j!=b){
  66.                 if(j!=bon1){bon2=j;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     aux=t[bon1];
  72.     t[bon1]=t[bon2];
  73.     t[bon2]=aux;
  74. }
  75. void EchangeurPrecis2(int a, int b, int tablo[4]){
  76.     int tab[4]={0,1,2,3};
  77.     int bon1=a;
  78.     int bon2=-1;
  79.     int aux;
  80.     int attente;
  81.     for(int j=0; j<4;j++){
  82.         if(j!=a){
  83.             if(j!=b){
  84.                 if(j!=bon1){bon2=j;
  85.                 }
  86.             }
  87.         }
  88.     }
  89.     aux=tablo[bon1];
  90.     tablo[bon1]=tablo[bon2];
  91.     tablo[bon2]=aux;
  92. }
  93. void TesteurDeFonction(){
  94.   int tTesteur[4];
  95.   int mTesteur[4][10];
  96.   int shuffleTesteur[4];
  97.   for(int a=0; a<4; a++){
  98.     tTesteur[a]=0;
  99.     shuffleTesteur[a]=a;
  100.   }/*
  101.   for(int M=0; M<10; M++){
  102.     for(int N=0; N<4; N++){
  103.       mTesteur[N][M]=M*4+N;
  104.     }
  105.   }
  106.   printf("\n0 0 0 0 \n0 1 2 3 \n" );
  107.   ImpTab(4,tTesteur);
  108.   printf("\n\n" );
  109.   ImpMat(4,10,mTesteur);
  110.   printf("\n\n" );
  111.   Shuffle(4,shuffleTesteur);
  112.   ImpTab(4,shuffleTesteur);*/
  113.   ImpTab(4,shuffleTesteur);
  114.   EchangeurPrecis(0,2,shuffleTesteur);
  115.   ImpTab(4,shuffleTesteur);
  116. }
  117. //Fonctions Ordinateur Seul-----------------------------------------------------------------------------------------
  118. void OrdinateurSeul(int Debug){
  119. if(Debug==1){}
  120. }
  121. //Foncions Utilisateur Cherche-----------------------------------------------------------------------------------------
  122. void Compare(int tour, int Tvrai[4], int Ttest[4]){
  123. }
  124. void JoueurCherche(int Debug){
  125. }
  126. //Fonctions Ordinateur Cherche--------------------------------------------------------------------------------------------
  127. void part_un(int tour,int Pions_biens_ou_mals_places[10][2],int Liste_tableaux[4][6],int Tdone_un[4][10],int Ttransition_un[4],int* Part_un_ou_deux,int* WIN){
  128.     // attente;
  129.     int TableauActuel[4];
  130.     int Pions_biens_places;
  131.     int Pions_mals_places;
  132.     int Pions_tot;
  133.     int Mem[4]={-1,-1,-1,-1};
  134.     for(int i=0; i<4; i++){
  135.         TableauActuel[i]=Liste_tableaux[i][tour];
  136.     }
  137.     Shuffle(4,TableauActuel);
  138.     ImpTab(4,TableauActuel);
  139.     for(int Tdone_un_n=0; Tdone_un_n<4; Tdone_un_n++){
  140.         Tdone_un[Tdone_un_n][tour]=TableauActuel[Tdone_un_n];
  141.     }
  142.     printf("TOUR%d, Combien de pions sont bien places ?\n", tour+1);
  143.     scanf("%d",&Pions_biens_places);
  144.     Pions_biens_ou_mals_places[tour][0]=Pions_biens_places;
  145.     printf("\nTOUR%d Combien de pions sont justes mais mals places ?\n", tour+1);
  146.     scanf("%d",&Pions_mals_places);
  147.     Pions_biens_ou_mals_places[tour][1]=Pions_mals_places;
  148.     Pions_tot=Pions_biens_places+Pions_mals_places;
  149.     for(int save=0;save<Pions_tot;save++){
  150.         Mem[save]=Liste_tableaux[save][tour];
  151.     }
  152.     for(int replace_m=tour+1; replace_m<6; replace_m++){
  153.         for(int replace_n=0; replace_n<Pions_tot; replace_n++){
  154.             Liste_tableaux[replace_n][replace_m]=Mem[replace_n];
  155.         }
  156.     }
  157.    if(Pions_biens_places==4){*WIN=1; return;
  158.    }
  159.    if(Pions_tot==4){
  160.     *Part_un_ou_deux=1;
  161.     for (int copy1=0; copy1<4; copy1++){
  162.         Ttransition_un[copy1]=TableauActuel[copy1];
  163.     }
  164.     return;
  165.    }
  166. }
  167. int Check( int tour,int TCheckDone[4][10], int TCheckTest[4]){
  168.     int pass=0;
  169.     int attente;
  170.     for(int i=0;i<tour; i++){
  171.             pass=0;
  172.         for(int j=0; j<4; j++){
  173.             if(TCheckTest[j]==TCheckDone[j][i]){pass++;
  174.             }
  175.         }
  176.          if(pass==4){printf("\ncode 5 proposition refusee\n" );
  177.          return 1;
  178.          }
  179.     }
  180.      for(int k=0; k<4; k++){
  181.         TCheckDone[k][tour]=TCheckTest[k];
  182.      }
  183.      printf("\ncode 8 proposition acceptee\n" );
  184.      return 0;
  185. }
  186. void Remplissage(int Tordre[6], int Tordre_rempli[4][6]){
  187.     for(int i=0; i<6; i++){
  188.         Tordre_rempli[0][i]=Tordre[i];
  189.         Tordre_rempli[1][i]=Tordre[i];
  190.         Tordre_rempli[2][i]=Tordre[i];
  191.         Tordre_rempli[3][i]=Tordre[i];
  192.     }
  193. }
  194. void part_deux(int tour,int pions_part_deux[10][2],int Ttransition_deux[4],int Tdone_deux[4][10],int * WIN, int Debug, int *tourr){
  195.     int pions_biens_places_part_deux=-1;
  196.     int pions_mals_places_part_deux;
  197.     int done=0;
  198.     int t_propose_part_deux[4];
  199.     int sauvegarde[4];
  200.     int sauvegarde2[4];
  201.     int pion_echange_un;
  202.     int pion_echange_deux;
  203.     CopieTableau(4,Ttransition_deux,t_propose_part_deux);
  204.     if( tour < 10&&*WIN !=1){
  205.         if(Debug==1){
  206.             printf("Au debut du while, au tour%d, les tableaux sont :\n\n t_propose_part_deux:\n", tour);
  207.             ImpTab(4,t_propose_part_deux);
  208.             printf("\n" );
  209.         }
  210.         if(pions_part_deux[tour-1][0]==0||pions_part_deux[tour-1][0]==1){
  211.                 done=0;
  212.             printf("\n code 1\n" );
  213.             while(done==0){
  214.             Shuffle(4,t_propose_part_deux);
  215.             printf("\ncode 3 shuffle\n" );
  216.                 if(Check(tour, Tdone_deux,t_propose_part_deux)==0){
  217.                     ImpTab(4,t_propose_part_deux);
  218.                     printf("TOUR%d, Combien de pions sont bien places ?\n", tour+1);
  219.                     scanf("%d",&pions_biens_places_part_deux);
  220.                     pions_part_deux[tour][0]=pions_biens_places_part_deux;
  221.                     printf("\nTOUR%d Combien de pions sont justes mais mals places ?\n", tour+1);
  222.                     scanf("%d",&pions_mals_places_part_deux);
  223.                     pions_part_deux[tour][1]=pions_mals_places_part_deux;
  224.                     CopieTableau(4,t_propose_part_deux,sauvegarde2);
  225.                     done=1;
  226.                 }
  227.             }
  228.         }
  229.         if(pions_part_deux[tour-1][0]==2){
  230.             done=0;
  231.             printf("\ncode 2\n" );
  232.             CopieTableau(4,sauvegarde2,t_propose_part_deux);
  233.             CopieTableau(4,t_propose_part_deux,sauvegarde);
  234.             while(Check(tour, Tdone_deux,t_propose_part_deux)==1){
  235.                 printf("code 6 echange2/2" );
  236.                 printf("\nsauvegarde\n" );
  237.                 ImpTab(4,sauvegarde);
  238.                 printf("\n" );
  239.                 CopieTableau(4,sauvegarde,t_propose_part_deux);
  240.                 printf("\n" );
  241.                 ImpTab(4,t_propose_part_deux);
  242.                 printf("\n ECHANGE" );
  243.                 EchangeurRand(t_propose_part_deux,&pion_echange_un,&pion_echange_deux);
  244.                 printf("\n" );
  245.                 ImpTab(4,t_propose_part_deux);
  246.                 printf("\n" );
  247.             }
  248.             ImpTab(4,t_propose_part_deux);
  249.             printf("TOUR%d, Combien de pions sont bien places ?\n", tour+1);
  250.             scanf("%d",&pions_biens_places_part_deux);
  251.             pions_part_deux[tour][0]=pions_biens_places_part_deux;
  252.             printf("\nTOUR%d Combien de pions sont justes mais mals places ?\n", tour+1);
  253.             scanf("%d",&pions_mals_places_part_deux);
  254.             pions_part_deux[tour][1]=pions_mals_places_part_deux;
  255.             tour++;
  256.             if((pions_biens_places_part_deux==0)&&tour!=10){
  257.                 CopieTableau(4,sauvegarde,t_propose_part_deux);
  258.                 EchangeurPrecis(pion_echange_un,pion_echange_deux,t_propose_part_deux);
  259.                 ImpTab(4,t_propose_part_deux);
  260.                 printf("ceci ne peut être que la bonne reponse... C'est MATHEMATIQUE!\n\n" );
  261.                 *WIN=1;
  262.                 tour=11;
  263.             }
  264.              if((pions_biens_places_part_deux==1)&&tour!=10){
  265.                     printf("\ncode 11\n" );
  266.                 CopieTableau(4,sauvegarde,t_propose_part_deux);
  267.                 EchangeurPrecis2(pion_echange_un,pion_echange_deux,t_propose_part_deux);
  268.                 ImpTab(4,t_propose_part_deux);
  269.                 printf("TOUR%d, Combien de pions sont bien places ?\n", tour+1);
  270.                 scanf("%d",&pions_biens_places_part_deux);
  271.                 pions_part_deux[tour][0]=pions_biens_places_part_deux;
  272.                 printf("\nTOUR%d Combien de pions sont justes mais mals places ?\n", tour+1);
  273.                 scanf("%d",&pions_mals_places_part_deux);
  274.                 pions_part_deux[tour][1]=pions_mals_places_part_deux;
  275.                 tour++;
  276.                 if((pions_biens_places_part_deux==4)&&tour!=10){
  277.                     printf("\ncode 9\n" );
  278.                     *WIN=1;
  279.                     return;
  280.                 }
  281.                 if((pions_biens_places_part_deux==1)&&tour!=10){
  282.                         printf("code 12" );
  283.                         EchangeurPrecis(pion_echange_un,pion_echange_deux,t_propose_part_deux);
  284.                         EchangeurPrecis(pion_echange_un,pion_echange_deux,t_propose_part_deux);
  285.                         printf("La solution ne peut etre que : " );
  286.                         ImpTab(4,t_propose_part_deux);
  287.                         *WIN=1;
  288.                         return;
  289.                 }
  290.             }
  291.         }
  292.         if(pions_biens_places_part_deux==4){
  293.             *WIN=1;
  294.             tour=11;
  295.         }
  296.     }
  297.     else{*tourr=tour-1;}
  298. }
  299. void OrdinateurCherche(int Debug){
  300.     int attente;
  301.     int det=0;
  302.     int Tdone[4][10];
  303.     for (int Tdone_m=0; Tdone_m<10; Tdone_m++){ //All Tdone=-1
  304.         for (int Tdone_n=0; Tdone_n<4; Tdone_n++){
  305.             Tdone[Tdone_n][Tdone_m]=-1;
  306.         }
  307.     }
  308.     int pions[10][2];
  309.     for(int pion_m=0; pion_m<2; pion_m++){// remplis les pions.
  310.         for(int pion_n=0; pion_n<10; pion_n++){
  311.             pions[pion_n][pion_m]=-1;
  312.         }
  313.     }
  314.     if(Debug==1){
  315.                 printf("Le tableau des pions est:\n" );
  316.                 ImpMat(10,2,pions);
  317.                 printf("\n" );
  318.                 scanf("%d",&attente);
  319.             }
  320.     int Ttransition[4];
  321.     int Tableaux_demandes_part_un[4][6];
  322.     if(Debug==1){// Demande de la bonne solution
  323.       int Tsolution[4];
  324.       int sol_debug;
  325.       printf("Quelle est votre combinaison?" );
  326.       for(int i_debug=0 ; i_debug<4; i_debug++){
  327.         scanf("%d", &sol_debug);
  328.         Tsolution[i_debug]=sol_debug;
  329.       }
  330.     }
  331.     int WIN=0;
  332.     int part_un_ou_deux=0;
  333.     int Ordre_de_demande_part_un[6]={0,1,2,3,4,5};
  334.     Shuffle(6, Ordre_de_demande_part_un);
  335.     if(Debug==1){
  336.         ImpTab(6,Ordre_de_demande_part_un);
  337.         scanf("%d",&attente);
  338.     }
  339.     Remplissage(Ordre_de_demande_part_un,Tableaux_demandes_part_un);
  340.     if(Debug==1){
  341.         ImpMat(4,6,Tableaux_demandes_part_un);
  342.         scanf("%d",&attente);
  343.     }
  344.     for(int tour=0; tour<10; tour++){
  345.         if(part_un_ou_deux==0){
  346.             part_un(tour,pions,Tableaux_demandes_part_un,Tdone,Ttransition,&part_un_ou_deux,&WIN);
  347.             if(Debug==1){
  348.                 printf("Le tableau des pions est:\n" );
  349.                 ImpMat(10,2,pions);
  350.                 printf("\n" );
  351.                 scanf("%d",&attente);
  352.             }
  353.             if(WIN==1){
  354.                 printf("J'ai gagne ! code=1" );
  355.                 scanf("%,d",&attente);
  356.                 tour=11;
  357.             }
  358.             if(Debug==1){ // Affiche letat des tableaux precedents
  359.                 printf("Les tableaux allant etre demande au tour %d sont:\n", tour+1) ;
  360.                 ImpMat(4,6,Tableaux_demandes_part_un);
  361.                 printf("Les tableaux ayant deja ete demandes au tour %d sont: \n", tour+1);
  362.                 ImpMat(4,10,Tdone);
  363.                 scanf("%d",&attente);
  364.             }
  365.         }
  366.         if(part_un_ou_deux==1&&det==0){tour++;det=1;}
  367.         if(part_un_ou_deux==1){
  368.             part_deux(tour,pions,Ttransition,Tdone,&WIN,Debug,&tour);
  369.             if(Debug==1){
  370.                     printf("Le tableau des pions est:\n" );
  371.                     ImpMat(10,2,pions);
  372.                     printf("\n" );
  373.             }
  374.             if(WIN==1){
  375.                 printf("J'ai gagne !code=2" );
  376.                 scanf("%,d",&attente);
  377.                 tour=11;
  378.             }
  379.              if(Debug==1){ // Affiche letat des tableaux precedents
  380.                 printf("Les tableaux ayant deja ete demandes au tour %d sont: \n", tour);
  381.                 ImpMat(4,10,Tdone);
  382.                 scanf("%d",&attente);
  383.              }
  384.         }
  385.     }
  386. }
  387. //Main-----------------------------------------------------------------------------------------------------------------
  388. int main(){
  389.   int ChoixJeu;
  390.   printf("\t\t--------------------------------------------------------\n" );
  391.   printf("\t\t********** Bonjour, bienvenu(e) au mastermind **********\n" );
  392.   printf("\t\t--------------------------------------------------------\n" );
  393.   printf("\t\tVoulez vous :\n" );
  394.   printf("\t\t(1) Faire faire decouvrir une combinaison a l'ordinateur\n" );
  395.   printf("\t\t(2) Decouvrir une combinaison secrete\n" );
  396.   printf("\t\t(3) Voir l ordinateur jouer contre lui meme \n\n" );
  397.   printf("\t\t(4) Testeur de Fonctions\n" );
  398.   printf("\t\tVeuillez entrer le numero correspondant.\n" );
  399.   printf("\t\tEntrez 10/20/30 a la place de 1/2/3 pour lancer le \n\t\tprogramme en mode debug\n\n" );
  400.   scanf("%d",&ChoixJeu);
  401.   switch (ChoixJeu){
  402.     case 1:
  403.       printf("\nAttention ! Cette partie ne detecte pas les erreurs de l'utilisateur, et dijoncte completement si une seule entree est fausse.\n\n" );
  404.       OrdinateurCherche(0);
  405.       break;
  406.     case 2:
  407.       JoueurCherche(0);
  408.       break;
  409.     case 3:
  410.       OrdinateurSeul(0);
  411.       break;
  412.     case 10:
  413.       OrdinateurCherche(1);
  414.       break;
  415.     case 20:
  416.       JoueurCherche(1);
  417.       break;
  418.     case 30:
  419.       OrdinateurCherche(1);
  420.       break;
  421.     case 4: TesteurDeFonction();
  422.       break;
  423.     default:
  424.       printf("Mauvaise entree, veuillez relancer le programme." );
  425.       break;
  426.    }
  427.   return 0;
  428. }


 
 
 
Et vous mettre ici la capture d'écran qui symbolise tout: (NB, le "code 1" symbolise que le programme est dans une autre branche du systeme.  
 
[img]https://www.noelshack.com/2018-15-7-1523814500-help.png
[/img]
 
Merci à tous pour votre aide !!
 
PS, après aperçu, il semblerait que mes balises spoiler et image ne marchent pas .. Désolé !


Message édité par ajost le 15-04-2018 à 22:32:57
Reply

Marsh Posté le 15-04-2018 à 19:51:21   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed