Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
aider moi a decortiquer un programme en c
Envoyé par: watzagirl

bonjour je suis une debutante en c ; et g trouve un petit programme du jeu puissance 4 et j'aimerai bie ncomprendre a koi elle servent qq fonctions:-o:-o
ca fé deux jours ke je me pren la tete dessuus et jy arrive pas vraiment!!!!!!!!!!!!!! donc voila si qq1 peu m'aider ca serai gentil:ange::-):-):-)



et voila le fameux programme

et les fonctions ke j'aimerai comprendre leur fonctionnement sont ADJACENT et PARTIEESTGAGNEOUPAS


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

char grille[6][7];/*ce tableau represente une delimitation du nombre de case de la grille*/
int remplissage[7];/* ce tableau définit le nombre de jeton qu'il y a dans la colonne..maximum 6.*/



int dansGrille(int x,int y)
/*la fonction prend 2 entiers x et y et renvoie vrai s'il existe une case de coordonnées(x,y)dans grille.*/
{
if ((x>=0)&&(x<=5)&&(y>=0)&&(y<=6))/* x appartient aux six cases d'une colone 0~5
y appartient aux septs case d'une ligne 0~6*/
return 1;
else return 0;
}
/* fonction qui renvoie vrai s'il est possible
de poser un jeton dans la colonne x, j'utilise un tableau sur cette fonction*/
int jouable(int x)
{

if (x>=0 && (x<7) &&remplissage[x]>=0 && remplissage[x]<6)
return 1;
else return 0;

}
/*.............fonction saisir coup*/
int saisircoup()
{
int z; // z colonne//

do{


printf("\t rentrez une colonne entre <0-6>:\n\t essaies une autre si celle-ci est remplie!\n");
scanf("%d",&z);
if (jouable(z)==1)
return z;

}
while(jouable(z)!=1);

}
/*..............*/
void afficherGrille()
{
int i,j;
printf("\t\t********MOUSSY && MICK********\n");
printf("\t\t*********Puissance4*******\n\n\n\n");

for(i=0;i<6;i++){
printf("\t\t\t");
printf("+-+-+-+-+-+-+-+");

printf("\n");
printf("\t\t\t");
for (j=0;j<7;j++)

printf("|%c",grille[5-i][j]);

printf("|%d \n",i);// affiche les numéros horizontalement

}
if (i==6)
printf("\t\t\t");
printf("+-+-+-+-+-+-+-+");
printf("\n");
printf("\t\t\t");
for(j=0;j<=6;j++)
{
printf(" %d",j);// affiche les numéro verticalement
}
printf("\n\n\t\t");
}


int estRemplieOuNon()

{
int x,comp=0;
for(x=0;x<=6;x++)
{
if(jouable(x))
{
comp=comp+1;
}
}
if (comp==0) //nbre de colonne+1

return 1;


else return 0;

}

int adjacent(int c, int l,int dirV, int dirH)
 {
             int n=0;
            
             if(dirV==0)
             {
             if(dirH==1)
             {
             while((grille[l][c])==(grille[l][c+1])&&(grille[l][c]!=' '))
             {
             n++;
             c++;
                         }
             }
             else if(dirH==-1)
             {
             while((grille[l][c])==(grille[l][c-1])&&(grille[l][c]!=' '))
             {
             n++;
             c--;
             }
             }
             }
             if(dirV==1)
             {
             if(dirH==0)
             {
             while((grille[l][c])==(grille[l+1][c])&&(grille[l][c]!=' '))
             {
             n++;
             l++;
             }
             }
             else if(dirH==1)
             {
             while((grille[l][c])==(grille[l+1][c+1])&&(grille[l][c]!=' '))
             {
             n++;
             c++;
             l++;
             }
             }
             else if(dirH==-1)
             {
             while((grille[l][c])==(grille[l+1][c-1])&&(grille[l][c]!=' '))
             {
             n++;
             c--;
             l++;
             }
             }
             }
             if(dirV==-1)
             {
             if(dirH==0)
             {
             while((grille[l][c])==(grille[l-1][c])&&(grille[l][c]!=' '))
             {
             n++;
             l--;
             }
             }
             else if(dirH==-1)
             {
             while((grille[l][c])==(grille[l-1][c-1])&&(grille[l][c]!=' '))
             {
             n++;
             c--;
             l--;
             }
             }
             else if(dirH==1)
             {
             while((grille[l][c])==(grille[l-1][c+1])&&(grille[l][c]!=' '))
             {
             n++;
             c++;
             l--;
             }
             }
             }
             return(n);
            
             }

 int partieEstGagneeOuPas(int c,int l)
 {

             if ((adjacent(c,l,0,1)+adjacent(c,l,0,-1))>=3 ||
             (adjacent(c,l,1,0)+adjacent(c,l,-1,0))>=3 ||
             (adjacent(c,l,1,1)+adjacent(c,l,-1,-1))>=3 ||
             (adjacent(c,l,1,-1) + adjacent(c,l,-1,1)>=3))
             return 1;
             else return 0;

 }
/*6*/
main ()
{

int i,j,joueur=0,colonne,ligne;
int y=0,compt1=0;
int score1,score2;
const N=50;
char nom1[N],nom2[N],recom;
printf("nom du premier joueur!!\n");
scanf("%s",&nom1[N]);
printf("nom du deuxiem jouer\n");
scanf("%s",&nom2[N]);
afficherGrille();
do
{
for (i=0;i<6;i++)
{
for (j=0;j<7;j++)
{
grille[j]=' ';
}
}

for(j=0;j<7;j++)
{
remplissage[j]=0;/* on initialise remplissage à zéro, car 0 est sa premiere valeur*/
}
do
{
if (joueur%2==0)// evident
{
printf("%s, posez votre pion\n",&nom1[N]);// on rentre son nom
colonne=saisircoup();
ligne=remplissage[colonne];//remplissage définit les lignes de la colonne
grille[ligne][colonne]='O';
remplissage[colonne]=remplissage[colonne]+1;
compt1++;
system("cls");
afficherGrille();
if( partieEstGagneeOuPas(colonne,ligne)==1)// si la partie est gagnée
{
printf("%s gagne au %deme coup\n",&nom1[N],compt1/2+1);
}
}

if(joueur%2!=0)
{
printf("%s, posez votre pion\n",&nom2[N]);
colonne=saisircoup();
ligne=remplissage[colonne];
grille[ligne][colonne]='X';
remplissage[colonne]=remplissage[colonne]+1;
compt1++;
system("cls");// efface
afficherGrille();
if( partieEstGagneeOuPas(colonne,ligne)==1)
{
printf("%s gagne au %deme coup\n",&nom2[N],compt1/2);
}

}

joueur=joueur+1;//on incremente le joueur


} while(( !estRemplieOuNon() && !partieEstGagneeOuPas(colonne,ligne) ) );// répéter tant que c'est pas rempli

printf("le score de %s est %d\n",&nom1[N],score1);
printf("le score de %s est %d\n",&nom2[N],score2);

do
{ fflush(stdin);
printf("\t\tVoulez-vous recommencer ? (o/n) : ");
scanf("%c",&recom);
}while(recom!='o' && recom!='n');

printf("\n");
}while (recom=='o');

}

Poste le Friday 25 May 2007 22:49:48
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: oudoubah

Citation
watzagirl
bonjour je suis une debutante en c ; et g trouve
un petit programme du jeu puissance 4 et
j'aimerai bie ncomprendre a koi elle servent qq
fonctions
ca fé deux jours ke je me pren la tete dessuus et
jy arrive pas vraiment!!!!!!!!!!!!!! donc voila si
qq1 peu m'aider ca serai gentil

et voila le fameux programme

et les fonctions ke j'aimerai comprendre leur
fonctionnement sont ADJACENT et
PARTIEESTGAGNEOUPAS

Bonsoir,

Tu es également débutante en français? Peut être que si tu fais un effort sur le français, il y en a qui feront un effort pour répondre à ta question...

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Saturday 26 May 2007 02:47:54
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: watzagirl

ok, c'est vraiment sympa oudoubah!!!!!!!!!!!!!!!!

peut-etre ce que j'ai ecrit auparavant était plein de fautes mais n'empeche ca restait compréhensible, du moins j'espere ( excuse moi de ne pas t'avoir ecrit une dissertation pour tout t'expliquer !!!!!!!!!!!)
c'est pas pour dire mais je te trouve assez dure avec une debutante et va savoir pourquoi??? machisme ou juste l'humeur du matin qui n'est pas encore au point :-):-):-)

de tte facon je reformule au cas où d'autres personnes n'auraient pas compris !!!!!

dans le programme ci dessus, je souhaiterai comprendre a quoi servent exactement les fonctions ADAJACNET et PARTIEGAGNEOUPAS

merci d'avance à toutes les âmes charitables qui se proposeront pour m'aider et non me casser!!!!!:-):-):-):-)

Poste le Saturday 26 May 2007 11:26:58
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: Fanch

Hou que c'est mal codé !!!!!! @#%!
c'est pas étonnant que tu te prennes la tête, la personne qui a commis ce truc mérite des baffes.

Ensuite je suis d'accord avec Oudoubah, ici on parle français stp.

bon, pour répondre à ta question :
la fonction "adjacent" compte combien de jetons de la même couleurs sont alignés à partir d'une case donnée (paramètres c et l) et dans une direction donnée (paramètres dirV et dirH).
Les paramètres :
c : indice de la colonne de début de comptage
l : indice de la ligne de début de comptage (déjà là, la logique ... #%b )
dirV : direction verticale je suppose, 0 on reste sur la même ligne, 1 on va vers le haut, -1 on va vers le bas.
dirH : comme dirV mais horizontal, 0 on reste dans la même colonne, 1 on va à droite, -1 on va à gauche

la fonction "partieEstGagneeOuPas" teste si le nombre de jetons de la même couleurs qu'une case donnée est supérieur au seuil de victoire (en l'occurence 3 car le 4ème est la case de départ qui n'est pas comptée par la fonction adjacent). Si c'est bon, elle renvoie 1 (true) sinon 0 (false).

voilà. :-)

je reviens et j'insiste sur le fait que ce code est particulièrement mal codé, mal pensé, mal commenté et j'en passe. Mais bon, si personne n'a jamais expliqué aux auteurs comment faire du code propre, ils peuvent pas l'inventer ...

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Poste le Saturday 26 May 2007 11:29:36
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: nicola

Tu n’as pas compris que le problème ne vient pas de ton expression (qui est à peu près correcte) mais de l’usage du SMS.
Le code n’est pas indenté, il est pénible à lire.
Si tu veux le comprendre, modifie-le légèrement (par exemple change un nombre et regarde ce qui se passe), ou ajoute des printf un peu partout.
Bien entendu, tu as gardé en commentaires le code original.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Saturday 26 May 2007 11:31:04
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: Raph__

Salut,

La fonction adjacent, comme son nom l'indique, permet de vérifier s'il y a "puissance 4".
La variable n comptabilise les jetons adjacents.
La variable c permet de se déplacer dans les colonnes et la variable l dans les lignes. L'incrémentation ou la décrémentation de ces deux variables permet de se déplacer à l'horizontal, vertical ou en diagonale dans le tableau.

La fonction partieEstGagneeOuPas permet d'appeler adjacent avec toutes les combinaisons horizontal/vertical.

Dans ton code il n'y a rien de compliqué lié au langage utilisé. Il faut juste comprendre le raisonnement de celui qui a codé la chose. Amha c'est un mauvais exemple.
Si tu n'as pas de livre sur le C, un cours devrait te permettre de comprendre ce morceau de code sans trop de difficulté.
A chaque fois que tu rencontres une écriture que tu ne comprends pas, tu peux te reporter à une doc.

Dernière chose. Toutes les fonctions sont appelées à partir de la fonction principale "main". Commence par lire cette fonction pour comprendre le mécanisme général.

Bon courage.

A Ciao.

PS: Les fautes de français c'est une chose. Amha le plus important c'est de se relire pour vérifier que la question est bien posé et éliminer un maximum d'étourderie. J'ai cherché la fonction ADAJACNET et je ne l'ai pas trouvé.

Poste le Saturday 26 May 2007 12:55:06
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: Raph__

Ola, un café avec un croissant et déjà quinze réponses. :chef:

Poste le Saturday 26 May 2007 12:56:55
Répondre     Citer    
Re: aider moi a decortiquer un programme en c
Envoyé par: watzagirl

merci a tous pour votre aide je vais essayer de modifier le code en mettant en place plus de fonctions
histoire d'alléger le main!!!!!!!!!

je metterai aussi plus de commenctaire comme vous avez proposez

merci encore pour votre aide et votre gentillesse!!!!!!!!!!

:-):-):-):-):ange::ange:

Poste le Sunday 27 May 2007 17:48:01
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
aider moi a decortiquer un programme en c
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons