IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème d'incrémentation de variable!


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 44
    Par défaut Problème d'incrémentation de variable!
    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é entre les lignes de commentaires dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    int coup(char* joueur, char grille_joueur[27][27], char grille_adversaire[27][27], int taille)
    { 
       char abscisse, ordonnee; 
       int colonne, ligne, valeur_retour, continue_saisie, vidage, pa=0; 
       while ((vidage=getchar())!='\n');
       do 
       { 
          printf("%s : saisissez votre coup ", joueur); 
          abscisse = getchar(); 
          /*printf("%c", abscisse);*/ 
          ordonnee = getchar(); 
          /*printf("%c\n", ordonnee);*/ 
          colonne = valide_abscisse(abscisse); 
          ligne = valide_ordonnee(ordonnee); 
     
          continue_saisie = 1; 
          if ((colonne != -1) && (ligne != -1)) 
             if (grille_joueur[ligne][colonne] == '.') 
                continue_saisie = 0; 
             else 
            {
                printf("colonne vaut %d\n",colonne);
                printf("ligne vaut %d\n",ligne);
                printf("Coup deja joue\n"); 
             }
       } while (continue_saisie);
     
       if (grille_adversaire[ligne][colonne] == '.')
       { 
          grille_joueur[ligne][colonne] = 'o'; 
          printf("a l'eau !\n"); 
          valeur_retour = 0; 
       }
       else if (grille_adversaire[ligne][colonne] == 'P')
             { 
                 grille_joueur[ligne][colonne] = 'x';
     
    /*-------------Le problème est ici ----------------------------*/
                 pa=pa+1;
                 if (pa!=5)
                 {
                     printf("Porte-avions touche %d !\n",pa);
                 }
                 else
                 {
                     printf("Porte-avions coule !\n");
                  }
    /*-----------------------------------------------------------*/
                 valeur_retour = 1;
             }
             else if (grille_adversaire[ligne][colonne] == 'C') 
                   { 
                      grille_joueur[ligne][colonne] = 'x'; 
                      printf("Croiseur touche !\n"); 
                      valeur_retour = 1; 
                   }
                   else if (grille_adversaire[ligne][colonne] == 'D') 
                         { 
                             grille_joueur[ligne][colonne] = 'x'; 
                             printf("Destroyer touche !\n"); 
                             valeur_retour = 1; 
                          }
                          else if (grille_adversaire[ligne][colonne] == 'S')
                               { 
                                   grille_joueur[ligne][colonne] = 'x'; 
                                   printf("Sous-marin touche !\n"); 
                                   valeur_retour = 1; 
                                }  
       return valeur_retour; 
    }
    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!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Il faudrait déclarer pa en dehors de la méthode, car là c'est une variable locale, donc elle est "détruite" au niveau du return.

    [edit]
    Sinon tu as aussi la possibilité de déclarer ta variable en static : http://c.developpez.com/faq/?page=variables#VARS_static

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static int pa = 0;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 44
    Par défaut
    J'ai essayé de la déclarer en dehors de la méthode, mais il doit y avoir quelque chose que je fais mal, car cela me donne le même résultat, la variable retrouve sa valeur d'affectation de base...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 44
    Par défaut
    Quand à la méthode static, j'ai également essayé, ça pourrait marcher, mais j'ai deux soucis:

    - elle ne permet pas de différencier si le bateau touché appartient au joueur 1 ou 2 (qui marche avec un pointeur)
    - elle ne redémarre pas à zéro si une partie est relancée

    Arf, je sens que je vais pas y arriver!

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    J'ai pas trop compris le rôle de ta variable, mais si c'est une donnée spécifique au joueur, dans ce cas pourquoi ne pas déclarer une structure "joueur" ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 44
    Par défaut
    En fait, le rôle de ma variable serait simplement un compteur! Je vais regarder des cours en ce qui concerne les structures, je connais pas du tout, je suis débutant

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct joueur {
        char *nom;
        int pa;
    };
    puis dans ton main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    joueur* joueur1 = malloc(sizeof(joueur));
    joueur* joueur2 = malloc(sizeof(joueur));
    Puis ta fonction devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int coup(joueur* joueur, char grille_joueur[27][27], char grille_adversaire[27][27], int taille) {
        // le traitement normal, mais pour acceder au nom :
        printf("%s : saisissez votre coup ", joueur->nom); 
     
        // et le pa :
        joueur->pa = joueur->pa + 1;
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 44
    Par défaut
    Merci pour ton aide!

    En fait, j'ai tout refais et déclaré la variable dans la méthode, et maintenant ça fonctionne!
    Je ne sais pas ce qui ne marchait pas tout à l'heure, le c, ça peut vraiment rendre fou parfois!!!

Discussions similaires

  1. [XQUERY] problème d'incrémentation de variable
    Par amelbtb dans le forum XQUERY/SGBD
    Réponses: 3
    Dernier message: 29/05/2012, 14h57
  2. [XL-2003] Problème d'incrémentation de variable
    Par Sanegone67 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/08/2011, 14h11
  3. problème d'incrémentation de variable
    Par kayenne77 dans le forum Débuter
    Réponses: 2
    Dernier message: 09/03/2009, 22h54
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo