Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bataille navale

Le retour !

    18 février 2016 à 12:54:42

    Bonjour tous le monde,

    Pour une projet d'école je doit réaliser une bataille navale en Python. Le jeu ne comprend pas d'IA.

    Voilà seulement je ne connais pas beaucoup ce langage.. J'ai commencer le tuto a ce sujet mais j'avoue être très rapidement largué..

    J'ai essayer quelque chose mais je ne sais pas si ce que je fais est bien.. Du moins le code ne retourne aucune erreurs a l'éxécution.

    Le projet: https://github.com/GotExx/bataillenavale

    Voici le code en question:

    #creation de la grille
    grille = []
    
    for x in range(10):
        grille.append(["o"] * 10)
    
    def affichage_grille(grille):
        for row in grille:
            print (" ".join(row))
    
    #Lancement + affichage grille
    print ("Lancement de la partie ! Bonne chance !")
    print ("---------------------------------------")
    affichage_grille(grille)
    
    #classe bateaux
    class bateaux:
    	#constructeur de la classe bateaux
        def __init__(self, nom, longueur, taille, coordonnéee_x, coordonnée_y, est_couler, direction):
            self.nom = nom
            self.longueur = longueur
            self.aille = taille
            self.coordonnée_x = coordonnées_x
            self.coordonnée_y = coordonnées_y
            self.est_couler = est_couler
            self.direction = direction
    
    #Classe porte-avion héritant de la classe bateaux
    class porte_avion(bateaux):
        
        #Un porte-avion se caractérise par son nom, sa quantité, sa taille et sa direction
        def __init__(self, nom, quantite, taille, direction):
            self.nom = "Porte-Avion"
            self.quantite ="1"
            self.taille ="5"
            self.direction = ""
            self.coordonnée_x = ""
            self.coordonnée_y = ""
    
    #Un cuirassé
    class cuirasse(bateaux):
        
        #Ses caractéristiques
        def __init__(self, nom, quantite, taille, direction):
            self.nom = "Cuirassé"
            self.quantite ="1"
            self.taille ="4"
            self.direction = ""
            self.coordonnée_x = ""
            self.coordonnée_y = ""
    
    #Un croisseur
    class croisseur(bateaux):
        
        #Ses caractéristiques
        def __init__(self, nom, quantite, taille, direction):
            self.nom = "Croisseur"
            self.quantite ="1"
            self.taille ="3"
            self.direction = ""
            self.coordonnée_x = ""
            self.coordonnée_y = ""
    
    #2 Torpilleurs
    class torpilleurs(bateaux):
        
        #Leurs caactéristiques
        def __init__(self, nom, quantite, taille, direction):
            self.nom = "Torpilleur"
            self.quantite ="2"
            self.taille ="2"
            self.direction = ""
            self.coordonnée_x = ""
            self.coordonnée_y = ""
            
    #2 Sous-marin
    class sous_marins(bateaux):
       
        #Leurs caractéristiques 
        def __init__(self, nom, quantite, taille, direction):
            self.nom = "Sous-Marin"
            self.quantite ="2"
            self.taille ="1"
            self.direction = ""
            self.coordonnée_x = ""
            self.coordonnée_y = ""
         
       #Accesseur get pour récupérer le nom
        def _get_nom(self):
            
            print("On accède au nom du bateau de la classe sous-marin")
            return self.nom



    J'aimerai avoir vos retours sur mes travaux si ce que j'ai fait est bien ou non.

    Merci d'avance a tous ceux qui prendrons de leur temps pour me répondre.

    Bonne journée

    -
    Edité par GotExx 18 février 2016 à 13:03:17

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2016 à 17:20:31

      Bonjour,

      suis pas trop expert en classe meme vraiment newbee en la matiere mais un truc me chiffonne :

      montre moi d'apres tes definitions de classe comment tu cree un objet ? un bateau, et par exemple un sous-marin ?

      • Partager sur Facebook
      • Partager sur Twitter
      http://sinclair.recreatedzxspectrum.com/index.php
      Anonyme
        18 février 2016 à 17:32:07

        plusieurs remarques en vrac:

        tu predns taille en arg, mais tu ne t'en sers pas. autant retirer ça.

        tu fais de l'héritage ... sans dire à python d'hériter. inutile donc. cf le cours

        stocker une quantité de bateaux dans la class elle même, c'est dégueu, autant faire plusieurs instances ;)

        tu fais des fonctions privées (elles commencent par '_') comme _get_nom(). tu pourras pas y accéder donc. du moins pas de l'extérieur

        • Partager sur Facebook
        • Partager sur Twitter
          19 février 2016 à 14:34:05

          Bonjour,

          Merci de vos retours sur mes travaux.

          @Yaalval: Oui je prend taille en arguments car il est différent en fonction du type de bateau donc a l'avenir je m'en servirai surement non ?

          Je ne comprend pas concernant l'héritage j'ai bien lu le chapitre et je dit bien a Python d'hériter la classe sous-marin de la classe bateau non ?

          Faire plusieurs instance d'une même classe ? Sa risque pas de faire un doublon ?

          La fonction _get_nom était simplement la pour test et j'avoue que je ne comprenais pas pourquoi cette dernière ne me retourner pas la valeur que je demander, merci pour m'avoir éclairer.

          Merci a bientôt

          -
          Edité par GotExx 19 février 2016 à 14:37:02

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            19 février 2016 à 14:48:33

            Hum ... oui et non. Tu en hérites, mais les méthodes de la class parente ne sont pas "mises" sur la class où tu veux faire l'héritage. Faut ajouter la méthode super() avec les bons arguments et tout (cf cour, partie héritage)
            • Partager sur Facebook
            • Partager sur Twitter
              19 février 2016 à 15:45:12

              C'est une spécificité py3 ça ? Car moi je peux très bien faire ça :

              class Test_main() :
                  def get_dict(self) :
                      return {self.name: self.value}
              
              class Test_second(Test_main) :
                  def __init__(self, name, value) :
                      self.name = name
                      self.value = value
              
              t = Test_second("b", 3)
              print t.get_dict()

              Par ailleurs, ne pas confondre le nommage des méthodes privées (bien qu'en python ça n'existe pas vraiment) ! Un seul _ permet d'accéder à la fonction, alors que deux non (du moins pas directement). Leur signification est quelque peu différente aussi.

              Par contre effectivement, c'est une erreur de conception d'utiliser un compteur dans chaque classe. L'intérêt de la POO, c'est de pouvoir faire plusieurs objets d'une même classe (outre les singletons).

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                19 février 2016 à 16:14:27

                Sauf qu'un singleton en Python est à bannir ;)

                Pour ce qui est du super(), je crois bien que c'est préférable à plus de 50% de le mettre

                • Partager sur Facebook
                • Partager sur Twitter
                  19 février 2016 à 16:40:10

                  Yaalval a écrit:

                  Sauf qu'un singleton en Python est à bannir ;)


                  Pourquoi? Un singleton c'est juste un objet qui ne peut avoir qu'une seule instance. Je ne vois pas en quoi c'est à bannir (d'ailleurs None est un singleton).

                  @Got: Ta classe Bateau (avec une majuscule pour respecter les conventions) ne sert pas à grand chose car dans la bataille navale tous les bateaux ont les mêmes méthodes/attributs. Seules les valeurs changent (donc pas besoin de créer une classe par catégorie). Ce qui est confirmé par la parfaite ressemblance de toutes tes classes. Un truc plus adapté serait:

                  class Bateau: 
                      def __init__(self, nom, taille):
                          self.nom = nom
                          self.taille = taille

                  Bon après je ne vois pas vraiment l'utilité de la POO dans ce cas. Une fois le bateau placé, il ne bouge plus (donc les attributs direction, coordonnee_x, coordonnee_y n'ont pas vraiment d'utilité à mon avis). Le seul intérêt serait pour leur destruction (de dire quel objet a été détruit). Mais ça me paraît compliqué pour pas grand chose o_O (en partant du principe que tu veux faire un jeu dans la console).

                  PS: on évite les accents dans les noms de variables ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    19 février 2016 à 17:11:24

                    Donc si je comprend le résonnement je devrais créer 2 objet dans la même classe:

                    #2 Sous-marin
                    class sous_marins(bateaux):
                       
                        #Sous-marin 1
                        def __init__(self):
                            self.id = 5
                            self._nom = "Sous-Marin 1"
                            self.taille = 1
                            self.direction = ""
                            self.coordonnée_x = ""
                            self.coordonnée_y = ""
                            
                        #Sous-marin 2
                        def __init__(self):
                            self.id = 5
                            self._nom = "Sous-Marin 2"
                            self.taille = 1
                            self.direction = ""
                            self.coordonnée_x = ""
                            self.coordonnée_y = ""



                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 février 2016 à 17:18:12

                      Bonjour,
                      T'es obligé d'utiliser les classes pour ton projet ?
                      Je pense qu'avant il faut que tu t'interesses à poser sur une feuille les caractéristiques de tes "bateaux" pour construire ta structure de donnees
                      • Partager sur Facebook
                      • Partager sur Twitter
                      http://sinclair.recreatedzxspectrum.com/index.php
                        19 février 2016 à 17:18:53

                        Non pas du tout, tu devrais uniquement créer une seule classe : Bateau. L'héritage est à utiliser quand tu veux plusieurs objets ayant des caractéristiques communes mais qui se comportent différemment. Dans ton cas, quelques soit ton bateau, il aura le même comportement : Il restera sur sa position jusqu'à se prendre des tirs et éventuellement couler. De ce fait, l'héritage ici n'est pas nécessaire.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 février 2016 à 17:52:54

                          @Dark_linux: Non je n'ai aucune contrainte vis a vis du développement hormis que je doit être en POO

                          @Jevanni: Une seule classe Bateau dans laquelle j'ajoute autemps d'objet qu'il y a de bateaux (sous-marin, croisseur etc..) ?

                          Merci de vos réponses :)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 février 2016 à 17:57:48

                            En fait, je ne comprends pas l’intérêt des classes sous-marins ? Tu ne devrais pas juste faire une classe bateaux et dans celle-ci définir le nom, la taille de chacun des bateaux ? 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 février 2016 à 18:00:15

                              Tu n'as pas compris la notion de classe. Une classe c'est juste un moule qui va te permettre de produire ton objet. Et pour le produire, il suffit juste de rajouter des () après le nom de la classe (ce qu'on appelle l'instanciation ou création d'instance). En bref, tu créé des instances de ta classe.

                              Si ça te paraît obscur, dis-toi que c'est ce que tu fais au quotidien dans python:

                              lst = list()  #Création d'une instance de la classe list
                              chn = str()  #instance de la classe str
                              chn_2 = "".join(["A", "B", "C"])  #instance de str
                              
                              lst_2 = "hello world".split()  #instance de list
                              
                              dico = {1: "bonjour", 2: "Tchao"}  #instance de dict


                              En permanence tu manipules des objets en python ^^. Donc pour ta classe Bateau (qui, encore une fois, me paraît inutile d'utiliser la POO) tu vas définir les caractéristiques communes à tous tes bateaux dans ta classe (ton moule) et ensuite tu lance la production ;):

                              class Bateau:
                                  def __init__(self, nom, taille, pos):
                                      self.nom = nom
                                      self.taille = taille
                                      self.pos = pos
                              
                              
                              #Création de portes-avions:
                              pa_1 = Bateau("porte-avion", 5, [0, 0])
                              pa_2 = Bateau("porte-avion", 5, [5, 10])
                              
                              #Cr&ation d'un sous-marin
                              ss_1 = Bateau("sous-marin", 2, [4, 2])
                              


                              Les attributs nom, taille et pos ne sont que des exemples. À toi de les choisir en fonction de tes idées, de la façon dont tu organises ton code, etc ...

                              Mais comme l'a dit Dark, il faut un minimum réfléchir avant de se lancer dans l'écriture de ton programme (feuilles et stylo :lol:)

                              -
                              Edité par Olygrim 19 février 2016 à 19:38:43

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Précepte: Le mieux est l'ennemi du bien

                              Bataille navale

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown