Menu
CoddyTech

Dịch vụ cho thuê phương tiện

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 65 trên 65.

challenge icon

Thử thách

Trung bình

Xây dựng dịch vụ cho thuê phương tiện: các phương tiện thuộc hai loại, các lượt thuê và đại lý quản lý cả hai. Giá tính bằng đô la nguyên (int).

Vehicle trong vehicle.gd:

  • Hàm khởi tạo nhận vin, make, model và daily_rate; available bắt đầu bằng true.
  • start_rental() -> bool: trả về false nếu phương tiện không sẵn có; nếu không, đánh dấu phương tiện là không sẵn có và trả về true.
  • end_rental() làm cho phương tiện sẵn có trở lại.
  • _to_string() trả về MAKE MODEL (VIN: VIN) - Available, hoặc kết thúc bằng - Rented.

Car trong car.gd và Motorcycle trong motorcycle.gd kế thừa Vehicle. Hàm khởi tạo của chúng nhận bốn giá trị của phương tiện cùng với seats (ô tô) hoặc engine_size (xe máy). Hàm _to_string() của chúng nối thêm vào văn bản của lớp cha: Car: + văn bản phương tiện + - 5 seats, và Motorcycle: + văn bản phương tiện + - 600cc.

Rental trong rental.gd:

  • Hàm khởi tạo nhận rental_id, đối tượng vehicle, customer_name và days; is_active bắt đầu bằng true.
  • calculate_cost() -> int: đơn giá mỗi ngày nhân với số ngày.
  • end_rental() -> bool: trả về false nếu lượt thuê đã kết thúc; nếu không, kết thúc lượt thuê, kết thúc lượt thuê phương tiện và trả về true.
  • _to_string(): Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, hoặc kết thúc bằng - Completed.

RentalAgency trong rental_agency.gd:

  • Hàm khởi tạo nhận agency_name. vehicles là một từ điển ánh xạ VIN sang phương tiện, rentals là một từ điển ánh xạ mã lượt thuê sang lượt thuê, và next_rental_id bắt đầu từ 1.
  • add_vehicle(vehicle) lưu phương tiện theo VIN của nó.
  • rent_vehicle(vin, customer_name, days) -> String: trả về "" nếu VIN không tồn tại, số ngày ít hơn 1 hoặc phương tiện không sẵn có. Nếu không, bắt đầu lượt thuê phương tiện, tạo một Rental với mã R1, R2... (bộ đếm chỉ tăng khi lượt thuê thành công), lưu lượt thuê và trả về mã đó.
  • return_vehicle(rental_id) -> bool: trả về false nếu mã không tồn tại; nếu không, trả về kết quả của end_rental() thuộc lượt thuê đó.
  • available_vehicles() -> Array[Vehicle]: các phương tiện sẵn có, theo thứ tự được thêm vào.
  • total_revenue() -> int: tổng chi phí của tất cả lượt thuê, dù đang hoạt động hay đã hoàn tất.

Một lượt thuê lưu phương tiện của nó, nhưng phương tiện không lưu lượt thuê, vì vậy không có hai đối tượng nào trỏ đến nhau. Với đầu vào này:

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

đầu ra là:

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

Đặt code của bạn trong vehicle.gd, car.gd, motorcycle.gd, rental.gd và rental_agency.gd. main.gd chứa code đầu vào/đầu ra có sẵn và bạn không thể chỉnh sửa.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên

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

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online