Bataille navale en langage C
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Bataille navale en langage C



  1. #1
    hadri1gond

    Bataille navale en langage C


    ------

    Bonsoir,

    Je suis un élève en ING1 et j'ai un problème sur un projet que l'on doit réaliser en informatique. On doit réaliser une bataille navale en C et je n'arrive pas à positionner mes bateaux sur la grille 15x15 que j'ai créée. On nous demande de positionner au hasard les bateaux sur la grille. Si vous pouviez m'aider ca serait super !! Merci d'avance !!

    Mon main:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      int accueil,pretpourpartie, choix, i=0;
    
      printf("\t\t=== Accueil ===\n");
      printf("\t\t===============\n\n");
      printf("\t1. Jouer une partie a deux joueurs\n");
      printf("\t2. Jouer contre l'ordinateur\n");
      printf("\t3. Aide\n");
      printf("\t4. Quitter\n\n");
      scanf("%d", &accueil);
      printf("\n");
    
      switch (accueil)
      {
        case 1: // choisis de faire une partie a deux joueurs
           printf("Vous avez choisi de jouer a deux joueurs ! Que le meilleur gagne !!\n\n");
           tableau('cases');
           printf("\n\n");
           parametre_bateau();
           break;
    
        case 2: // choisis de jouer contre l'ordinateur
           printf("Vous avez choisi de jouer contre l'ordinateur ! Bonne chance!!\n\n");
           tableau('cases');
           break;
    
        case 3: // affiche les regles
           printf("Voici les regles du jeu :\n\n");
           printf("Chaque joueur (humain et ordinateur) joue a tour de role. Bien entendu, un joueur ne doit pas voir les grilles de son adversaire : seules les grilles du joueur en cours sont affichees. A chaque tour de jeu, les joueurs peuvent choisir l'une des 2 actions suivantes sur un seul navire de leur choix de la grille numero 1, en choisissant les coordonnees de l'une des cases du navire :\n\n \t(1) Tirer.\n\n Le joueur tire en choisissant les coordonnees d'une case valide de l'adversaire (grille numero 2). Chaque destroyer n'est muni que d'une seule fusee eclairante. Le premier tir d'un destroyer devoile un carre de 4*4 cases dans la grille adverse a partir du coin haut et gauche. Mais attention, les navires adverses de ce carre ne seront visibles que lors du tour du jeu (quelques secondes). Pour couler un navire, il faut avoir touche toutes les cases qu'il occupe : un cuirasse est plus resistant qu'un simple destroyer, les sous-marins ne peuvent etre coules que par d'autres sous-marins. Dans ce cas, le navire adverse coule disparait et la case touchee s'affiche sur la grille numero 2.\n\n \t(2) Deplacer le navire d'une seule case sauf s'il est touche.\n\n Un navire ne peut pas se deplacer en diagonale. Il ne peut se deplacer que dans sa direction horizontale ou verticale, et d'une seule case a la fois, et le point cardinal de deplacement (est ou ouest s'il est horizontal, nord ou sud s'il est vertical). Evidemment, en cas d'obstacle (case de deplacement occupee par un autre navire ou le bord de la grille), un navire ne pourra pas effectuer son déplacement et devra tenter une nouvelle action. A chaque tour de jeu, il faudra visualiser l'action, les coordonnees et le type du navire choisis par l'ordinateur\n\n");
           printf("Vous sentez vous pret pour commencer une partie ?\n");
           scanf("%d", &pretpourpartie);
           if (pretpourpartie==1)
           {
               printf("Voulez vous jouer contre un ami ou contre l'ordinateur ? : choisissez 1 ou 2 \n\n");
               scanf("%d", &choix);
               printf("\n");
               if (choix==1)
               {
                   printf("Vous avez choisi de jouer a deux joueurs ! Que le meilleur gagne !!\n\n");
                   tableau('cases');
               }
               else if (choix==2)
               {
                   printf("Vous avez choisi de jouer contre l'ordinateur ! Bonne chance!!\n\n");
                   tableau('cases');
                   casestouchees('cases');
    
               }
           }
           else if (pretpourpartie==0)
           {
               printf("Prenez votre temps pour lire et comprendre les regles du jeu !\n");
           }
           break;
    
        case 4: // affiche au revoir si le joueur quitte le jeu
            system("clear");
           break;
      }
      printf("\n\n");
      return 0;
    }



    Ma fonction tableau :

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    void tableau(cases)
    {
            int lettres=1, i=0, j;
            int b=0;
            for (b=0;b<2;b++)
            {
                printf(" ");
                for (i=0; i<15;i++)
                {
                    printf("\xDD");
                    if (i<10)
                       {
                           printf(" ");
                       }
                    printf("%d", i);
    
                }
                printf("\xDD");
                printf("       ");
            }
            printf("\n");
            for(j = 0; j < 15; j++)
            {
                printf(" ");
                for(b=0;b<2;b++)
                {
                    for(i = 0; i < 15; i++)
                    {
                        printf("\xDD");
                        printf("--");
                    }
                    printf("\xDD        ");
                }
                printf("\n");
                printf("%c",intToChar(j));
                for(i = 0; i < 16; i++)
                {
                    printf("\xDD");
                    printf("  "); // mettre fonction qui prend les parametre de la case et qui donne une chaines de caractere qui donne les bateaux.
                }
                printf("     ");
                printf("%c",intToChar(j));
                for(i = 0; i < 16; i++)
                    {
                        printf("\xDD");
                        printf("  "); // mettre fonction qui prend les parametre de la case et qui donne une chaines de caractere qui donne les bateaux.
                    }
                printf("\n");
            }
            printf(" ");
            for (b=0;b<2;b++)
            {
                for(i = 0; i < 15; i++)
                {
                    printf("\xDD");
                    printf("--");
                }
                printf("\xDD");
                printf("        ");
             }
            return 0;
    }
    
    char intToChar1(int number)
    {
        char test[27] = "abcdefghijklmnopqrstuvwxyz";
        return test[number];
    }

    Et pour le positionnement des bateaux j'ai essayé de faire comme ca :

    Code:
    #include "parametre-bateau.h"
    #include <time.h>
    
    int parametre_bateau(int coordonnee_bateau, int x, int y)
    {
        int type_bateau;
        int i=0, xdebut=0, ydebut=0, xfin=0, yfin = 0;
        srand(time(NULL));
        while (xdebut!=xfin || ydebut!=yfin)
        {
                xdebut = rand()%15;
                printf("%d", xdebut);
                ydebut=rand()%15;
                printf("%d", ydebut);
                xfin = rand()%15;
                printf("%d", xfin);
                yfin=rand()%15;
                printf("%d", yfin);
        }
        return 0;
    }
    
    char intToChar2(int number)
    {
        char test[27] = "abcdefghijklmnopqrstuvwxyz";
        return test[number];
    }

    -----
    Dernière modification par JPL ; 18/11/2017 à 22h18. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    albanxiii
    Modérateur

    Re : Bataille navale en langage C

    Bonjour,

    Tout le monde gagnerait du temps si vous disiez quel est votre problème exactement. Que fait votre programme, quelles sont les sorties ? Que devrait-il faire ?

    Au passage,
    Code:
    char intToChar2(int number)
    {
        char test[27] = "abcdefghijklmnopqrstuvwxyz";
        return test[number];
    }
    Que se passe-t-il si j'appelle
    Code:
    char intToChar2(27)
    ?
    Not only is it not right, it's not even wrong!

  3. #3
    hadri1gond

    Re : Bataille navale en langage C

    Le problème c'est que j'arrive à afficher ma grille mais je n'arrive pas à faire apparaître les bateaux (que l'on représente avec des lettres ou autres caractères) dedans ... Je ne vois pas comment faire pour que les bateaux apparaissent. Pour le intToChar2(27) ca affiche les lettres de l'alphabet parce que dans la grille les lignes c'est des chiffres et les colonnes sont des lettres sur une grille 15*15

  4. #4
    Jack
    Modérateur

    Re : Bataille navale en langage C

    Je ne comprends pas comment ça pourrait afficher quoique ce soit, vu que ton programme ne peut pas franchir l'étape de la compilation:
    Code:
      
    switch (accueil)
    {
        case 1: // choisis de faire une partie a deux joueurs
           printf("Vous avez choisi de jouer a deux joueurs ! Que le meilleur gagne !!\n\n");
           tableau('cases');
           printf("\n\n");
           parametre_bateau();
           break;
    les quotes ou apostrophes (') ne permettent d'encadrer qu'un seul caractère. Pour les chaines, ce sont des guillemets (").
    la fonction paramètre_bateau attend 3 paramètres que tu ne fournis pas.

    Je n'ai pas regardé le reste du coup.

  5. A voir en vidéo sur Futura
  6. #5
    hadri1gond

    Re : Bataille navale en langage C

    si ca marche mais c'est juste que pour ma fct parametre_bateau ca n'affiche rien. Du coup ca veut dire que je dois ecrire parametre_bateau("coordonnee_b ateau, x, y") ?
    Dernière modification par hadri1gond ; 19/11/2017 à 18h00.

  7. #6
    Jack
    Modérateur

    Re : Bataille navale en langage C

    Non ça ne marche pas. En tout cas si le code est celui que tu as fourni plus haut, les erreurs que j'ai marquées en rouge vont empêcher de générer un exécutable.

    Quel compilateur utilises-tu?

  8. #7
    hadri1gond

    Re : Bataille navale en langage C

    ah bon ? ben c'est bizarre moi sur CodeBlocks là ca marche

  9. #8
    Jack
    Modérateur

    Re : Bataille navale en langage C

    zippe ton projet et mets-le en PJ. Je dois avoir une machine virtuelle quelque part avec C::B installé

  10. #9
    hadri1gond

    Re : Bataille navale en langage C

    j'ai pas winzip

  11. #10
    Jack
    Modérateur

    Re : Bataille navale en langage C

    Tu utilises encore windows XP?
    Parce que depuis Windows Vista, Windows compresse nativement les fichiers et dossiers.

  12. #11
    pm42

    Re : Bataille navale en langage C

    Et sinon, 7-zip est gratuit et efficace.

  13. #12
    hadri1gond

    Re : Bataille navale en langage C

    je suis sur windows 10

  14. #13
    Jack
    Modérateur

    Re : Bataille navale en langage C

    Tu fais un clic droit sur ton dossier, puis "Envoyer vers"->"Dossier compressé".
    Dernière modification par Jack ; 19/11/2017 à 20h11.

  15. #14
    hadri1gond

    Re : Bataille navale en langage C

    voila c'est bon
    Fichiers attachés Fichiers attachés

  16. #15
    hadri1gond

    Re : Bataille navale en langage C

    par contre prend juste le main la fct tableau et la fct parametre_bateau le reste c'est des trucs que j'ai essayé de faire mais je les ai pas encore enlevés

  17. #16
    Jack
    Modérateur

    Re : Bataille navale en langage C

    J'ai fait un "rebuild" de ton projets: 14 warnings, dont un grand nombre portant sur les problèmes que j'avais cités.

    Tu as de la chance que les options courantes de code::Blocks soient réglées avec un niveau de tolérance très permissif parce que normalement ça n'aurait jamais du passer.
    J'utilise Visual Studio d'habitude, et les warnings apparaissaient en erreur.

    De toutes manières, tu devrais t'habituer à ne jamais laisser un seul warning apparaître. Donc, lorsque tu les auras tous faits disparaître, peut-être que ton programme commencera à fonctionner.

    Je te recommande également l'utilisation du débogueur de C::B. Ainsi, tu verras dans le détail le déroulement du programme et la valeur des variables

    PS: C::B ne m'a généré aucun exécutable

  18. #17
    polo974

    Re : Bataille navale en langage C

    là,
    Code:
        int i=0, xdebut=0, ydebut=0, xfin=0, yfin = 0;
         srand(time(NULL));
         while (xdebut!=xfin || ydebut!=yfin)
         ...
    y a rien qui te choques ? ? ?
    Jusqu'ici tout va bien...

  19. #18
    hadri1gond

    Re : Bataille navale en langage C

    polo je savais trop comment m'y prendre donc j'ai essayé un truc mais je me doutais que ca marcherai pas. c'est un peu pour ca que je demande de l'aide. mais oui je vois bien ce qui te choque.

  20. #19
    Jack
    Modérateur

    Re : Bataille navale en langage C

    Et du coup, ça compile sans warnings ni erreurs?

  21. #20
    Jack
    Modérateur

    Re : Bataille navale en langage C

    plus de son, plus d'image ...

  22. #21
    Chanur

    Re : Bataille navale en langage C

    hadri1gond, commence par corriger les warnings : certains sont des erreurs. Ce n'est parce que le compilateur est capable de choisir une interprétation qu'il a raison. Quand je compile ton machin j'obtiens ça :
    Code:
    casestouchees.c: In function ‘casestouchees’:casestouchees.c:50:9: attention : ‘return’ with a value, in function returning void [enabled by default]
    casestouchees.c:8:13: attention : unused variable ‘lettres’ [-Wunused-variable]
    tab.c: In function ‘TAB_’:
    tab.c:13:9: attention : statement with no effect [-Wunused-value]
    tab.c:19:9: attention : format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
    tableau1.c: In function ‘tableau’:
    tableau1.c:38:13: attention : implicit declaration of function ‘intToChar’ [-Wimplicit-function-declaration]
    tableau1.c:64:9: attention : ‘return’ with a value, in function returning void [enabled by default]
    tableau1.c:6:13: attention : unused variable ‘lettres’ [-Wunused-variable]
    main.c: In function ‘main’:
    main.c:21:8: attention : implicit declaration of function ‘tableau’ [-Wimplicit-function-declaration]
    main.c:21:16: attention : constante caractère trop longue pour son type [enabled by default]
    main.c:23:8: attention : implicit declaration of function ‘parametre_bateau’ [-Wimplicit-function-declaration]
    main.c:28:16: attention : constante caractère trop longue pour son type [enabled by default]
    main.c:44:24: attention : constante caractère trop longue pour son type [enabled by default]
    main.c:49:24: attention : constante caractère trop longue pour son type [enabled by default]
    main.c:50:16: attention : implicit declaration of function ‘casestouchees’ [-Wimplicit-function-declaration]
    main.c:50:30: attention : constante caractère trop longue pour son type [enabled by default]
    main.c:6:38: attention : unused variable ‘i’ [-Wunused-variable]
    Effectivement, il produit un exécutable ...
    Mais les "implicit déclaration ..." et les "constantes caractère trop longues ...", etc. c'est n'importe quoi.

    Quand je l'exécute, il affiche un tableau crado. Il a fallut que je remplace les \xDD par des | pour que ce soit potable. N'utilise pas des codes en dur : ce n'est pas portable.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  23. #22
    bisou10

    Re : Bataille navale en langage C

    Il FAUT suivre le conseil de @Jack : AUCUN warning. Les warnings sont parfois ignorés par les développeurs expérimentés qui utilisent un fonctionnement spécifique , voire après un portage (bien que perso, je ne vois aucune excuse pour laisser malgré tout un seul warning).

Discussions similaires

  1. Bataille navale basique en C pb avec une fonction
    Par invitefcbfa8c4 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 09/06/2011, 18h18
  2. Construction navale
    Par vasamena dans le forum Technologies
    Réponses: 9
    Dernier message: 11/12/2009, 23h15
  3. Architecture navale
    Par invite219b5edc dans le forum Orientation après le BAC
    Réponses: 4
    Dernier message: 16/06/2009, 17h27
  4. construction navale
    Par invitef43091d4 dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 03/02/2008, 09h37
  5. navale ou agro?
    Par invite9c31737d dans le forum Orientation après le BAC
    Réponses: 0
    Dernier message: 15/08/2005, 21h29