CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Problème exercice de Poo

Butan-2-ol
Butan-2-ol
Niveau 40
16 octobre 2021 à 14:25:26

Salut les kheys j'aurais besoin d'aide pour un exo de poo, je sais pas du tout si je vais dans le bon sens, voici l'énoncé et le code déjà fournit :

https://image.noelshack.com/fichiers/2021/41/6/1634386988-capture.png

class Voiture(object) :
    '''Classe définissant une voiture à partir de ses caractéristiques (marque, modèle, couleur).

Un objet, instance de cette classe, possède plusieurs méthodes :

    get_Position() : renvoie la position da voiture, tuple (x, y)
    get_Couleur() : renvoie la couleur de la voiture
    set_Couleur
    Demarre() : mets en route le moteur
    Avance() : l'objet avance
    Recule() : l'objet recule
    TourneGauche() : l'objet tourne à gauche
    TourneDroite() : l'objet tourne à droite'''

    
    def __init__(self, marque, modele, couleur):
        '''Méthode dédiée, constructeur de la classe'''
        
        from random import randint
        
        self.__marque = marque
        self.__modele = modele
        self.__couleur = couleur.capitalize()
        self.__position = (randint(0,40),randint(0,40))      # position de départ aléatoire
        self.__orientation = 'E'                             # véhicule orientée par défaut vers l'Est
        self.__etat_moteur = False                           # véhicule avec moteur éteint
        
        
    def set_Couleur(self, nouvelle_couleur):
        '''Méthode publique, change la couleur de la voiture en nouvelle_couleur'''
        assert isinstance(nouvelle_couleur, str), "La nouvelle couleur doit être définie comme une chaine de caractères."
        self.__couleur = nouvelle_couleur.capitalize()
    
    
    def get_Couleur(self):
        '''Méthode publique, renvoie la couleur de la voiture'''
        return self.__couleur
    
    
    def get_Marque(self) :
        '''Méthode publique, renvoie la marque de la voiture'''
        return self.__marque
    
    
    def get_Modele(self) :
        '''Méthode publique, renvoie le modèle de la voiture'''
        return self.__modele
    
    
    def get_Position(self):
        '''Méthode publique, renvoie la position de la voiture : tuple (x, y)'''
        return self.__position
    
    
    def __set_Position(self, position):
        '''Méthode privée, affecte la position de la voiture : tuple (x, y)'''
        self.__position = position
    
    
    def get_Orientation(self):
        '''Méthode publique, renvoie l'orientation de la voiture.'''
        return self.__orientation
    
    
    def __set_Orientation(self, orientation):
        '''Méthode privée, affecte l'orientation de la voiture : 'N', 'S', 'O' ou 'E'.'''
        self.__orientation = orientation
    
    
    def demarre(self) :
        '''Fait démarrer le moteur de la voiture.'''
        if not self.__etat_moteur :
            self.__etat_moteur = True
        else :
            print('Le moteur est déjà allumé.')
    
    
    def avance(self):
        '''Fait avancer la voiture d'une case.'''
        if self.__etat_moteur :
            mouvements = {'O' : (-1, 0),          # déplacement en x et y en fonction de l'orientation
                          'E' : (1, 0),
                          'N' : (0, -1),
                          'S' : (0, 1)}
            x, y = self.get_Position()
            dx, dy = mouvements[self.get_Orientation()]
            self.__set_Position((x + dx, y + dy))
        else :
            print("Le moteur n'est pas démarré.")
    
    
    def recule(self):
        '''Fait reculer la voiture d'une case.'''
        if self.__etat_moteur :
            mouvements = {'E' : (1, 0),          # déplacement en x et y en fonction de l'orientation
                          'O' : (-1, 0),
                          'N' : (0, -1),
                          'S' : (0, 1)}
            x, y = self.get_Position()
            dx, dy = mouvements[self.get_Orientation()]
            self.__set_Position((x - dx, y - dy))
        else :
            print("Le moteur n'est pas démarré.")
        
         
    def tourneGauche(self):
        '''Fait tourner la voiture à gauche : changement d'orientation et avancement d'une case.'''
        if self.__etat_moteur :
            change = {'N' : 'O',
                      'O' : 'S',
                      'S' : 'E',
                      'E' : 'N'}
            self.__set_Orientation(change[self.get_Orientation()])
            self.Avance()
        else :
            print("Le moteur n'est pas démarré.")
        
         
    def tourneDroite(self):
        '''Fait tourner la voiture à droite : changement d'orientation et avancement d'une case.'''
        if self.__etat_moteur :
            change = {'N' : 'E',
                      'O' : 'N',
                      'S' : 'O',
                      'E' : 'S'}
            self.__set_Orientation(change[self.get_Orientation()])
            self.Avance()
        else :
            print("Le moteur n'est pas démarré.")
        
         
    def __str__(self):
        '''Méthode dédiée, affiche des données de l'objet.'''
        affichage = 'Marque : ' + self.get_Marque() + '\nModèle : ' + self.get_Modele() + '\nCouleur : ' + self.get_Couleur()
        x, y = self.get_Position()
        
        return affichage

