logo de la licence professionnellelogo d'aix marseille université

IP4 : Réseaux

#include <stdio.h>
#include <stdlib.h>

#define nbCol 6
#define nbLg 5
#define nbPionsAAligner 3
#define couleurJ1 1
#define couleurJ2 2
#define caseVide 0

int plateau[nbLg][nbCol];
int joueurCourant;

int aleat(int min,int max)
{
return rand()%(max-min+1)+min;
}

void affichePlateau(int p[nbLg][nbCol])
{
int l,c;
l=0;
while (l<nbLg)
{
c=0;
while (c<nbCol)
{
printf("%d ",p[l][c]);
c=c+1;
}
printf("n");
l=l+1;
}

}

int choixColonne(int p[nbLg][nbCol])
{
int c;
do {
printf("choisir une colonne entre %d et %d:",0,nbCol-1);
scanf("%d",&c);
printf("%d (%d)n",c,(c>=nbCol || p[0][c]!=0));

}while ((c>=nbCol || c<0 || p[0][c]!=caseVide));

return c;
}

 

int negamax(int joueur, int p[nbLg][nbCol],int profondeur,int profondeurInit )
{
int eval=-99999999;
int l;
int e;
int colCourante,colAjouer;
if (profondeur==0)
{
//printf("score = 1000n");
return 0;
}
colCourante=0;
while (colCourante<nbCol)
{
if (p[0][colCourante]==caseVide)
{
l=positionnerPion(joueur,colCourante,p);
//printf("joueur %d joue colonne %d profondeur %dn",joueur,colCourante,profondeur);
if (testSiGagne(l,colCourante,p))
{
//printf("le joueur %d gagnen",joueur);
eval=1;
colAjouer=colCourante;
}
else
{
e=-negamax(3-joueur,p,profondeur-1,profondeurInit);
if (e > eval) {eval = e;colAjouer=colCourante;
//printf("meilleur coup trouvé %dn",colCourante);
}
}
//on enleve le coup
p[l][colCourante]=caseVide;
}
colCourante++;
}
if (profondeur!=profondeurInit)
{
//printf("score = %dn",eval);
return eval;
}
else
{
printf("max remonté %dn",eval);
return colAjouer;
}
}

int choixColonneOrdi(int p[nbLg][nbCol])
{
int c;
do {
c=aleat(0,nbCol-1);
}while (p[0][c]!=caseVide);

return c;
}


int choixColonneOrdi2(int p[nbLg][nbCol])
{
int c;
c=negamax(1, p,12,12);
printf("choix de l'ordi : %dn",c);
return c;
}

int positionnerPion(int jc,int c ,int p[nbLg][nbCol])
{
int l=0;
while (l<nbLg && p[l][c]==caseVide)
l=l+1;

p[l-1][c]=jc;

return (l-1);
}

int testSiGagne(int l,int c,int p[nbLg][nbCol])
{
int pJoueur=p[l][c];
int i,j;
int nbPions=1;
//<-
j=c-1;
while (j>=0 && p[l][j]==pJoueur)
{
nbPions++;
j--;
}
//->
j=c+1;
while (j<nbCol && p[l][j]==pJoueur)
{
nbPions++;
j++;
}
if (nbPions>=nbPionsAAligner) return 1;


// test vertical
nbPions=1;
i=l+1;
while (l<nbLg && p[i][c]==pJoueur)
{
nbPions++;
i++;
}
if (nbPions>=nbPionsAAligner) return 1;

//test sur première diagonale
nbPions=1;
i=l+1;
j=c-1;
while (i<nbLg && j>=0 && p[i][j]==pJoueur)
{
nbPions++;
i++;
j--;
}

i=l-1;
j=c+1;
while (j<nbCol && i>=0 && p[i][j]==pJoueur)
{
nbPions++;
i--;j++;
}

if (nbPions>=nbPionsAAligner) return 1;


//test sur deuxième diagonale
nbPions=1;
i=l+1;
j=c+1;
while (i<nbLg && j<nbCol && p[i][j]==pJoueur)
{
nbPions++;
i++;
j++;
}

i=l-1;
j=c-1;
while (j>=0 && i>=0 && p[i][j]==pJoueur)
{
nbPions++;
i--;j--;
}

if (nbPions>=nbPionsAAligner) return 1;

return 0;
}

void initialisePlateau(int p[nbLg][nbCol])
{
int l=0,c=0;
while (l<nbLg)
{
c=0;
while (c<nbCol)
{
p[l][c]=caseVide;
c=c+1;
}
l=l+1;
}
puts("fin init");
}

int plateauRempli(int p[nbLg][nbCol])
{
int c=0;
while (c<nbCol && p[0][c]!=0)
c=c+1;
if (c<nbCol)
return 0;
else
return 1;
}

int main()
{
int jCourantGagne=0;
int c,l;
initialisePlateau(plateau);
joueurCourant=1;aleat(1,2);
while(!plateauRempli(plateau)&&!jCourantGagne)
{
affichePlateau(plateau);

if (joueurCourant==1)
c=choixColonneOrdi2(plateau);
else
c=choixColonne(plateau);

l=positionnerPion(joueurCourant,c,plateau);
jCourantGagne=testSiGagne(l,c,plateau);
joueurCourant=3-joueurCourant;
}

affichePlateau(plateau);
if(plateauRempli(plateau))
puts("match Nul");
else
printf("le joueur %d gagnen",3-joueurCourant);
return 0;
}

Valid XHTML 1.0 Transitional SIL - NTI copyright 2012