Jeu de Pente

Fermé
bodyfitgirl - 6 févr. 2014 à 08:52
 bodyfitgirl - 6 févr. 2014 à 10:46
Bonjour,
Je suis actuellement en ecole d'ingénieur et j'ai un projet informatique a réaliser en C avec emacs sous linux, j'ai un problème lors du lancement du jeu dès que je tape mes coordonnées j'ai une erreur de segmentation. Vous pouvez trouver les règles du jeu sur internet mais cela ressemble vaguement à un puissance 4. Je vous mets mon code si dessous, n'hesitez pas à me dire ce qu'il ne va pas merci.

#include <stdio.h>

#include <stdlib.h>

#define NL 19

#define NC 19

char X = 'X';

char O = 'O';

char j1[20];

char j2 [20];

char plateau[NL][NC];


void menu() // fonctionnel

{

printf("Bienvenue sur le Jeu de Pente : \n");

printf(" Entrez le nom du Joueur1 : \n ") ;

scanf("%s" ,j1) ;

printf(" Entrez le nom du Joueur2:\n ") ;

scanf("%s" ,j2) ;

}


//initialisation du plateau avec le caractère vide

void init_plat(char plateau[NL][NC]) // fonctionnel
{

for(int i = 0 ;i < NL ; i++)

{

for(int j=0; j < NC; j++)

{
plateau[i][j] = ' ';
}

}

}


//affichage du plateau

void affich_plat(char plateau[NL][NC])// fonctionnel

{

printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19|\n");

printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
for(int i = 0 ;i < NL ; i++)

{

for(int j=0; j < NC; j++)

{

printf("|");

printf("%c",plateau[i][j]);

printf(" ");

}

printf("\n");

printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");

printf("\n");

}

return;

}


//test si tableau est rempli // fonctionnel

int rempli(char plateau[NL][NC])

{

for(int i = 0 ;i < NL ; i++)

{

for(int j=0; j < NC; j++)

{

if(plateau[i][j] != ' ')

{

printf("Egalité, Partie terminé\n");

return 0;

}

else
{
return 1;
}

}

}

}


// Test validité coup à n'importe quel moment du jeu

int validite_coup(char plateau[NL][NC],int x, int y)

{

if(x >= 0 || x < NL && y >= 0 || y < NC)

{

return 1;

}

else if(plateau[x][y]==' ')

{

return 0;

}

else

{

printf("Erreur, Rejouez!\n");

return 2;

}

}


// test alignement horizontale

void test_alignementh(char plateau [NL][NC],int l , int c,char *gamer)

{

int min,max;


for(int i= l;i<NL;i++)

{

if( (i-l)==4)

{
max=i;
}

}


for(int j= l;j>0;j--)

{

if( (l-j)==4)

{
min=j;
}

}


for(int t=min;t<max;t++)

{

if(plateau[t][c]==plateau[l][c])

{
printf("Alignement Horizontal!,%s gagne\n",gamer);
}

}


}


// test alignement vertical

void test_alignementv(char plateau [NL][NC],int l , int c,char *gamer)

{

int min,max;

for(int i= c;i<NC;i++)

{

if( (i-c)==4)

{
max=i;
}

}


for(int j= l;j>0;j--)

{

if( (c-j)==4)

{
min=j;
}

}


for(int t=min;t<max;t++)

{

if(plateau[l][t]==plateau[l][c])

{
printf("Alignement Vertical!,%s gagne\n",gamer);
}

}


}


//jouer coup dans un tableau

int *jouer_coup(char symbole, char plateau[NL][NC], char *gamer)

{
int l1,c1;

int * tab;

char *abscisse;
char *ordonnee;
char espace2;

printf("%s entrez un numéro de ligne et de colonne séparé d'un espace : \n",gamer);

do

{

scanf("%s""%c""%s",&abscisse,&espace2,&ordonnee);

int sizeAb = sizeof(*abscisse);
int sizeOr = sizeof(*ordonnee);
int espace = 0,y = 0, z = 0;

char * lig;

char * col;

for(int i = 0; i < sizeAb ; i++)

{
for(int j =0; j < sizeOr ; j++)
{

if(abscisse[i] != ' ' && espace == 0)

{
lig[y] = abscisse[i];
y++;
}

else if(abscisse[i] == ' ')

{
espace++;
}

else if(ordonnee[j] != ' ' && espace == 1)

{
col[z] = ordonnee[j];
z++;
}

//l1 = atoi(lig);

//c1 = atoi(col);

}
}
if(espace >1 || espace == 0){
printf("Saisir les coordonnées sous ce format 1 1");
}

if(atoi(lig) == 0){
l1 = atoi(lig);
}else{
printf("la coordonnée pour la ligne n'est pas un chiffre");
}

if(atoi(col) == 0){
c1 = atoi(col);
}else{
printf("la coordonnée pour la colonne n'est pas un chiffre");
}

int ret = validite_coup(plateau,l1,c1);

if(ret == 0)

{
plateau[l1][c1]== symbole;

tab[0] = l1;

tab[1] = c1;

}

}

while(plateau[l1][c1] != ' ');


return tab;

}


//test alignement diagonale

void test_alignementd(char plateau [NL][NC],int l , int c,char *gamer)

{


int min1,max1,min2,max2;

for(int i= l;i<NL;i++)

{
for(int j = c ; j <NC; j++)
{
if( (i-l) == 4 && (j-c) == 4 )
{
max1 = i ;
max2 = j ;
}
}

}
for(int i = l; i > 0 ; i--)
{
for(int j = c ; j > 0 ; j--)
{
if( (l-i) == 4 && (c-j) == 4)
{
min1 = i ;
min2 = j ;
}
}
}
for(int t = min1; t < max1 ; t++)
{
for(int v = min2 ; v < max2 ; v++)
{
if(plateau[t][v]==plateau[l][c])

{
printf("Alignement Diagonal!,%s gagne\n",gamer);
}

}
}
}


//capture de pion
void capture(char plateau [NL][NC],int l , int c,char *gamer)

{


int min1,max1,min2,max2;
int cpt = 0;
if( cpt < 5)
{
for(int i= l ; i<NL ; i++)

{
for(int j = c ; j <NC ; j++)
{
if( (i-l) == 2 && (j-c) == 2 )
{
max1 = i ;
max2 = j ;
}
}

}
for(int i = l; i > 0 ; i--)
{
for(int j = c ; j > 0 ; j--)
{
if( (l-i) == 2 && (c-j) == 2)
{
min1 = i ;
min2 = j ;
}
}
}
for(int a = min1-1 ; a < min2+1 ; a++)
{
for(int b = max1+1 ; b < max2-1 ; b++)
{
if( plateau[a][b] == plateau[l][c])
{
for(int t = min1; t < max1 ; t++)
{
for(int v = min2 ; v < max2 ; v++)
{
if(plateau[t][c] != plateau[l][c] )

{
plateau[t][c] = ' ';
cpt++;
}

}
}
}
}
}
}
else{
printf("Partie Terminee, %s gagne!\n",gamer);
}
}

// programme principale

int main()

{

int *gril;

int a,b;

char* j = j1;

menu();

init_plat(plateau);

affich_plat(plateau);

do
{
if(j == j1)

{

gril=jouer_coup('X',plateau,j);

affich_plat(plateau);
a = gril[0];

b = gril[1];

test_alignementh(plateau,a,b,j);

test_alignementv(plateau,a,b,j);

test_alignementd(plateau,a,b,j);

capture(plateau,a,b,j);
j = j2;

}else if (j == j2){

gril=jouer_coup('O',plateau,j);

affich_plat(plateau);
a = gril[0];

b = gril[1];

test_alignementh(plateau,a,b,j);

test_alignementv(plateau,a,b,j);

test_alignementd(plateau,a,b,j);
capture(plateau,a,b,j);
j = j1;

}
}while(rempli(plateau) > 0);

}




A voir également:

2 réponses

Utilisateur anonyme
6 févr. 2014 à 10:01
Bonjour

Dans la fonction jouer_coup, tu utilises de nombreux pointeurs non initialisés : tab, abscisse, ordonnée...
Quand tu écris tab[0] tu vas donc 'taper' n'importe où dans la mémoire : le résultat est un plantage garanti
0
que me conseilles-tu alors ?
0
Utilisateur anonyme
6 févr. 2014 à 10:42
Il faudrait regarder le détail de ce que tu en fais, et c'est difficile car ton code a été posté sans les balises <code> et est de ce fait illisible.
Selon les cas, il faudrait allouer de la mémoire (avec malloc, mais alors il ne faut pas oublier le free correspondant) ou bien définir des tableaux bien dimensionnés plutôt que des pointeurs.

Par exemple, le tableau que tu retournes de la fonction jouer_coup est incorrect.
Soit c'est un tableau défini dans la fonction, et il est très dangereux de le passer en 'return' car il n'existe plus quand on quitte la fonction
Soit c'est un pointeur pour lequel tu as alloué de la mémoire à l'intérieur de la fonction, et il faut que tu penses à en faire un 'free' dès que tu n'en as plus besoin.
Mais le plus simple pour moi est de le définir comme tableau dans le main, et d'en faire un paramètre supplémentaire à ta fonction jouer_coup. Cette fonction devient alors de type void (elle ne fait plus de return) mais modifie directement ce tableau.
0
d'accord je te remercie
0