Menu
CoddyTech

Сервис аренды автомобилей

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 65 из 65.

challenge icon

Задание

Средне

Создай сервис проката транспортных средств: транспортные средства двух видов, аренда и агентство, которое управляет и тем и другим. Цены указаны в целых долларах (int).

Vehicle в vehicle.gd:

  • Конструктор принимает vin, make, model и daily_rate; изначально available имеет значение true.
  • start_rental() -> bool: возвращает false, если транспортное средство недоступно; в противном случае помечает его как недоступное и возвращает true.
  • end_rental() снова делает его доступным.
  • _to_string() возвращает MAKE MODEL (VIN: VIN) - Available или заканчивается на - Rented.

Car в car.gd и Motorcycle в motorcycle.gd наследуются от Vehicle. Их конструкторы принимают четыре значения транспортного средства, а также seats (для автомобиля) или engine_size (для мотоцикла). Их _to_string() дополняет текст родительского класса: Car: + текст транспортного средства + - 5 seats, а также Motorcycle: + текст транспортного средства + - 600cc.

Rental в rental.gd:

  • Конструктор принимает rental_id, объект vehicle, customer_name и days; изначально is_active имеет значение true.
  • calculate_cost() -> int: дневная ставка, умноженная на количество дней.
  • end_rental() -> bool: возвращает false для аренды, которая уже завершилась; в противном случае завершает её, завершает аренду транспортного средства и возвращает true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active или - Completed.

RentalAgency в rental_agency.gd:

  • Конструктор принимает agency_name. vehicles — это словарь, сопоставляющий VIN транспортному средству, rentals — словарь, сопоставляющий идентификатор аренды аренде, а начальное значение next_rental_id — 1.
  • add_vehicle(vehicle) сохраняет транспортное средство под его VIN.
  • rent_vehicle(vin, customer_name, days) -> String: возвращает "", если VIN неизвестен, количество дней меньше 1 или транспортное средство недоступно. В противном случае начинает аренду транспортного средства, создаёт объект Rental с идентификатором R1, R2... (счётчик увеличивается только при успешной аренде), сохраняет его и возвращает идентификатор.
  • return_vehicle(rental_id) -> bool: возвращает false для неизвестного идентификатора; в противном случае возвращает результат вызова end_rental() аренды.
  • available_vehicles() -> Array[Vehicle]: доступные транспортные средства в порядке их добавления.
  • total_revenue() -> int: сумма стоимости всех аренд, активных или завершённых.

Аренда хранит ссылку на транспортное средство, но транспортное средство не хранит ссылку на аренду, поэтому объекты не ссылаются друг на друга. Для этого ввода:

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

результат будет таким:

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

Твой код нужно поместить в vehicle.gd, car.gd, motorcycle.gd, rental.gd и rental_agency.gd. В main.gd содержится предоставленный код ввода/вывода, который нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript