Un puissance 4 tout simple

Soyez le premier à donner votre avis sur cette source.

Vue 7 204 fois - Téléchargée 418 fois


Description

Mon premier code en C++ alors soyez indulgent!
C'est un puissance 4 qui se joue sur console, vous jouez seul contre l'ordi.
On peut choisir aussi la profondeur de calcul.
Amusez-vous bien!

Source / Exemple :


#include <iostream>
#include <cstdlib>

using namespace std;

int gagne(int c,int l,int J,int tab[7][6])  // renvoie J si le joueur gagne, sinon 0.
{
int j[4];
j[0]=1;
j[1]=1;
j[2]=1;
j[3]=1;
int i;
for (i=1; i<4; i++)
    {
    if (c-i>-1)
        {
        if ((tab[c-i][l]==J)&&(j[0]==i)) j[0]++;
        if ((l-i>-1)&&(j[1]==i)) {if(tab[c-i][l-i]==J) j[1]++;}
        if ((l+i<6)&&(j[2]==i)) {if(tab[c-i][l+i]==J) j[2]++;}
        }
    if ((l-i>-1)&&(j[3]==i)) {if(tab[c][l-i]==J) j[3]++;}
    }
int k[3];
k[0]=1;
k[1]=1;
k[2]=1;
for (i=1; i<4; i++)
    {
    if (c+i<7)
        {
        if ((tab[c+i][l]==J)&&(k[0]==i)) k[0]++;
        if ((l-i>-1)&&(k[2]==i)) {if(tab[c+i][l-i]==J) k[2]++;}
        if ((l+i<6)&&(k[1]==i)) {if(tab[c+i][l+i]==J) k[1]++;}
        }
    }
i=0;
if ((k[0]+j[0]>=5)||(k[1]+j[1]>=5)||(k[2]+j[2]>=5)||(j[3]==4)) i=J;
return i;
}

int IA(int I,int J,int tab[7][6],int colonne[7],int c)
{
I--;        //  on descend dans la profondeur du calcul
int s;
if (gagne(c,colonne[c],J,tab)==0)    // si ce que je joue ne me fait pas tout de suite gagner
    {
    s=0;
    if (I!=0)
        {
        int r,i,l,g,h;
        l=colonne[c];   // on joue la colonne c
        tab[c][l]=J;
        colonne[c]++;
        r=0;
        J++;        // changement de joueur
        if (J==3) J=1;
        for (i=0;i<7;i++)       //  on regarde tous les coups possibles
            {
            if (colonne[i]==6) r++;
            else
                {
                g=IA(I,J,tab,colonne,i);
                if (g==J) s=J; else {if (g!=0) r++;}
                }
            }
        J++;
        if (J==3) J=1;
        if (r==7) s=J;   // si toutes les solutions mènent à perdre...
        colonne[c]--;
        tab[c][l]=0;
        }
    }
else s=J;
I++;
return s;   // s prend la valeur du joueur qui gagne, 0 si personne ne gagne
}

void affichageTab(int tab[7][6])   // affiche le tableau!!!
{
int i,j;
cout<<endl;
for (i=5;i>=0;i--)
    {
    cout<<"          | ";
    for (j=0;j<7;j++)
        {
        if (tab[j][i]==0) cout<<" ";
        if (tab[j][i]==1) cout<<"X";
        if (tab[j][i]==2) cout<<"O";
        cout<<" ";
        }
    cout<<"|"<<endl<<"          |---------------|"<<endl;
    }
cout<<"          # 0 1 2 3 4 5 6 #"<<endl<<endl;
}

int main()
{
while(1)
    {
    int colonne[7];   // donne le nombre de jetons sur chaque colonne
    int tab[7][6];
    int i,j;
    for (i=0; i<7; i++)  // mise a zéro du tableau et des colonnes
        {
        colonne[i]=0;
        for (j=0; j<6; j++)
            {
            tab[i][j]=0;
            }
        }
    int I;   //  Intelligence de l'ordi
    cout << endl << "     *****************" << endl << "     *  puissance 4  *" << endl << "     *****************" << endl << endl << "intelligence de l'ordi? (1 à 10)" << endl;
    cin>>I;                 //intelligence ordi
    int J;   //   Joueur en cours
    cout<<"qui commence?(1=>ordi 2=>toi)"<<endl;
    cin>>J;
    int g=0;                //g=0 => le jeu continue ; g=1 => ordi gagne ; g=2 => tu gagnes ; g=3 => égalité
    int c;
    int l;
    int compteur;
    compteur=0;
    while (g==0)         //  tant que personne n'a gagné...
        {
        if (compteur==42) {g=3;break;}  // égalité
        affichageTab(tab);
        if (J==2)            //  si c'est toi qui joue...
            {
            cout<<endl<<"colonne?(0 à 6) (tu es les ronds!!!)"<<endl;
            do
                {
                cin>>c;             //colonne
                if(colonne[c]>5) {cout<<"cette colonne est pleine"<<endl;}
                }
            while(colonne[c]>5);
            }
        else            //  si c'est l'ordi qui joue
            {
            cout<<endl<<"laisse-moi le temps de réfléchir..."<<endl;
            int c3[7]={0,6,5,1,2,4,3};   // c3 désigne l'ordre de préférence, du moins vers le plus.
            int r[7];
            int c2;
            c=-1;       //  colonne qu'on va jouer
            for (c2=0;c2<7;c2++)             // on regarde d'abord si l'ordi peut gagner en un endroit
                {
                if (colonne [c3[c2]]==6) r[c3[c2]]=-1;
                else {r[c3[c2]]=IA(I,J,tab,colonne,c3[c2]); if (r[c3[c2]]==J) {c=c3[c2];break;}}
                }
            if (c==-1) {for (c2=0;c2<7;c2++) {if (r[c3[c2]]==0) c=c3[c2];}}    //   on regarde si l'ordi peut ne pas perdre
            if (c==-1) {for (c2=0;c2<7;c2++) {if (r[c3[c2]]!=-1) c=c3[c2];}}    //  on regarde ou l'ordi peut jouer
            cout<<"je joue la colonne "<<c<<endl;
            }
        l=colonne[c];         //ligne
        tab [c][l]=J;
        colonne[c]++;
        g=gagne(c,l,J,tab);
        J++;
        if (J==3) J=1;
        compteur++;
        }
    affichageTab(tab);
    if(g==1) cout<<endl<<"dommage pour toi!!"<<endl;
    if(g==2) cout<<endl<<"Mais tu est un dieu!!!!"<<endl;
    if(g==3) cout<<endl<<"égalité"<<endl;
    system("PAUSE");
    }
return 0;
}

Conclusion :


Je compte modifier légerement le code en utilisant les pointeurs pour les tableaux, si vous avez des conseils, je suis preneur.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 26 juillet 2001
Statut
Membre
Dernière intervention
29 avril 2008

disons que si tu publies, le but c'est que ce soit "consultable"
:)
Messages postés
2
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
11 mai 2007

T'as pas tort, même moi j'ai du mal à m'y retrouver!
Je vais essayer de rendre le code plus lisible mais c'est pas gagné.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
8
Faudrait que tu penses à mieux indenter ton code, c'est atroce et absolument illisible... Bref, je me pencherais sur l'algorithme d'IA quand tu auras mis ta source à jour avec une indentation correcte (commande "indent" sous unix-like...)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.