Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercice] Bataille navale

Méthodes et questionnement

    17 octobre 2021 à 15:16:45

    Bonjour, ce topic est rédigé pour vous demander de l'aide

    Comme indiqué dans le titre, je me dois de réaliser une "Bataille navale" en c# (je n'ai pas trouvé de topic c# alors j'écris dans "php"...)

    Mise en condition/contexte
    ------------------------------

    J'ai déjà constitué un plateau comportant 100 cases (1 à 10, A à J), une implémentation a été faite pour faciliter l'affichage d'un résultat ( public enum Résultat -> "inconnu", "raté", "touché", "touchécoulé", "final"), une interface IContratDuJoueurDeBatailleNavale a été faite ainsi qu'une classe Coordonnées

    Je me dois par la suite d'implémenter une classe PartieDeBatailleNavale, dans celle-ci est demandée :

    - Un constructeur public avec 2 paramètres de type "ContratDuJoueurDeBatailleNavale"
    - Une propriété "Attaquant" de type IcontratDuJoueurDeBatailleNavale
    - Une propriété "Défenseur" de type IcontratDuJoueurDeBatailleNavale
    - Une méthode "ChoisirLesRôlesDeDépartDesJoueurs" : doit aléatoirement choisir l'attaquant et le défenseur en début de partie
    - Une méthode IntervertirLesRôlesDesJoueurs : doit échanger les rôles des joueurs, attaquant => défenseur et inversement
    - Une méthode PréparerLaBataille : demande simplement l'appel de la méthode pour chaque joueur

    - La méthode JouerLaPartie qui, dans l'ordre :
    _ Demande à l'attaquant de choisir les coordonnées du tir (ChoisirLesCoordonnéesDeTir, méthode dans l'interface)
    _ Demande au défenseur le résultat de ce tir (Défenseur_ExprimerLeRésultatTir, méthode dans l'interface)
    _ Demande à l'attaquant de gérer le retour de tir (Attaquant_GérerLeRésultatTir, méthode dans l'interface)
    _ Si le résultat n'est pas "Final", intervertir le rôle des joueurs
    _ Répéter les étapes de 1 à 5 jusqu'à ce que le résultat du tir soit "Final"
    _ Afficher le nom du gagnant

    Mon questionnement porte ainsi sur toutes les méthodes décrites ci-dessus, je ne parviens pas à les écrire et comprendre comment elles fonctionnent (pour l'énumération et l'interface c'est ok)
    Je recherche donc de l'aide pour me guider ou pour m'expliquer sur les méthodes que je dois écrire

    En vous remerciant d'avance !

    -
    Edité par StevenAlwick 17 octobre 2021 à 21:09:37

    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2021 à 18:07:21

      Bonjour,

      (note : j'ai supprimé les autres doublons, la prochaine fois poste sur Si votre message est considéré comme spam plutôt que de créer un nouveau sujet)

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Merci de modifier votre titre. Pour cela, éditez le premier message de votre sujet.

      (titre originel : Bataille navale)

      -
      Edité par Lamecarlate 17 octobre 2021 à 18:08:43

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        18 octobre 2021 à 10:42:57

        C# c'est du .NET, les admin. ont du faire le nécessaire pour la sortir du forum PHP, vraisemblablement.

        Ici, c'est .NET donc tout langage à "orientation" majoritairement .NET, dont le C#. (qui est le langage "flagship" de .NET)

        Question assez bizarre car la marche a suivre est extrêmement détaillée et le concept d'interface ( et même d'énumération dans une certaine mesure) est bien plus complexe que ce qui vous est demandé.

        Soit vous avez peut-être pas très bien compris ce qu'est une interface soit vous paniquez devant des choses assez simples.

        En gros, pour pas paniquer, à la louche :

        class PartieDeBatailleNavale
        {
        ...
            private IContratDuJoueurDeBatailleNavale m_joueur1;
            private IContratDuJoueurDeBatailleNavale m_joueur2;
        ...
            IcontratDuJoueurDeBatailleNavale Attaquant
            {
                get
                {
        ...
                }
            }
        
            IcontratDuJoueurDeBatailleNavale Défenseur
            {
                get
                {
        ...
                }
            }
        ...
            public PartieDeBatailleNavale(IContratDuJoueurDeBatailleNavale j1, IContratDuJoueurDeBatailleNavale j2)
            {
                m_joueur1 = j1;
                m_joueur2 = j2;
        ...
            }
        ...
            void ChoisirLesRôlesDeDépartDesJoueurs()
            {
        ...
            }
        ...
            void IntervertirLesRôlesDesJoueurs()
            {
        ...
            }
        ...
            void PréparerLaBataille()
            {
                m_joueur1.PréparerLaBataille();
                m_joueur2.PréparerLaBataille();
            }
        ...
            void JouerLaPartie()
            {
                do
                {
                    var res1 = Attaquant.ChoisirLesCoordonnéesDeTir(...);
                    var res2 = Défenseur.ExprimerLeRésultatTir(... res1, ...);
                    var res3 = Attaquant.GérerLeRésultatTir(... res2, ...);
        
                    if (res3!=Résultat.Final)
                    {
                        IntervertirLesRôlesDesJoueurs();
                    }
                }while(res3!=Résultat.Final)
            }
        }

        P.S.: Attention à la case, SVP.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          18 octobre 2021 à 12:19:22

          Je comprends mieux merci, je ne comprenais pas l’utilité de l’interface et je ne savais pas comment l’utiliser.


          Je me pose aussi une question sur la méthode IntervertirLesRôlesDesJoueurs, est-il nécessaire d’utiliser une autre variable pour faire une permutation, comme suit?


          public void IntervertirLesRôlesDesJoueurs() { if (this.Player1 == Attaquant && this.Player2 == Défenseur) { this.Player1 = Défenseur; this.Player2 = Attaquant; } else { this.Player1 = Attaquant; this.Player2 = Défenseur; } }
          La syntaxe est erronée mais j’espère que vous comprendrez quand même

          -
          Edité par StevenAlwick 18 octobre 2021 à 12:21:34

          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2021 à 13:23:58

            Attention, j'ai fait de "player" des champs, pas des propriétés.

            >une autre variable

            "Variable" ça veut tout et rien dire, soyez plus précis, SVP.

            Votre implémentation de "IntervertirLesRôlesDesJoueurs" est méga lourde.

            public void IntervertirLesRôlesDesJoueurs()
            {
                if (this.Player1 == Attaquant && this.Player2 == Défenseur) 
                {
                    this.Player1 = Défenseur;
                    this.Player2 = Attaquant;
                }
                else
                {
                    this.Player1 = Attaquant;
                    this.Player2 = Défenseur;
                }
            }

            vs.

            public void IntervertirLesRôlesDesJoueurs()
            {
                var tmp = Attaquant;
                Attaquant = Défenseur;
                Défenseur = tmp;
            }

            (je pense qu'une version LINQ de swap doit exister pour encore plus simplifier cette approche "naïve".)


            Et encore mieux, utiliser un état interne de qui est l'attaquant:

            public void IntervertirLesRôlesDesJoueurs()
            {
                m_Player1EstAttaquant = !m_Player1EstAttaquant;
            }

            Vous n'avez ensuite qu'à utiliser ce champ pour calculer dynamiquement qui est Attaquant et qui est Défenseur.


            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

            [Exercice] Bataille navale

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown