Réversi again, pas pour les mêmes raisons [Résolu]

Signaler
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
-
Messages postés
4
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
8 janvier 2005
-
ben vala moi aussi j'dois faire un prog de reversi en C

j'avais déjà posté mais le thread à l'air si vieux que je l'ai pas
retrouvé dans les 10 premières pages du forum alors je reposte vala.



je fais le reversi, je tourne sous windows, j'utilise Dev C++

je fais la phase d'initialisation du plateau :



#define N 8

#include <stdio.h>



int main(void)

{

int Plateau[N][N];

int i,j,k=64;

for(i=N;i>0;i--)

{

for(j=N;j>0;j--)

{

Plateau[i][j]=0;

}

}

return 0;

}



j'l'ai séparée du reste du prog pour voir pk le programme plantait.

enfin bref j'en suis arrivé à la réduire à ça et je comprends pas
pourquoi quand je lance l'application, l'invite de commande me met un
erreur (en considérant que j'ai vérifié que le programme effectuait
bien l'opération que je lui demandais en couplant l'initialisation avec
un programme d'affichage.)

je pense que le problème vient de la boucle vu qu'il reste plus que ça et que ca plante encore

siouplé aidez moiiiiiiiiiiiiiiiiiiiiiiiiiiiii

12 réponses

Messages postés
74
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
3 mai 2006

Salut,

tu initialises un tableau de N cases par contre il ne faut pas oublier que les cases vont de 0 à N-1

du coup au premier tour de ta boucle tu écris à la case N (en dehors des limites de ton tableau)



je pense qu'il faudrait plutot faire la boucle comme ça :




int main(void)

{

int Plateau[N][N];

int i,j,k=64;

for(i=N-1;i>=0;i--)

{

for(j=N-1;j>=0;j--)

{

Plateau[i][j]=0;

}

}

return 0;

}



DvdMizo
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
1
rha putain le con ! XD

c'était ça :p
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
1
c chiant ca va m'obliger a raisonner en partant de 0 et non de 1 pour la numérotation des cases XD
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
1
ah ouais tiens ptite question, y'a moyen de faire un scanf de cette manière :

scanf("%d-%d",&a,&b);

tel que quand on pose la question, on réponde de la manière a-b ?



(c'est pas des symboles de différence que je pose là)
Messages postés
74
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
3 mai 2006

je ne suis pas trop fan du scanf. perso je préfère faire de la saisie caractère par caractère et analyser après...



mais ça marche

DvdMizo
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
1
pfff maintenant j'ai un blème de boucle :

#include <stdio.h>
#define N 8
/*initialiser le plateau de jeu*/
void init(int T[N][N])
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
T[i][j]=0;
}
}
T[3][3]=-1;
T[3][4]=1;
T[4][4]=-1;
T[4][3]=1;
}


/*affichage du plateau*/
void affichage(int Plateau[N][N])
{
int i,j,k=65;
printf(" 1 2 3 4 5 6 7 8\n");
for(i=0;i<N;i++)
{
printf("%c",k+i);
for(j=0;j<N;j++)
{
printf("%2d",Plateau[i][j]);
}
printf("\n");
}
}


/*tour du joueur n°1*/
void joueur1(int Plateau[N][N])
{
char lettre;
int colonne,ligne;
printf("joueur n°1\n");
printf("choisissez une case où poser votre pion (lettre chiffre) : ");
scanf("%c %d",&lettre,&colonne);
if(lettre=='A') ligne=0;
if(lettre=='B') ligne=1;
if(lettre=='C') ligne=2;
if(lettre=='D') ligne=3;
if(lettre=='E') ligne=4;
if(lettre=='F') ligne=5;
if(lettre=='G') ligne=6;
if(lettre=='H') ligne=7;
colonne=colonne-1;
Plateau[ligne][colonne]=-1;
}


/*tour du joueur n°2*/
void joueur2(int Plateau[N][N])
{
char lettre;
int colonne,ligne;
printf("joueur n°2\n");
printf("choisissez une case où poser votre pion (lettre chiffre) : ");
scanf("%c %d",&lettre,&colonne);
if(lettre=='A') ligne=0;
if(lettre=='B') ligne=1;
if(lettre=='C') ligne=2;
if(lettre=='D') ligne=3;
if(lettre=='E') ligne=4;
if(lettre=='F') ligne=5;
if(lettre=='G') ligne=6;
if(lettre=='H') ligne=7;
colonne=colonne-1;
Plateau[ligne][colonne]=1;
}


/*vérification des pions à retourner*/
void retourne(int Plateau[N][N])
{
(ça je le ferai plus tard)
}


/*le plateau est-il plein ?*/
int case_vide(int Plateau[N][N])
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(Plateau[i][j]==0) return 0;
}
}
return 1;
}


/*fonction principale*/
int main(void)
{
int Plateau[N][N],vide;
init(Plateau);
affichage(Plateau);
do{
joueur1(Plateau);
affichage(Plateau);
joueur2(Plateau);
affichage(Plateau);
vide=case_vide(Plateau);
}while (vide=0);
return 0;
}

comment ça se fait que quand je fais tourner le programme, quand vient le tour du joueur 1, ça marche impec, il prend les coordonnées, il affiche et quand c'est le tour du joueur 2 il sort du prog sans même demander le scan ?
Messages postés
74
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
3 mai 2006

j'ai testé et il s'arrête bien sur le scanf, par contre il y a quelques
petites choses qui me chagrinent un peu dans ton code ....



1) il quitte la boucle après un seul tour :



ça vient de ton test dans le while:

while(vide=0) ;

au lieu de

while(vide==0) ;

ou

while(!vide) ;


2) dans ta fonction :



void joueur1(int Plateau[N][N])
{
char lettre;
int colonne,ligne;
printf("joueur n°1\n");
printf("choisissez une case où poser votre pion (lettre chiffre) : ");
scanf("%c %d",&lettre,&colonne);
if(lettre=='A') ligne=0;
if(lettre=='B') ligne=1;
if(lettre=='C') ligne=2;
if(lettre=='D') ligne=3;
if(lettre=='E') ligne=4;
if(lettre=='F') ligne=5;
if(lettre=='G') ligne=6;
if(lettre=='H') ligne=7;
colonne=colonne-1;
Plateau[ligne][colonne]=-1;
}




(idem pour joueur2) si la lettre saisie ne correspond à aucun des choix
('A', 'B', etc) ou si l'utilisateur (qui peut être très con parfois
lol) tape une minuscule, ta variable ligne n'est jamais initialisée et
donc quand tu fais :



Plateau[ligne][colonne]=-1;


o
u encore si l'utilisateur tape une valeur de 'colonne' en dehors des limites du tableau,


tu risques d'avoir un petit problème de plantage (comme au début).



j'aurais fait plutot comme ça :




void joueur1(int Plateau[N][N])
{
char lettre;
int colonne,ligne;
printf("joueur n°1\n");
printf("choisissez une case où poser votre pion (lettre chiffre) : ");
scanf("%c %d",&lettre,&colonne);


switch(lettre)

{

case 'A' :

case 'a' :

{

ligne=0;

break;

}


case 'B' :
case 'b' :
{
ligne=1;
break;
}


case 'C' :
case 'c' :
{
ligne=2;
break;
}


case 'D' :
case 'd' :
{
ligne=3;
break;
}


case 'E' :
case 'e' :
{
ligne=4;
break;
}


case 'F' :
case 'f' :
{
ligne=5;
break;
}


case 'G' :
case 'g' :
{
ligne=6;
break;
}


case 'H' :
case 'h' :
{
ligne=7;
break;
}

default:

{

ligne=-1 ;

}


}
colonne=colonne-1;

if(ligne != -1
&& colonne >= 0
&& colonne < N)

{
Plateau[ligne][colonne]=-1;

}
}





voilà, j'éspère que ça t'aidera ;)






DvdMizo
Messages postés
9
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
6 janvier 2005
1
arf ouais merde >_<
enfin pour les caractères, c'est vrai que je devrai faire ça mais j'en suis qu'au début là
c'est une bonne idée je mettrai en pratique merci Mister Mizo
Messages postés
4
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
8 janvier 2005

Bonjour,

je commence le C moi aussi et je dois faire un projet reversi.

Cependant, j'ai quelques problemes pour faire la condition de test des cases.



dans l'exemple ci dessous je test la case de gauche a la case que lon veut rentrer.

Le probleme qui se pose c'est que au bout de la 3eme fois il me
creer un autre symbole au dessus de la case voulu et je ne sais pas
d'ou viens le pb.

(dsl pour la longueur)





#include <stdio.h>

#include "conio.h"





int main(int argc, char *argv[])

{





long taille, ligne, colonne;

long col, milieu, tai, lig ;

long i, j, cpt ;

long choix;

char adv, mien ;

char plat[30][30];






do
/*boucle pour avoir un nombre de cases pair*/

{

printf("Combien de colonnes, lignes voulez vous? \n");

fflush(stdin);

scanf("%ld", &taille);

tai=taille%2;

}

while(taille<6 || tai!=0 );

printf("\n");




/*calcul pour obtenir le milei du plateau*/

milieu = taille/2;





for(i=0; i<taille;
i++)
/*boucle pour l'affichge des abscisses*/

{

if(i==0)

{

printf(" %c ", i+49);

}

else

{

printf(" %c ", i+49);

}

}

printf("\n");





for(i=0; i<taille;
i++) /*boucle
pour l'affichage du tableau avec son milieu*/

{


if(i<9)
/*et des ordonnées*/

{

printf(" %ld ", i+1);

}

else

{

printf(" %ld ", i+1);

}





for(j=0; j<taille; j++)

{

plat[i][j]='.';

plat[milieu-1][milieu-1]='O';

plat[milieu][milieu-1]='X';

plat[milieu][milieu]='O';

plat[milieu-1][milieu]='X';

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



}

printf("\n");

}



/*******************************Fin de l'initialisation************************/





cpt = 0 ;

choix=1;



do

{

choix=choix+1;

choix=choix%2;

switch(choix)

{

case 0 :
adv='O';
/*Pour le joueur X l'adversaire a les poins O*/

mien= 'X';

break;



case 1 :
adv='X';
/*Pour le joueur O l'adversaire a les poins X*/

mien= 'O';

break;

default : adv='.';

mien='.';

}

printf("\n\n");

printf("Joueur : %c, a vous de jouer : \n\n",mien);



do

{

printf("entrer les coordonnées de votre points :\n ligne : ");

fflush(stdin);

scanf("%ld",&ligne);

printf(" colonne : ");

fflush(stdin);

scanf("%ld",&colonne);

}

while(ligne>taille || ligne<0 || colonne>taille || colonne<0 );



col = colonne ;

lig=ligne ;



//case a gauche



if (plat[lig-1][col-2]==adv)

{

do

{

col=col-1;

if(plat[lig-1][col-2]==mien)

{

colonne =
colonne - 1
;
/*le tableau commence à 0 */

ligne= ligne- 1;

plat[ligne][colonne]=mien;



for(i=0;
i<taille; i++)
/*boucle pour l'affichage du tableau avec son milieu*/

{

for(j=0; j<taille; j++)

{

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



}

printf("\n");

}

}

}

while ( plat[lig-1][col-2]==adv || plat[lig-1][col-2]==mien);

}



cpt = cpt + 1;

printf("\n\n");





}


while(cpt<taille*taille-4);
/*condition de fin de jeu*/



system("pause");

return 0;

}




si quelqu'un peut maider je lui en serait reconnaissant
-Vlado-
Messages postés
4
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
8 janvier 2005

de meme, jai un autre probleme (dans mes connaissances).

je cherche a faire une fonction (je crois que ca sappelle comme ca) de
facon a ne pas repeter a chaque fois la boucle pour l'affichage du
tableau c a d :



for(i=0; i<taille;
i++)
/*boucle pour l'affichge des abscisses*/

{

if(i==0)

{

printf(" %c ", i+49);

}

else

{

printf(" %c ", i+49);

}

}

printf("\n");





for(i=0; i<taille;
i++) /*boucle
pour l'affichage du tableau avec son milieu*/

{


if(i<9)
/*et des ordonnées*/

{

printf(" %ld ", i+1);

}

else

{

printf(" %ld ", i+1);

}





for(j=0; j<taille; j++)

{

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



}

printf("\n");

}



quelqun pourrait maider pour ce pb la aussi ? svp

-Vlado-
Messages postés
4
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
8 janvier 2005

de meme, jai un autre probleme (dans mes connaissances).

je cherche a faire une fonction (je crois que ca sappelle comme ca) de
facon a ne pas repeter a chaque fois la boucle pour l'affichage du
tableau c a d :



for(i=0; i<taille;
i++)
/*boucle pour l'affichge des abscisses*/

{

if(i==0)

{

printf(" %c ", i+49);

}

else

{

printf(" %c ", i+49);

}

}

printf("\n");





for(i=0; i<taille;
i++) /*boucle
pour l'affichage du tableau avec son milieu*/

{


if(i<9)
/*et des ordonnées*/

{

printf(" %ld ", i+1);

}

else

{

printf(" %ld ", i+1);

}





for(j=0; j<taille; j++)

{

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



}

printf("\n");

}



quelqun pourrait maider pour ce pb la aussi ? svp

-Vlado-
Messages postés
4
Date d'inscription
vendredi 7 janvier 2005
Statut
Membre
Dernière intervention
8 janvier 2005

oups dsl mauvaise manip dsl

pour le double post.

-Vlado-