Voici le code que j'ai déjà écrit :

from usine_voiture import Voiture

Voiture1 = Voiture("Citroën", "C15", "Blanc")
Voiture2 = Voiture("Peugeot","208","Rouge")
Voiture3 = Voiture("Fiat","Multiplat","Rose")
Voiture4 = Voiture("Dacia","Duster","Marron")
Voiture5 = Voiture("Citroën","DS3","Jaune")

def deplacement(x,y):
    liste_voiture = [Voiture1,Voiture2,Voiture3,Voiture4,Voiture5]
    for i in range(len(liste)):
        if Voiture.get_Position(i) == (x,y):
            return liste_Voiture[i]
        else:
            pass
            
Suzuka_Nakamoto
Suzuka_Nakamoto
Niveau 10
16 octobre 2021 à 19:00:23

La première partie me parait juste. Tu appelle bien ton constructeur pour créer tes instances de Voitures.

Par contre pour la suite il manque une partie. Il te faut gérer le déplacement aléatoire de toutes les voitures et la récursion.
Je pense que tu dois pouvoir gérer tout ça à la place de ton "pass".
Aussi je pense qu'il te faudrai appeller la liste de tes véhicules en paramêtre de ta fonction déplacement.

Voila j'espère t'avoir aidé :)

Butan-2-ol
Butan-2-ol
Niveau 40
16 octobre 2021 à 21:55:09

Merci de ton aide, j'ai écrit ça :

from usine_voiture import Voiture

Voiture1 = Voiture("Citroën", "C15", "Blanc")
Voiture2 = Voiture("Peugeot","208","Rouge")
Voiture3 = Voiture("Fiat","Multiplat","Rose")
Voiture4 = Voiture("Dacia","Duster","Marron")
Voiture5 = Voiture("Citroën","DS3","Jaune")

from random import randint

def deplacement(x,y):
    cov1 = Voiture.get_Position(Voiture1)
    cov2 = Voiture.get_Position(Voiture2)
    cov3 = Voiture.get_Position(Voiture3)
    cov4 = Voiture.get_Position(Voiture4)
    cov5 = Voiture.get_Position(Voiture5)
    
    liste_co = [cov1,cov2,cov3,cov4,cov5]
    
    for i in range(len(liste_co)):
        if liste_co[i] == (x,y):
            return
        else:
            liste_co[i]= (randint(0,40),randint(0,40))
            print(liste_co[i])
    deplacement(x,y)

Bien que le code me semble plutôt correcte j'obtient une erreur qui me dit " RecursionError: maximum recursion depth exceeded while getting the repr of an object" en effet le code met trop de temps pour trouver aléatoirement les coordonnées misent en paramètres dans la fonction, que devrais-je faire ?

Jency21
Jency21
Niveau 6
16 octobre 2021 à 22:26:12

t'es censé utiliser les méthodes avance/recule/tourne gauche/droite

là ton code il téléporte les voitures aléatoirement sur la map

LGV
LGV
Niveau 28
17 octobre 2021 à 13:46:52

Pour elargir un tout petit peu par rapport á la problematique, je vois qu'il est ici question de "Voiture" dans un exercice de POO, donc certainement lié á un cours qui va avec. Et typiquement dans ces cours de POO, on va considerer une arborescence de specialisations par fonctionnalités.

Je ne peux que regretter que l'on continue d'enseigner la POO avec des classifications ; traditionnellement des "Vehicules" qu'on va diviser entre les trucs qui roulent (Voitures), les trucs qui volent (Avions) et les trucs qui flottent (Bateaux), puis les trucs qui roulent entre les Motos, Voitures et Camions, etc. Ou encore les Animaux qu'on divise en suivant leur classification biologique avec Mammiferes, Reptiles, etc.

Les classifications ne SONT pas de bons exemples de POO ! Une arborescence de specialisations par fonctionnalités ne se se modelise pas bien avec une hierarchie de classes. On tombe trop vite sur des cas hybrides qui ne rentrent bien dans aucune branche (le voiture amphibie qui roule mais flotte, l'hydravion qui vole mais se pose sur l'eau, l'ornithorynque qui est un mammifere mais qui pond des oeufs, etc.). Cela casse completement la modelisation, et il faut dupliquer, demoter ou sur-diviser des classes de facon arbitraire pour faire rentrer des choses bancales de force.

Cela se modelise bcp mieux avec une approche ECS, ou les vehicules ou animaux ne sont que des entités abstraites avec tres peu de donnees intrinseques et auxquelles on greffe des fonctionnalités sous forme de composants et de strategies.

C'est une mauvaise pratique que de deriver par fonctionnalités ; les bons exemples d'arborescence de classes sont souvent bcp plus abstraits (e.g. des widgets dans un framework d'interface).

Message édité le 17 octobre 2021 à 13:48:29 par LGV
Azerban
Azerban
Niveau 16
17 octobre 2021 à 14:50:35

Il est sympa ton prof mais le carré ne fait pas 40 unités de large mais 41 (il utilise la méthode randint(0, 40) pour générer un nombre aléatoire soit 41 nombres possibles donc 1681 coordonnées possibles (41 * 41)).

Considérant que la taille de la stack en Python est de 1000 et qu'il y a 5 voitures, ça veut dire que tu as 5000 tentatives pour trouver la bonne position parmi 1681. Tu peux la trouver de manière aléatoire mais ce n'est pas garanti honnêtement (tes voitures peuvent tourner en rond dans un coin du carré par exemple).

Bizarre comme exercice.

Tu peux à la limite augmenter la taille de la pile avec :

import sys

sys.setrecursionlimit(10_000)
Azerban
Azerban
Niveau 16
17 octobre 2021 à 14:59:54

@LGV

Les classes "classiques" et les mixins peuvent très bien s'imbriquer ensemble. Ça se fait beaucoup en développement Web avec Django par exemple ou une classe peut hériter du composant view (pour produire une réponse avec ses attributs, méthodes, etc) et d'un "mixin" qui lui greffe une ou plusieurs fonctionnalités supplémentaires (pour les permissions, l'authentification par exemple).

https://docs.djangoproject.com/fr/3.2/topics/class-based-views/mixins/

Pseudo supprimé
Pseudo supprimé 17 octobre 2021 à 15:57:00

Je rejoins entièrement LGV, quand est-ce qu'on arrêtera avec ces conneries de classe Chat, classe Guerrier, classe Voiture dans les cours de POO... :malade:

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment