#header => #ifndef NIANIANIA #define NIANIANIA typedef struct Valeur Valeur; struct Valeur { int tab[32]; unsigned int valeur; char descriptif[6]; int numero; int passe; }; Valeur init (Valeur A); int integrity (Valeur A); Valeur reorganize (Valeur A, int state, int amplitude); Valeur valeur_carte ( int i, Valeur A ); void error (int a); int Bataille_1erepasse ( Valeur A ); int TirerCarte (Valeur A, int joueur); Valeur Bataille_autrepasses (Valeur A ); Valeur Bataille_infinie (Valeur Carte0, Valeur Carte1, Valeur A); Valeur TestPlusDeCarte (Valeur A); int Winner ( Valeur A, int gagnant ); Valeur Bataille_egalite (Valeur A); #endif ## #include #include #include "headers.h" #include int main () { int a; Valeur monJeu; Valeur A; A = init(monJeu); for (a=0;a<32;a++) { printf("%i. %i\n", a, A.tab[a]); } system("Pause"); Bataille_1erepasse(A); printf("on est ici"); return 0; } //void menu() { //} Valeur init(Valeur A) { int k; Valeur B; int integrite; for (k = 0; k < 32 ; k++ ) { A.tab[k] = ( rand() % 2) ; } integrite = integrity(A); if (integrite == 0) { return A; } else { if (integrite > 0) { B = reorganize(A,1,integrite); } else { B = reorganize(A,0,integrite); } } integrite = integrity(B); if (integrite == 0) { return B; } else { error(2); } } int integrity (Valeur A) { int i; unsigned int var1 = 0 ; unsigned int var2 = 0 ; for ( i = 0; i < 32; i++ ) { if (A.tab[i] == 1 ) { var2++; } else if (A.tab[i] == 0) { var1++; } } if ( (var2 || var1) > 16 ) { return var2-var1; } else { return 0; } } Valeur reorganize (Valeur A, int state, int amplitude) { int a; srand(time(NULL)); switch(state) { case 0: do { a = (rand() % 32); if (A.tab[a] == 0) { A.tab[a] = 1; amplitude++; } } while ( amplitude != 0 ); return A; break; case 1: do { a = (rand() % 32); if (A.tab[a] == 1) { A.tab[a] = 0; amplitude--; } } while ( amplitude != 0 ); return A; break; default: error(1); break; } } Valeur valeur_carte ( int i, Valeur A ){ A.numero = i; switch(i) { case 0:; case 1:; case 2:; case 3: A.valeur = 13; sprintf(A.descriptif , "Roi"); return A; case 4:; case 5:; case 6:; case 7: A.valeur = 12; sprintf(A.descriptif, "Dame"); return A; case 8:; case 9:; case 10:; case 11: A.valeur = 11; sprintf(A.descriptif,"Valet"); return A; case 12:; case 13:; case 14:; case 15: A.valeur = 10; sprintf(A.descriptif , "Dix"); return A; case 16:; case 17:; case 18:; case 19: A.valeur = 9; sprintf(A.descriptif, "Neuf"); return A; case 20:; case 21:; case 22:; case 23: A.valeur = 8; sprintf(A.descriptif,"Huit"); return A; case 24:; case 25:; case 26:; case 27: A.valeur = 7; sprintf(A.descriptif, "Sept"); return A; case 28:; case 29:; case 30:; case 31: A.valeur = 1; sprintf(A.descriptif ,"As"); return A; default: error(3); } } /*A.Roi.Trefle = tab[0]; A.Roi.Carreau = tab[1]; A.Roi.Coeur = tab[2]; A.Roi.Pique = tab[3]; A.Dame.Trefle = tab[4]; A.Dame.Carreau = tab[5]; A.Dame.Coeur = tab[6]; A.Dame.Pique = tab[7]; A.Valet.Trefle = tab[8]; A.Valet.Carreau = tab[9]; A.Valet.Coeur = tab[10]; A.Valet.Pique = tab[11]; A.Dix.Trefle = tab[12]; A.Dix.Carreau = tab[13]; A.Dix.Coeur = tab[14]; A.Dix.Pique = tab[15]; A.Neuf.Trefle = tab[16]; A.Neuf.Carreau = tab[17]; A.Neuf.Coeur = tab[18]; A.Neuf.Pique = tab[19]; A.Huit.Trefle = tab[20]; A.Huit.Carreau = tab[21]; A.Huit.Coeur = tab[22]; A.Huit.Pique = tab[23]; A.Sept.Trefle = tab[24]; A.Sept.Carreau = tab[25]; A.Sept.Coeur = tab[26]; A.Sept.Pique = tab[27]; A.As.Trefle = tab[28]; A.As.Carreau = tab[29]; A.As.Coeur = tab[30]; A.As.Pique = tab[31]; */ void error (int a) { switch(a) { case 1: fprintf(stderr, "La fonction reorganize à rencontré une erreur innatendue, le programme va fermer.\n"); exit(1); case 2: fprintf(stderr, "Erreur dans la distribution aléatoire des cartes, le programme va fermer.\n"); exit(2); default: exit(0); } } int Bataille_1erepasse ( Valeur A ) { Valeur CarteA; Valeur CarteB; CarteA = valeur_carte(TirerCarte(A,0),A); CarteB = valeur_carte(TirerCarte(A,1),A); A.passe = 2; printf("Bataille_1erepasse"); if (CarteA.valeur > CarteB.valeur) { //Joueur 0 Gagne => Les Deux cartes sont mises en fin de paquet de joueur 0 A.tab[CarteA.numero] = A.passe; A.tab[CarteB.numero] = A.passe+2; A = Bataille_autrepasses (A); } else if ( CarteA.valeur < CarteB.valeur) { //Joueur 1 Gagne => Les Deux cartes sont mises en fin de paquet de joueur 1 A.tab[CarteA.numero] = A.passe + 1; A.tab[CarteB.numero] = A.passe + 3; A = Bataille_autrepasses (A); } else { //Bataille => Tirage jusqu'à épuisement des paquets jusqu'à qu'un joueur gagne A = Bataille_infinie(CarteA,CarteB,A); } } Valeur Bataille_autrepasses (Valeur A) { Valeur CarteA; Valeur CarteB; Valeur B; int i,j; A.passe +=4; CarteA = valeur_carte(TirerCarte(A,0),A); CarteB = valeur_carte(TirerCarte(A,1),A); printf("\n Bataille_autrepasses\n"); if (CarteA.valeur > CarteB.valeur) { //Joueur 0 Gagne => Les Deux cartes sont mises en fin de paquet de joueur 0 A.tab[CarteA.numero] = A.passe; A.tab[CarteB.numero] = A.passe+2; A = TestPlusDeCarte(A); A = Bataille_autrepasses(A); } else if ( CarteA.valeur < CarteB.valeur) { //Joueur 1 Gagne => Les Deux cartes sont mises en fin de paquet de joueur 1 A.tab[CarteA.numero] = A.passe + 1; A.tab[CarteB.numero] = A.passe + 3; A = TestPlusDeCarte(A); A = Bataille_autrepasses(A); } else { //Bataille => Tirage jusqu'à épuisement des paquets jusqu'à qu'un joueur gagne A = TestPlusDeCarte(A); A = Bataille_infinie(CarteA,CarteB,A); } } Valeur Bataille_infinie (Valeur CarteA, Valeur CarteB, Valeur A) { Valeur Cartex; Valeur Cartey; int k=0; int i; printf("Bataille_infinie"); do { A.tab[CarteA.numero] = -1; A.tab[CarteB.numero] = -1; Cartex = valeur_carte(TirerCarte(A,0),A); Cartey = valeur_carte(TirerCarte(A,1),A); if (Cartex.valeur == Cartey.valeur) { A.tab[Cartex.numero] = -1; A.tab[Cartey.numero] = -1; } else if (Cartex.valeur > Cartey.valeur) { for (i=0;i<32;i++) { if (A.tab[i] == -1) { A.tab[i] = A.passe + k; k++; k++; } } } else { for (i=0;i<32;i++) { if (A.tab[i] == -1) { A.tab[i] = A.passe + 1 + k; k++; k++; } } } } while ( Cartex.valeur == Cartey.valeur ); system("Pause"); for (i=0;i<32;i++) { if (A.tab[i] < 0) { printf("Inf à 0\n"); } } A = TestPlusDeCarte(A); A = Bataille_autrepasses(A); } Valeur TestPlusDeCarte (Valeur A) { int a,b,c; int encoredescartes0 = 0; int encoredescartes1 = 0; int gagnant = 0; if (A.passe == 500) { printf("Partie infinie\n"); system("Pause"); exit(0); } for (c=0;c<32;c++) { if ( A.tab[c] % 2 == 0 ) { gagnant++; } else gagnant--; } if ( gagnant == 32 ) { printf("Joueur 1 gagne"); system("Pause"); exit(0); } if ( gagnant == -32 ) { printf("Joueur 2 gagne"); system("Pause"); exit(0); } for (a=0;a<32;a++) { if (A.tab[a] == 0) { encoredescartes0++; } if (A.tab[a] == 1) { encoredescartes1++; } } printf("Cartes 0 : %i; Cartes 1 : %i", encoredescartes0, encoredescartes1); while ( encoredescartes0 == 0 ) { for (b=0;b<32;b++) { for (a=0;a<32;a++) { if (A.tab[a] == 0) { encoredescartes0++; } } printf("// %i. %i //",b,A.tab[b]); if (A.tab[b] % 2 == 0) { if (A.tab[b] > 1 ) { A.tab[b] -= 2; } } } } while ( encoredescartes1 == 0 ) { for (b=0;b<32;b++) { for (a=0;a<32;a++) { if (A.tab[a] == 1) { encoredescartes1++; } } printf("// %i. %i // ",b,A.tab[b]); if (A.tab[b] % 2 == 1 ) { if (A.tab[b] > 2) { A.tab[b] -= 2; } } } } return A; } int TirerCarte (Valeur A, int joueur) { int a; int ok = 0; A = TestPlusDeCarte(A); srand(time(NULL)); printf("TirerCarte\n"); switch(joueur) { case 0: do { a = (rand() % 32); if (A.tab[a] == 0) { ok = 1; return a; } } while ( ok != 1 ); break; case 1: do { a = (rand() % 32); if (A.tab[a] == 1) { ok = 1; return a; } } while ( ok != 1 ); break; default: error(4); break; } } int Winner ( Valeur A, int gagnant ) { if ( gagnant == 31 ) { printf("Joueur 1 gagne"); } else { printf("Joueur 2 gagne"); } }