Menu
CoddyTech

Wypożyczalnia pojazdów

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 65 z 65.

challenge icon

Wyzwanie

Średni

Zbuduj system wypożyczania pojazdów: pojazdy dwóch rodzajów, wypożyczenia oraz agencję, która zarządza nimi wszystkimi. Ceny są podawane w pełnych dolarach (int).

Vehicle w pliku vehicle.gd:

  • Konstruktor przyjmuje vin, make, model i daily_rate; available początkowo ma wartość true.
  • start_rental() -> bool: zwraca false, gdy pojazd jest niedostępny; w przeciwnym razie oznacza go jako niedostępny i zwraca true.
  • end_rental() ponownie ustawia go jako dostępny.
  • _to_string() zwraca MAKE MODEL (VIN: VIN) - Available albo - Rented na końcu.

Car w pliku car.gd i Motorcycle w pliku motorcycle.gd dziedziczą po Vehicle. Ich konstruktory przyjmują cztery wartości pojazdu oraz seats (samochód) lub engine_size (motocykl). Ich _to_string() rozszerza tekst klasy nadrzędnej: Car: + tekst pojazdu + - 5 seats oraz Motorcycle: + tekst pojazdu + - 600cc.

Rental w pliku rental.gd:

  • Konstruktor przyjmuje rental_id, obiekt vehicle, customer_name i days; is_active początkowo ma wartość true.
  • calculate_cost() -> int: stawka dzienna pomnożona przez liczbę dni.
  • end_rental() -> bool: zwraca false dla wypożyczenia, które już się zakończyło; w przeciwnym razie kończy je, kończy wypożyczenie pojazdu i zwraca true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active albo - Completed.

RentalAgency w pliku rental_agency.gd:

  • Konstruktor przyjmuje agency_name. vehicles to słownik mapujący VIN na pojazd, rentals to słownik mapujący identyfikator wypożyczenia na wypożyczenie, a next_rental_id początkowo ma wartość 1.
  • add_vehicle(vehicle) zapisuje pojazd pod jego VIN-em.
  • rent_vehicle(vin, customer_name, days) -> String: zwraca "" dla nieznanego VIN-u, liczby dni mniejszej niż 1 lub niedostępnego pojazdu. W przeciwnym razie rozpoczyna wypożyczenie pojazdu, tworzy obiekt Rental z identyfikatorem R1, R2... (licznik zwiększa się tylko w przypadku udanego wypożyczenia), zapisuje go i zwraca identyfikator.
  • return_vehicle(rental_id) -> bool: zwraca false dla nieznanego identyfikatora; w przeciwnym razie zwraca wynik end_rental() wywołanego na wypożyczeniu.
  • available_vehicles() -> Array[Vehicle]: dostępne pojazdy w kolejności, w jakiej zostały dodane.
  • total_revenue() -> int: suma kosztów wszystkich wypożyczeń, aktywnych lub zakończonych.

Wypożyczenie przechowuje swój pojazd, ale pojazd nie przechowuje wypożyczenia, więc żadne dwa obiekty nie wskazują na siebie nawzajem. Dla tego wejścia:

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

wynik to:

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

Umieść swój kod w plikach vehicle.gd, car.gd, motorcycle.gd, rental.gd i rental_agency.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian

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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online