Problème d'incrémentation de variable!

Problème d'incrémentation de variable! - C - Programmation

Marsh Posté le 04-05-2009 à 03:58:53    

Bonjour à tous et à toutes! Tout d'abord, merci de prendre du temps pour lire mon problème, qui sera pour vous très simple à résoudre je pense!
 
Alors voilà, j'ai créée une bataille navale, et tout fonctionne quasiment, excepté l'affichage "tel bateau est coulé", car je n'arrive pas à incrémenté une variable!
J'ai une fonction coup qui renvoit dans le main la valeur_retour (pour compter les cases qui restent dans la grille, et ainsi savoir si le jeu est fini ou non!)!
Tout fonctionne, mon problème est situé sur ce qui est en gras dans mon code :  
 

Code :
  1. int coup(char* joueur, char grille_joueur[27][27], char
  2. grille_adversaire[27][27], int taille) {
  3. char abscisse, ordonnee;
  4. int colonne, ligne, valeur_retour, continue_saisie, vidage,pa=0;
  5. while ((vidage=getchar())!='\n');
  6. do {
  7. printf("%s : saisissez votre coup ", joueur);
  8. abscisse = getchar();
  9. /*printf("%c", abscisse);*/
  10. ordonnee = getchar();
  11. /*printf("%c\n", ordonnee);*/
  12. colonne = valide_abscisse(abscisse);
  13. ligne = valide_ordonnee(ordonnee);
  14. continue_saisie = 1;
  15. if ((colonne != -1) && (ligne != -1))
  16. if (grille_joueur[ligne][colonne] == '.')
  17. continue_saisie = 0;
  18. else
  19. {
  20. printf("colonne vaut %d\n",colonne);
  21. printf("ligne vaut %d\n",ligne);
  22. printf("Coup deja joue\n" );
  23. }
  24. }
  25. while (continue_saisie);
  26. if (grille_adversaire[ligne][colonne] == '.') {
  27. grille_joueur[ligne][colonne] = 'o';
  28. printf("a l'eau !\n" );
  29. valeur_retour = 0;
  30. }
  31. else if (grille_adversaire[ligne][colonne] == 'P') {
  32. grille_joueur[ligne][colonne] = 'x';
  33. pa=pa+1;
  34. if (pa!=5){
  35. printf("Porte-avions touche %d !\n",pa);
  36. }
  37. else
  38. {
  39. printf("Porte-avions coule !\n" );
  40. }
  41. valeur_retour = 1;
  42. }
  43. else if (grille_adversaire[ligne][colonne] == 'C') {
  44. grille_joueur[ligne][colonne] = 'x';
  45. printf("Croiseur touche !\n" );
  46. valeur_retour = 1;
  47. }
  48. else if (grille_adversaire[ligne][colonne] == 'D') {
  49. grille_joueur[ligne][colonne] = 'x';
  50. printf("Destroyer touche !\n" );
  51. valeur_retour = 1;
  52. }
  53. else if (grille_adversaire[ligne][colonne] == 'S') {
  54. grille_joueur[ligne][colonne] = 'x';
  55. printf("Sous-marin touche !\n" );
  56. valeur_retour = 1;
  57. return valeur_retour;
  58. }


 
Voilà, à savoir que j'ai rentré les lettres des bateaux dans la grille du joueur pour savoir lequel était touché, maintenant j'aimerai pouvoir dire que le bateau est coulé! Seulement, la manière dont j'ai affecté la variable "pa" fait qu'à chaque fois que cette fonction coup est appelée, la variable "pa" retrouve sa valeur 0 par défaut.
 
A quel moment faut-il que je l'affecte à 0 pour qu'elle s'incrémente ensuite normalement? Faut-il faire une boucle quelque part?
J'arrive plus à réfléchir là, je sais que la réponse est toute bête, mais j'en peux plus, je m'en réfère à vos conseils avisés!
 
Merci d'avance pour votre réponse! :hello:

Message cité 1 fois
Message édité par vgiant le 04-05-2009 à 04:11:52
Reply

Marsh Posté le 04-05-2009 à 03:58:53   

Reply

Marsh Posté le 04-05-2009 à 09:27:06    

Il y a plusieurs solutions :
 
1. Déclarer la variable "pa" dans la fonction appelant la fonction coup() ; l'initialiser dans la fonction appelante ; la passer à la fonction coup() en paramètre en passant son adresse (donc avec "&" devant le nom) et la renseigner dans la fonction coup() (avec "*" devant le nom car ce serait un pointeur). C'est la meilleure solution, mais il existe aussi deux autres solutions :
2. Déclarer la variable "pa" en tant que variable "statique" dans la fonction au lieu de l'avoir déclaré avec l'option "auto" par défaut.
3. Déclarer la variable "pa" en dehors de la fonction de manière à ce que cette variable soit globale et l'initialiser dans la fonction appelante.

Reply

Marsh Posté le 04-05-2009 à 09:48:47    

Je n'y arrive toujours pas... J'ai essayer la déclaration globale de la variable, mais j'ai encore le soucis de savoir comment la mettre dans ma fonction, avec quel type de boucle et à quel moment l'initialiser pour qu'elle ne revienne pas à sa valeur d'initialisation à chaque appel de la fonction!!! Je craque!

Reply

Marsh Posté le 07-05-2009 à 12:16:35    

vgiant a écrit :

Tout fonctionne, mon problème est situé sur ce qui est en gras dans mon code :  


Ton code est incomplet


 
-------------- Build: Debug in hello ---------------
 
Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `coup':
C:\dev\hello\main.c:5: warning: implicit declaration of function `getchar'
C:\dev\hello\main.c:7: warning: implicit declaration of function `printf'
C:\dev\hello\main.c:12: warning: implicit declaration of function `valide_abscisse'
C:\dev\hello\main.c:13: warning: implicit declaration of function `valide_ordonnee'
C:\dev\hello\main.c:16: warning: suggest explicit braces to avoid ambiguous `else'
C:\dev\hello\main.c: At top level:
C:\dev\hello\main.c:2: warning: unused parameter 'taille'
C:\dev\hello\main.c: In function `coup':
C:\dev\hello\main.c:4: warning: 'valeur_retour' might be used uninitialized in this function
obj\Debug\main.o: In function `coup':
C:/dev/hello/main.c:12: undefined reference to `_valide_abscisse'
C:/dev/hello/main.c:13: undefined reference to `_valide_ordonnee'
C:\Program Files\CodeBlocks\MinGW\lib/libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
3 errors, 7 warnings



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed