This commit is contained in:
johanleroy
2025-09-10 08:51:53 +02:00
parent 60e5db7ade
commit e68e378e7a
5 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
from RobotMobile import RobotMobile
class Aspirateur:
def __init__(self, marque, puissance):
self.marque = marque
self.puissance = puissance
@property
def marque(self):
return self._marque
@marque.setter
def marque(self, value):
if isinstance(value, str) and value:
self._marque = value
else:
print("Erreur : la marque doit être une chaîne non vide.")
self._marque = "Inconnu"
@property
def puissance(self):
return self._puissance
@puissance.setter
def puissance(self, value):
if isinstance(value, int) and value > 0:
self._puissance = value
else:
print("Erreur : la puissance doit être un entier positif.")
self._puissance = 1000
def __str__(self):
return f"Aspirateur {self.marque}, puissance={self.puissance}W"
# --- Aspirateur Robot ---
class AspirateurRobot(Aspirateur, RobotMobile):
def __init__(self, marque, puissance, distance_max):
# Initialisation RobotMobile avec type "Aspirateur robot"
RobotMobile.__init__(self, robot_type="Aspirateur robot", orientation="NORD", statut=1, abscisse=0, ordonnee=0)
Aspirateur.__init__(self, marque, puissance)
self.distance_max = distance_max
self._distance_parcourue = 0 # pour suivre le parcours
@property
def distance_max(self):
return self._distance_max
@distance_max.setter
def distance_max(self, value):
if isinstance(value, (int, float)) and value > 0:
self._distance_max = value
else:
print("Erreur : distance_max doit être positive.")
self._distance_max = 100
def __str__(self):
return (super(RobotMobile, self).__str__() + f"\nMarque : {self.marque}\n"
f"Puissance : {self.puissance}W")

69
Robots/Modele/Robot.py Normal file
View File

@@ -0,0 +1,69 @@
import random
import string
class Robot:
orientations_possibles = ["NORD", "EST", "SUD", "OUEST"]
statuts_possibles = {1: "EN SERVICE", 2: "HORS SERVICE", 3: "EN REPARATION"}
nb_robots_crees = 0
def __init__(self, robot_type="Générique", orientation="NORD", statut=1):
self._robot_type = "Générique"
self.robot_type = robot_type # Utilise le setter
self._numero_serie = self._generer_numero_serie()
self._orientation = orientation if orientation in Robot.orientations_possibles else "NORD"
self._statut = statut if statut in Robot.statuts_possibles else 1
Robot.nb_robots_crees += 1
# --- Robot type ---
@property
def robot_type(self):
return self._robot_type
@robot_type.setter
def robot_type(self, value):
if isinstance(value, str) and len(value) >= 2:
self._robot_type = value
else:
print("Erreur : robot_type doit contenir au moins 2 caractères. Valeur par défaut utilisée.")
self._robot_type = "Générique"
# --- Numero de série ---
@property
def numero_serie(self):
return self._numero_serie
def _generer_numero_serie(self):
lettres = ''.join(random.choices(string.ascii_uppercase, k=2))
chiffres = str(random.randint(0, 999999999)).zfill(10)
return lettres + chiffres
# --- Orientation ---
@property
def orientation(self):
return self._orientation
# --- Statut ---
@property
def statut(self):
return self._statut
@statut.setter
def statut(self, value):
if value in Robot.statuts_possibles:
self._statut = value
else:
print(f"Erreur : statut doit être 1, 2 ou 3. Valeur inchangée ({self._statut}).")
# --- Affichage ---
def __str__(self):
return (f"Robot {self.numero_serie} {self.robot_type}\n"
f"Statut : {Robot.statuts_possibles[self.statut]}\n"
f"Orientation : {self.orientation}")
# --- Tourner ---
def tourner(self, direction):
if direction not in [1, -1]:
print("Erreur : direction doit être 1 (horaire) ou -1 (anti-horaire).")
return
idx = Robot.orientations_possibles.index(self._orientation)
self._orientation = Robot.orientations_possibles[(idx + direction) % 4]

View File

@@ -0,0 +1,31 @@
from Robot import Robot
class RobotMobile(Robot):
def __init__(self, robot_type="Générique", orientation="NORD", statut=1, abscisse=0, ordonnee=0):
super().__init__(robot_type, orientation, statut)
self._abscisse = abscisse
self._ordonnee = ordonnee
@property
def abscisse(self):
return self._abscisse
@property
def ordonnee(self):
return self._ordonnee
def afficher_position(self):
return f"Position : [abs={self.abscisse} ; ord={self.ordonnee}]"
def avancer(self, m):
if self.orientation == "EST":
self._abscisse += m
elif self.orientation == "OUEST":
self._abscisse -= m
elif self.orientation == "NORD":
self._ordonnee += m
elif self.orientation == "SUD":
self._ordonnee -= m
def __str__(self):
return super().__str__() + f"\n{self.afficher_position()}"

30
Robots/main.py Normal file
View File

@@ -0,0 +1,30 @@
from Modele.Robot import Robot
from Modele.RobotMobile import RobotMobile
from Modele.Aspirateur import Aspirateur, AspirateurRobot
def test_robot():
print("=== Test Robot ===")
r = Robot()
print(r)
r.tourner(1)
print("Après rotation :", r)
def test_robot_mobile():
print("\n=== Test RobotMobile ===")
rm = RobotMobile(robot_type="Mobile")
print(rm)
rm.avancer(5)
print("Après avancée de 5 :", rm)
def test_aspirateur_robot():
print("\n=== Test AspirateurRobot ===")
ar = AspirateurRobot(marque="Dyson", puissance=7500, distance_max=100)
print(ar)
ar.avancer(10)
ar.tourner(-1)
print("Après déplacement et rotation :", ar)
if __name__ == "__main__":
test_robot()
test_robot_mobile()
test_aspirateur_robot()

View File