Problem dans un jeu de tennis dans C

Résolu/Fermé
amine2610 Messages postés 9 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 23 décembre 2008 - 1 déc. 2007 à 21:32
 Laul - 14 avril 2008 à 11:50
Bonjour,
j'ai voulu écrire un programme de simmulation de scoring d'un match de tennis.
c'est ca mon programme en C, j'ai compilé et ca bien marché, l problem, C'est que lorsque l joueur 2 gagne un set, et commence dans l 2eme set, c'est comme si il na gagné aucun set:
#include <stdio.h>
#include <conio.h>
main()
{
int B1=0, B2=0,P1=0,P2=0,S1=0,S2=0;
char C;

while ((S1<3)&&(S2<3))
{
do
{printf("Donner le joueur qui a marque : \n");
scanf("%s",&C);
if(C=='1')
{
if(B1<40)
{if(B1<=15) {B1+=15; printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
else if(B1==30) {B1=40;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}

else if(B1==40)
{if(B2<40) {B1=0; P1++;B2=0;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
else if(B2==40) {B1=45;printf("joueur1 : %d %d AV \njoueur2 :%d %d %d\n",S1,P1,S2,P2,B2);}
else if(B2==45) {B2=40;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}

else if(B1==45)
{B1=0; P1++; B2=0;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}


}
else if(C=='2')
{
if(B2<40)
{if(B2<=15) {B2+=15;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
else if(B2==30) {B2=40;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}

else if(B2==40)
{ if(B1<40) {B2=0; P2++; B1=0;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
else if(B1==40) {B2=45;printf("joueur1 : %d %d %d \njoueur2 :%d %d AV\n",S1,P1,B1,S2,P2,B2);}
else if (B1==45) {B1=40;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}

else if(B2==45)
{B2=0; P2++; B1=0;printf("joueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}

} while((( (0<=P2 - P1)&&(P2-P1<2) )||( (0<=P1-P2)&&(P1-P2)<2) )||((P2<6)&&(P1<6)));

if(P2>P1) {P2=0; P1=0; S2++;printf("\nLE JOUEUR 2 A GAGNE LE JEU\n\njoueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
if(P1>P2) {P2=0; P1=0; S1++;printf("\nLE JOUEUR 1 A GAGNE LE JEU\n\njoueur1 : %d %d %d \njoueur2 :%d %d %d\n",S1,P1,B1,S2,P2,B2);}
}
if(S1==3) printf("LE JOUEUR 1 A GAGNE");
else if(S2==3) printf("LE JOUEUR 2 A GAGNE");
}


SVP si quelqu'un peu m'aidé a trouvé l problem
A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
1 déc. 2007 à 22:27
Salut,

En fait tu as fait du buffer overflow sans le savoir. Je t'explique :
Tu utilises char C; et tu demandes à l'utilisateur : scanf("%s",&C). Le %s est utilisé pour les char*.
Ainsi, le programme va stocker le caractère donné par l'utilisateur dans C, \n et le \0 vont déborder et le \0 (qui vaut 0) va déborder pour s'écrire finalement dans la variable la plus proche dans le tampon, à savoir S2 (dernière variable locale déclarée). Du coup, ta variable est remise à 0 à chaque entrée de l'utilisateur.

Niveau correction :
Solution propre
Au lieu de mettre char C, tu mets int C; tu utilises des scanf("%d", &C) et dans les if(C=='2"), tu mets des if(C==2) à la place. De même pour C==1.

Solution très rapide (mais moche) ^^
Tu déclares une autre variable, par exemple int S3=0; Variable qui sert à rien, mais ton erreur de buffer overflow sera reporté dessus.


Cdt ;)
0
amine2610 Messages postés 9 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 23 décembre 2008
3 déc. 2007 à 22:22
MERCI BEAUCOUP,
c'est vraiment trés gentille,
ca march
0
bonjour,

J'ai télécharger la démo de tennis titans et j'ai vu sur un site que c'était en fait le jeu en entier qu'on avait et qu'il suffisait de récupérer un code sur le site de l'éditeur... mais je ne trouve rien
quelqun peut m'aider svp?
0