Menu
CoddyTech

Service de location de véhicules

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 65 sur 65.

challenge icon

Défi

Moyen

Construisez un service de location de véhicules : des véhicules de deux types, des locations et l’agence qui gère les deux. Les prix sont exprimés en dollars entiers (int).

Vehicle dans vehicle.gd :

  • Le constructeur prend vin, make, model et daily_rate ; available vaut initialement true.
  • start_rental() -> bool : renvoie false lorsque le véhicule n’est pas disponible ; sinon, le marque comme indisponible et renvoie true.
  • end_rental() le rend à nouveau disponible.
  • _to_string() renvoie MAKE MODEL (VIN: VIN) - Available, ou - Rented à la fin.

Car dans car.gd et Motorcycle dans motorcycle.gd étendent Vehicle. Leurs constructeurs prennent les quatre valeurs du véhicule ainsi que seats (voiture) ou engine_size (moto). Leur _to_string() s’appuie sur le texte de la classe parente : Car: + le texte du véhicule + - 5 seats, et Motorcycle: + le texte du véhicule + - 600cc.

Rental dans rental.gd :

  • Le constructeur prend rental_id, l’objet vehicle, customer_name et days ; is_active vaut initialement true.
  • calculate_cost() -> int : le tarif journalier multiplié par le nombre de jours.
  • end_rental() -> bool : false pour une location déjà terminée ; sinon, la termine, termine la location du véhicule et renvoie true.
  • _to_string() : Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, ou - Completed.

RentalAgency dans rental_agency.gd :

  • Le constructeur prend agency_name. vehicles est un dictionnaire associant chaque VIN à un véhicule, rentals un dictionnaire associant chaque identifiant de location à une location, et next_rental_id commence à 1.
  • add_vehicle(vehicle) stocke un véhicule sous son VIN.
  • rent_vehicle(vin, customer_name, days) -> String : renvoie "" si le VIN est inconnu, si la durée est inférieure à 1 jour ou si le véhicule n’est pas disponible. Sinon, la location du véhicule commence, une instance de Rental est créée avec l’identifiant R1, R2... (le compteur n’augmente qu’en cas de location réussie), puis stockée, et l’identifiant est renvoyé.
  • return_vehicle(rental_id) -> bool : renvoie false si l’identifiant est inconnu ; sinon, renvoie la valeur renvoyée par end_rental() de la location.
  • available_vehicles() -> Array[Vehicle] : les véhicules disponibles, dans l’ordre où ils ont été ajoutés.
  • total_revenue() -> int : la somme des coûts de toutes les locations, actives ou terminées.

Une location stocke son véhicule, mais un véhicule ne stocke pas sa location : aucun objet ne pointe donc vers l’autre. Pour cette entrée :

Speedy Rentals
car C1|Toyota|Camry|50|5
moto M1|Honda|CBR|40|600
rent C1|Ana|3
rent C1|Ben|2
available
kind M1
rentals
revenue

la sortie est :

Rented C1 as R1: $150
Cannot rent C1
Available at Speedy Rentals:
- Motorcycle: Honda CBR (VIN: M1) - Available - 600cc
M1: Vehicle true, Car false, Motorcycle true
Rental R1: Toyota Camry for Ana, 3 days, $150 - Active
Revenue: $150

Votre code va dans vehicle.gd, car.gd, motorcycle.gd, rental.gd et rental_agency.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d’entrée/sortie fourni : conservez-le tel quel

	var agency := RentalAgency.new(OS.read_string_from_stdin())

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"vehicle":
				agency.add_vehicle(Vehicle.new(f[0], f[1], f[2], int(f[3])))
			"car":
				agency.add_vehicle(Car.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
			"moto":
				agency.add_vehicle(Motorcycle.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
			"rent":
				var rental_id: String = agency.rent_vehicle(f[0], f[1], int(f[2]))
				if rental_id == "":
					print("Cannot rent ", f[0])
				else:
					var rental: Rental = agency.rentals[rental_id]
					print("Rented %s as %s: $%d" % [f[0], rental_id, rental.calculate_cost()])
			"return":
				print("Return ", f[0], ": ", agency.return_vehicle(f[0]))
			"available":
				print("Available at ", agency.agency_name, ":")
				for vehicle in agency.available_vehicles():
					print("- ", vehicle)
			"fleet":
				for vin in agency.vehicles:
					print(agency.vehicles[vin])
			"kind":
				var vehicle: Vehicle = agency.vehicles[f[0]]
				print("%s: Vehicle %s, Car %s, Motorcycle %s" % [f[0], vehicle is Vehicle, vehicle is Car, vehicle is Motorcycle])
			"rentals":
				for rental_id in agency.rentals:
					print(agency.rentals[rental_id])
			"revenue":
				print("Revenue: $", agency.total_revenue())

		line = OS.read_string_from_stdin()

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur GDScript en ligne