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 :

bataille navale, un projet bateau (haha)


Sujet :

C

  1. #1
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut bataille navale, un projet bateau (haha)
    Ami(e)s du C, bien le bonjour !

    Bien, j'ai un projet de bataille navale en C à faire.
    Pas d'interface graphique, pas de jeu contre l'ordi.

    Juste permettre à deux joueurs de jouer l'un contre l'autre.

    Je commence d'aujourd'hui, donc je n'en suis qu'à gérer chaque plateau (sous forme de tableau) et leur affichage.
    Mon code fonctionne quand je mets tout dans le main.
    Les problèmes arrivent quand je tente d'externaliser l'affichage dans une fonction. Voici donc 1) le code qui fonctionne. 2) Le code qui coince.

    Merci d'avance de me dire quelle(s) bévue(s) j'ai fait(es).

    Ceci fonctionne :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_LIGNES 11
    #define MAX_COL 11
     
    int main()
    {
        int x,y;
        char plateau1[MAX_LIGNES][MAX_COL];
        char abcisses[MAX_LIGNES]={'X','A','B','C','D','E','F','G','H','I','J'};
        char ordonnees[MAX_LIGNES]={'X','0','1','2','3','4','5','6','7','8','9'};
     
     
        //boucles d'initialisation plateau1
     
        for(x=0;x<MAX_LIGNES;x++){
            plateau1[0][x]=abcisses[x];
        }
        for(y=0;y<MAX_COL;y++){
            plateau1[y][0]=ordonnees[y];
        }
     
        for(x=1;x<MAX_LIGNES;x++){
            for(y=1;y<MAX_COL;y++){
                plateau1[x][y]='O';
            }
        }
     
        //Boucle d'affichage
        printf("\n");
        for(x=0;x<MAX_LIGNES;x++){
            printf("%c | ",plateau1[0][x]);
        }
        printf("\n- - - - - - - - - - - - - - - - - - - - - \n");
     
        for(x=1;x<MAX_LIGNES;x++){
            for(y=0;y<MAX_COL;y++){
                if(y==0){
                    printf("%c | ",plateau1[x][y]);
                }
                else{
                    printf("%c   ",plateau1[x][y]);
                }
            }
            printf("\n  | \n");
        }
        return 0;
    }
    Ceci coince :

    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
    71
    72
     
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_LIGNES 11
    #define MAX_COL 11
     
    //les prototypes des fonctions
    void affiche(char plateau[MAX_LIGNES][MAX_COL]);
     
    //Les variables globales.
    int x,y;
    char plateau1[MAX_LIGNES][MAX_COL],plateau2[MAX_LIGNES][MAX_COL];
    char abcisses[MAX_LIGNES]={'X','A','B','C','D','E','F','G','H','I','J'};
    char ordonnees[MAX_LIGNES]={'X','0','1','2','3','4','5','6','7','8','9'};
     
     
    //boucles d'initialisation plateau1
     
    for(x=0;x<MAX_LIGNES;x++){
        plateau1[0][x]=abcisses[x];
    }
    for(y=0;y<MAX_COL;y++){
        plateau1[y][0]=ordonnees[y];
    }
     
    for(x=1;x<MAX_LIGNES;x++){
        for(y=1;y<MAX_COL;y++){
            plateau1[x][y]='O';
        }
    }
     
    //boucles d'initialisation plateau2
     
    for(x=0;x<MAX_LIGNES;x++){
        plateau2[0][x]=abcisses[x];
    }
    for(y=0;y<MAX_COL;y++){
        plateau2[y][0]=ordonnees[y];
    }
     
    for(x=1;x<MAX_LIGNES;x++){
        for(y=1;y<MAX_COL;y++){
            plateau2[x][y]='O';
        }
    }
    int main()
    {
        affiche(plateau1);
     
        return 0;
    }
     
    void affiche( char plateau[MAX_LIGNES][MAX_COL]){
        printf("\n");
        for(x=0;x<MAX_LIGNES;x++){
            printf("%c | ",plateau[0][x]);
        }
        printf("\n- - - - - - - - - - - - - - - - - - - - - \n");
     
        for(x=1;x<MAX_LIGNES;x++){
            for(y=0;y<MAX_COL;y++){
                if(y==0){
                    printf("%c | ",plateau[x][y]);
                }
                else{
                    printf("%c   ",plateau[x][y]);
                }
            }
            printf("\n  | \n");
        }
     
    }

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Points : 169
    Points
    169
    Par défaut
    Es-tu sur d'avoir le droit de mettre des boucle FOR en global ?
    C'est à dire... hors fonction ? :p

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Oh merci mille fois rilou, c'était bien ça le problème.
    Ma variable plateau est déclarée en globale, mais il faut que je la tripote dans le main ou dans une autre fonction.

    Je ne coche pas "résolu" cependant, car je souhaite garder ce fil ouvert pendant toute la confection de mon projet.

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    oups, pardon, j'ai trouvé, un problème de faute de frappe dans mon code...

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Bon les choses avancent.

    Pourtant un problème me bloque régulièrement avec ces strings qui ne sont que des tableaux de caractères.

    J'ai un tableau de 4 directions initialisé ainsi.

    dir[4]={'N','S','E','O'};

    Je passe par une série de conditions qui fonctionne très bien mais dont je vous épargne les méandres, et chaque condition doit retenir un éventail différent de directions (NSE ou bien SO enfin bref); il faut donc redéfinir les valeurs de ce tableau dans chaque cas. Il ne prend pas la syntaxe dir="N E " ? Quelle est la bonne syntaxe pour "écraser une variable string" dirait-on en PHP ? J'ai un mal de chien à comprendre bien qu'ayant lu quelques tutos sur la question.

    edit

    J'ai fini par trouver que ceci marche

    dir[6]={'N','S','E','O'};
    dir[6]="N E ";

    Vous pouvez m'expliquer en détails que j'imprime un peu s'il vous plaît ?
    Je ne sais jamais quand il faut tenir compte de \0 de fin de chaîne ou non.

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    J'ai fini par trouver que ceci marche

    dir[6]={'N','S','E','O'};
    dir[6]="N E ";

    Vous pouvez m'expliquer en détails que j'imprime un peu s'il vous plaît ?
    Je ne sais jamais quand il faut tenir compte de \0 de fin de chaîne ou non.
    Si tu utilises des fonctions qui traitent des chaînes, il te faut un '\0' à la fin généralement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dir[6]={'N','S','E','O'};
    devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dir[6]={'N','S','E','O','\0'};
    en fait.

    Ajoute le '\0' automatiquement par contre.


    Jc

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Désolée mais ça ne fonctionne pas.

    Ni mon code précédent, ni le code que tu préconises.

    Cela compile, mais cela n'écrase pas mon ancienne chaîne.

    En clair

    dir[6]={'N','S','E','O','\0'};

    puis

    dir[6]="N O";

    puis

    printf("%s",dir);

    me renvoie "NSEO"

  8. #8
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Si ta déclaration est dir[6]="NSEO"; (j'ai simplifié ton truc) ensuite tu ne peux plus réaffecter une chaîne directement en faisant dir[6] = "xxx";
    Il faut soit que tu passes par strcpy, ou que tu modifies les caractères directement. Par exemple je sais que la lettre S est à l'indice 1 (c'est un tableau), donc pour modifer la chaîne en "N EO" je fais : dir[1] = ' ';

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Points : 169
    Points
    169
    Par défaut
    Rohhhh !!!

    En C, il est totalement impossible d'utiliser une chaine de caractère afin d'effectuer une affectation (eg. "blabla" ) hors initialisation de la variable !!!

    Afin d'initialiser un tableau de caractère (char[] ou char*) il te faut passer par la fonction STRCPY (voir man pour l'utilisation).

    Ou memcpy.

    En aucun cas tu n'as le droit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char t[50];
    t="blabla";
    Bonne chance

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Merci de vos réponses.
    Comme c'est une toute petite chaîne, j'ai appliqué cette méthode, ça tourne impec maintenant :

    donc pour modifer la chaîne en "N EO" je fais : dir[1] = ' ';

  11. #11
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Bonjour.

    J'avoue que je suis bien contente.

    J'ai fini la pose des bateaux pour les 2 joueurs sans laisser le moindre bug à ma connaissance. Tous les contrôles de saisie sont opérationnels. Cela remplit proprement deux tableaux. Je vais pouvoir attaquer la seconde partie. Il n'y a pas de raison qu'elle soit beaucoup plus compliquée. A mon avis le plus dur est fait. Il faut maintenant que je trouve comment alterner chaque tentative du joueur A vers B, et lycée de Versailles.



    Voici ma question :

    Quand le joueur 1 a fini sa pose de bateaux, je lui dis de presser f comme fin pour laisser le joueur suivant s'installer.

    Et là, dans l'idéal, j'aimerais fermer le premier écran, pour que le second joueur qui vient s'asseoir ne voit pas pas tous les bateaux posés par le joueur 1.

    Et en ouvrir un vierge.

    C'est y possible dans les librairies standard ?

    Le prof a donné des consignes assez claires
    Je corrigerai sous UNIX.

    Votre programme source C
    doit donc IMPERATIVEMENT être écrit en langage C normalisé
    et n'utiliser aucune syntaxe particulière(dialecte) d'un quelconque environnement.

    QUE DU C PUR !!!

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Et là, dans l'idéal, j'aimerais fermer le premier écran, pour que le second joueur qui vient s'asseoir ne voit pas pas tous les bateaux posés par le joueur 1.

    Et en ouvrir un vierge.

    C'est y possible dans les librairies standard ?
    Non. La seule solution est d'écrire sur l'écran un nombre de lignes vides suffisant pour envoyer l'affichage précédent dans les choux après les entrées du premier joueur.

Discussions similaires

  1. [Python 3.X] Projet de bataille navale
    Par clemissile dans le forum Tkinter
    Réponses: 38
    Dernier message: 22/04/2015, 16h44
  2. projet de bataille navale
    Par tropicthunder dans le forum Général Python
    Réponses: 1
    Dernier message: 22/04/2015, 16h26
  3. Bataille navale projet
    Par lorli911 dans le forum Général Python
    Réponses: 2
    Dernier message: 01/04/2015, 15h44
  4. Projet de bataille navale
    Par hichamtimberlake dans le forum C
    Réponses: 1
    Dernier message: 23/05/2009, 13h22
  5. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22

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