adil aeh
Messages postés1Date d'inscriptionmercredi 23 août 2006StatutMembreDernière intervention23 août 2006
-
23 août 2006 à 15:47
Clement -
27 mars 2007 à 19:03
Bonjour tout le monde,
J'ai un projet à réaliser en java, en fait c'est le célébre jeu d'awalé. J'ai commencé par comprendre les algorithmes de recherche et surtout l'algorithme (ALPHA BETA) qui est meilleur que celui du MINMAX. J'ai réaliser ma premiere version du jeu en C seulement pour tester mon algorithme et ça marche trés bien. Mais quand j'ai essayer de le faire en OO en java ça ne marche plus.Vraiment je ne comprends pas parce que c'est le même algorithme. Voila la version en langage C :
void jouer(awale *a,int choix)
{ int somme_adversaire=0,i,nb,c,j=0;
if(a->moi[choix]==0) { //printf("\nil faut jouer une case non vide");
return;
}
// il faut tester si l'adversaire n'a pas de graines
for(i=0;i<6;i++) somme_adversaire+=a->cpu[i];
nb = a->moi[choix];
if(somme_adversaire==0)
{
// tester est ce que la case choisie nourrit l'adversaire
if((choix+nb)<6) {
// printf("\n Il faut nourrire l'adversaire");
return;
}
}
a->moi[choix]=0;
i=1;
int dernier = -1;
int position = -1;
int depart;
while(i<=nb)
{
if(i%12!=0)
{
c = choix+i;
int borne1=0,borne2=5;
depart=0;
for(int k=0;k<4;k++)
{
if( c>=borne1 && c<=borne2 && (i!=depart)) {
a->moi[c-depart]++;
dernier = 0;
}
if( c>=(borne1+6) && c<=(borne2+6)) {
a->cpu[c-(depart+6)]++;
dernier = 1;
position = c-(depart+6);
// printf("\n position = %d",position);
}
depart+=12;
borne1+=12;
borne2+=12;
}
i++;
}
else { nb++;
i++;
} //sauter la case du départ
}
//printf("position = %d, cpu[position]=%d \n",position,a->moi[position]);
if(dernier==1) // dernier pion joué étais dans la zone de l'adversaire
{ //printf("position=%d\n",position);
while( (position>=0) && ((a->cpu[position]==2) || (a->cpu[position]==3)) )
{
a->score_moi += a->cpu[position];
a->cpu[position]=0;
position--;
}
}
}
void cpu_joue(awale *a,int choix)
{ int somme_adversaire=0,i,nb,c,j=0;
if(a->cpu[choix]==0) { //printf("\nil faut jouer une case non vide\n");
return;
}
// il faut tester si l'adversaire n'a pas de graines
for(i=0;i<6;i++) somme_adversaire+=a->moi[i];
nb = a->cpu[choix];
if(somme_adversaire==0)
{
// tester est ce que la case choisie nourrit l'adversaire
if((choix+nb)<6) {
printf("\n Il faut nourrire l'adversaire \n");
return;
}
}
a->cpu[choix]=0;
i=1;
int dernier = -1;
int position = -1;
int depart;
while(i<=nb)
{
if(i%12!=0)
{
c = choix+i;
int borne1=0,borne2=5;
depart=0;
for(int k=0;k<4;k++)
{
if( c>=borne1 && c<=borne2 && (i!=depart)) { a->cpu[c-depart]++;
dernier = 0;
}
if( c>=(borne1+6) && c<=(borne2+6)) {
a->moi[c-(depart+6)]++;
dernier = 1;
position = c-(depart+6);
// printf("\n position = %d",position);
}
depart+=12;
borne1+=12;
borne2+=12;
}
i++;
}
else { nb++;
i++ ;
} //sauter la case du départ
}
// printf("position = %d, moi[position]=%d \n",position,a->moi[position]);
// Pour extraire les gains.
if(dernier==1) // dernier pion joué étais dans la zone de l'adversaire
{
while( (position>=0) && ((a->moi[position]==2) || (a->moi[position]==3)) )
{ a->score_cpu += a->moi[position];
a->moi[position]=0;
position--;
}
}
}
int alphabeta(awale a,int alpha,int beta,int profondeur)
{ int i=0,x;
awale awa[6];
if(profondeur==0) return(a.score_cpu - a.score_moi);
*********************************************
*********************************************
*********************************************
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
et celui en Java :
import java.*;
import java.io.*;
class awale
{
int moi[],cpu[];
int score_cpu,score_moi;
static int case_retenu=5;
//*******************************************************************************************************
//*******************************************************************************************************
public awale()
{
moi = new int[6];
cpu = new int[6];
for(int i=0;i<6;i++) moi[i]=cpu[i]=4;
score_moi=score_cpu=0;
}
//*******************************************************************************************************
//*******************************************************************************************************
public void afficher()
{
System.out.println(cpu[5]+" "+cpu[4]+" "+cpu[3]+" "+cpu[2]+" "+cpu[1]+" "+cpu[0]+" score: "+score_cpu);
System.out.println(moi[0]+" "+moi[1]+" "+moi[2]+" "+moi[3]+" "+moi[4]+" "+moi[5]+" score: "+score_moi+"\n\n");
}
//*******************************************************************************************************
//*******************************************************************************************************
public int choisi()
{
return case_retenu;
}
public void modif(int x)
{
case_retenu = x;
}
//*******************************************************************************************************
//*******************************************************************************************************
void jouer(int choix)
{ int somme_adversaire=0,i,nb,c,j=0;
if(moi[choix]==0) {
return;
}
// il faut tester si l'adversaire n'a pas de graines
for(i=0;i<6;i++) somme_adversaire+=cpu[i];
nb = moi[choix];
if(somme_adversaire==0)
{
// tester est ce que la case choisie nourrit l'adversaire
if((choix+nb)<6) {
return;
}
}
moi[choix]=0;
i=1;
int dernier = -1;
int position = -1;
int depart;
while(i<=nb)
{
if(i%12!=0)
{
c = choix+i;
int borne1=0,borne2=5;
depart=0;
for(int k=0;k<4;k++)
{
if( c>=borne1 && c<=borne2 && (i!=depart)) {
moi[c-depart]++;
dernier = 0;
}
if( c>=(borne1+6) && c<=(borne2+6)) {
cpu[c-(depart+6)]++;
dernier = 1;
position = c-(depart+6);
}
depart+=12;
borne1+=12;
borne2+=12;
}
i++;
}
else { nb++;
i++;
} //sauter la case du départ
}
if(dernier==1) // dernier pion joué étais dans la zone de l'adversaire
{
while( (position>=0) && ((cpu[position]==2) || (cpu[position]==3)) )
{
score_moi += cpu[position];
cpu[position]=0;
position--;
}
}
void cpu_joue(int choix)
{ int somme_adversaire=0,i,nb,c,j=0;
if(cpu[choix]==0) {
return;
}
// il faut tester si l'adversaire n'a pas de graines
for(i=0;i<6;i++) somme_adversaire+=moi[i];
nb = cpu[choix];
if(somme_adversaire==0)
{
// tester est ce que la case choisie nourrit l'adversaire
if((choix+nb)<6) {
return;
}
}
cpu[choix]=0;
i=1;
int dernier = -1;
int position = -1;
int depart;
while(i<=nb)
{
if(i%12!=0)
{
c = choix+i;
int borne1=0,borne2=5;
depart=0;
for(int k=0;k<4;k++)
{
if( c>=borne1 && c<=borne2 && (i!=depart)) { cpu[c-depart]++;
dernier = 0;
}
if( c>=(borne1+6) && c<=(borne2+6)) {
moi[c-(depart+6)]++;
dernier = 1;
position = c-(depart+6);
}
depart+=12;
borne1+=12;
borne2+=12;
}
i++;
}
else { nb++;
i++ ;
} //sauter la case du départ
}
// Pour extraire les gains.
if(dernier==1) // dernier pion joué étais dans la zone de l'adversaire
{
while( (position>=0) && ((moi[position]==2) || (moi[position]==3)) )
{ score_cpu += moi[position];
moi[position]=0;
position--;
}
}
}
//*******************************************************************************************************
//*******************************************************************************************************
public int[] retourner_moi()
{
int[] tab = new int[6] ;
for(int i=0;i<6;i++) tab[i] = moi[i];
return tab;
}
public int[] retourner_cpu()
{
int[] tab = new int[6];
for(int i=0;i<6;i++) tab[i] = cpu[i];
return tab;
}
public int retourner_score_moi()
{
return score_moi;
}
public int retourner_score_cpu()
{
return score_cpu;
}
//*******************************************************************************************************
//*******************************************************************************************************
public void copier(awale a)
{
int[] tab1, tab2;
tab1 = a.retourner_moi();
tab2 = a.retourner_cpu();
for (int i = 0; i < 6; i++)
{
moi[i] = tab1[i];
cpu[i] = tab2[i];
}
}
//*******************************************************************************************************
//*******************************************************************************************************
int alphabeta(int alpha,int beta,int profondeur)
{ int i=0,x;
awale[] awa = new awale[6];
if(profondeur==0) return(score_cpu - score_moi);