Menu
CoddyTech

レンタカーサービス

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 65/65。

challenge icon

チャレンジ

中級

車両レンタルサービスを作成します。2種類の車両、レンタル、およびその両方を管理する代理店を実装します。料金はドル単位の整数です(int)。

vehicle.gd の Vehicle:

  • コンストラクターは vin、make、model、daily_rate を受け取ります。available は true で初期化されます。
  • start_rental() -> bool:車両が利用可能でない場合は false を返します。それ以外の場合は利用不可にして true を返します。
  • end_rental() は車両を再び利用可能にします。
  • _to_string() は MAKE MODEL (VIN: VIN) - Available を返します。利用不可の場合は末尾が - Rented になります。

car.gd の Car と motorcycle.gd の Motorcycle は Vehicle を継承します。それぞれのコンストラクターは、4つの車両情報に加えて、Car では seats、Motorcycle では engine_size を受け取ります。それぞれの _to_string() は親クラスのテキストを基にして、Car: + 車両のテキスト + - 5 seats、および Motorcycle: + 車両のテキスト + - 600cc を組み立てます。

rental.gd の Rental:

  • コンストラクターは rental_id、vehicle オブジェクト、customer_name、days を受け取ります。is_active は true で初期化されます。
  • calculate_cost() -> int:1日あたりの料金に日数を掛けた値です。
  • end_rental() -> bool:すでに終了したレンタルの場合は false を返します。それ以外の場合はレンタルを終了し、車両のレンタルも終了して true を返します。
  • _to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active を返します。終了済みの場合は - Completed になります。

rental_agency.gd の RentalAgency:

  • コンストラクターは agency_name を受け取ります。vehicles は VIN から車両への辞書、rentals はレンタル ID からレンタルへの辞書です。next_rental_id は 1 で初期化されます。
  • add_vehicle(vehicle) は車両をその VIN をキーとして保存します。
  • rent_vehicle(vin, customer_name, days) -> String:VIN が不明な場合、日数が 1 未満の場合、または車両が利用可能でない場合は "" を返します。それ以外の場合は車両のレンタルを開始し、ID が R1、R2... の Rental を作成して保存し、その ID を返します(カウンターが増えるのはレンタルが成功した場合のみです)。
  • return_vehicle(rental_id) -> bool:ID が不明な場合は false を返します。それ以外の場合は、そのレンタルの end_rental() が返す値を返します。
  • available_vehicles() -> Array[Vehicle]:追加された順に並んだ、利用可能な車両を返します。
  • total_revenue() -> int:進行中または完了済みのすべてのレンタル料金の合計です。

レンタルは車両を参照しますが、車両はレンタルを参照しないため、2つのオブジェクトが互いを参照することはありません。次の入力では:

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オンラインコンパイラ