Menu
CoddyTech

Servicio de alquiler de vehículos

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 65 de 65.

challenge icon

Desafío

Intermedio

Construye un servicio de alquiler de vehículos: vehículos de dos tipos, alquileres y la agencia que gestiona ambos. Los precios son números enteros de dólares (int).

Vehicle en vehicle.gd:

  • El constructor recibe vin, make, model y daily_rate; available empieza como true.
  • start_rental() -> bool: devuelve false cuando el vehículo no está disponible; de lo contrario, lo marca como no disponible y devuelve true.
  • end_rental() hace que vuelva a estar disponible.
  • _to_string() devuelve MAKE MODEL (VIN: VIN) - Available, o - Rented al final.

Car en car.gd y Motorcycle en motorcycle.gd extienden Vehicle. Sus constructores reciben los cuatro valores del vehículo más seats (coche) o engine_size (motocicleta). Su método _to_string() se basa en el texto de la clase padre: Car: + el texto del vehículo + - 5 seats, y Motorcycle: + el texto del vehículo + - 600cc.

Rental en rental.gd:

  • El constructor recibe rental_id, el objeto vehicle, customer_name y days; is_active empieza como true.
  • calculate_cost() -> int: la tarifa diaria multiplicada por los días.
  • end_rental() -> bool: false para un alquiler que ya terminó; de lo contrario, lo finaliza, termina el alquiler del vehículo y devuelve true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, o - Completed.

RentalAgency en rental_agency.gd:

  • El constructor recibe agency_name. vehicles es un diccionario que asigna cada VIN a un vehículo, rentals es un diccionario que asigna cada id de alquiler a un alquiler, y next_rental_id empieza en 1.
  • add_vehicle(vehicle) guarda un vehículo usando su VIN como clave.
  • rent_vehicle(vin, customer_name, days) -> String: devuelve "" si el VIN no existe, si se solicita menos de 1 día o si el vehículo no está disponible. De lo contrario, inicia el alquiler del vehículo, crea un Rental con el id R1, R2... (el contador solo aumenta cuando el alquiler se realiza correctamente), lo guarda y devuelve el id.
  • return_vehicle(rental_id) -> bool: devuelve false si el id no existe; de lo contrario, devuelve el valor que devuelve end_rental() del alquiler.
  • available_vehicles() -> Array[Vehicle]: los vehículos disponibles, en el orden en que se añadieron.
  • total_revenue() -> int: la suma de los costos de todos los alquileres, activos o completados.

Un alquiler almacena su vehículo, pero un vehículo no almacena su alquiler, así que no hay dos objetos que se apunten mutuamente. Para esta entrada:

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 salida es:

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

Tu código va en vehicle.gd, car.gd, motorcycle.gd, rental.gd y rental_agency.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está

	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()

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online