chatGPTにpythonで駐車場シミュレーターを作らせる


今回はchatGPTを使用してpythonで駐車場シミュレーターを作らせましたので紹介します。
# コード
作成させたコードです。途中にコメントも入れてもらいました。
```python:シミュレーター.py
import tkinter as tk
from tkinter import messagebox, simpledialog
from tkinter import ttk
import time

class ParkingSpot:
    def __init__(self, spot_number):
        # 駐車スポットの初期化
        self.spot_number = spot_number
        self.occupied = False
        self.parked_time = 0
        self.vehicle_number = ""

    def is_occupied(self):
        # スポットが占有されているかどうかを返す
        return self.occupied

    def park_vehicle(self, vehicle_number):
        # 車両を駐車させる
        self.occupied = True
        self.vehicle_number = vehicle_number
        self.parked_time = time.time()

    def vacate_spot(self):
        # スポットを空ける
        self.occupied = False

    def get_parked_time(self):
        # 駐車した時間を取得
        return self.parked_time

    def get_vehicle_number(self):
        # 車両のナンバーを取得
        return self.vehicle_number

class CoinParkingSimulator:
    def __init__(self):
        # コインパーキングシミュレータの初期化
        self.parking_spots = {i: ParkingSpot(i) for i in range(1, 11)}  # 10の駐車スポット
        self.active_tickets = {}
        self.log = []
        self.rate_per_second = 0.1  # デフォルトの料金: 0.1円/秒

    def park_vehicle(self, spot_number, vehicle_number):
        # 指定されたスポットに車両を駐車させる
        selected_spot = self.parking_spots.get(spot_number)
        if selected_spot and not selected_spot.is_occupied():
            selected_spot.park_vehicle(vehicle_number)
            self.active_tickets[spot_number] = time.time()
            self.log.append(f"車両 {vehicle_number} がスポット {spot_number} に駐車しました。")
            return True
        else:
            return False

    def remove_vehicle(self, spot_number):
        # 指定されたスポットから車両を出庫させ、駐車料金を計算
        if spot_number in self.active_tickets:
            parked_time = self.active_tickets[spot_number]
            vehicle_number = self.parking_spots[spot_number].get_vehicle_number()
            del self.active_tickets[spot_number]
            self.parking_spots[spot_number].vacate_spot()
            duration = time.time() - parked_time
            cost = round(duration * self.rate_per_second, 2)
            self.log.append(f"車両 {vehicle_number} がスポット {spot_number} から出庫しました。駐車料金は {cost} 円です。")
            messagebox.showinfo("出庫完了", f"車両 {vehicle_number} がスポット {spot_number} から出庫しました。\n駐車料金は {cost} 円です。")
        else:
            messagebox.showerror("エラー", "指定されたスポットは利用できません.")

    def display_parking_lot_status(self):
        # 駐車場の状態を表示するGUIウィンドウを作成
        root = tk.Tk()
        root.title("Parking Lot Status")

        canvas = tk.Canvas(root, width=300, height=200)
        canvas.pack()

        for spot_number, spot in self.parking_spots.items():
            x = (spot_number - 1) % 5 * 60
            y = (spot_number - 1) // 5 * 40

            color = "green" if spot.is_occupied() else "red"
            canvas.create_rectangle(x, y, x + 50, y + 30, fill=color)
            canvas.create_text(x + 25, y + 15, text=f"{spot_number}\n{spot.get_vehicle_number()}", fill="white")

        root.mainloop()

    def display_log(self):
        # ログを表示する
        log_text = "\n".join(self.log)
        messagebox.showinfo("ログ", log_text)

    def display_total_revenue(self):
        # 総収益を計算して表示する
        total_revenue = sum(round((time.time() - self.active_tickets[int(spot_number)]) * self.rate_per_second, 2) for spot_number in self.active_tickets)
        messagebox.showinfo("総収益", f"総収益は {total_revenue} 円です.")

    def set_rate_per_second(self):
        # 料金を秒単位で設定する
        new_rate = simpledialog.askfloat("設定", "新しい料金（円/秒）を入力してください:", initialvalue=self.rate_per_second)
        if new_rate is not None:
            self.rate_per_second = new_rate

    def display_remaining_time(self, spot_number):
        # 指定されたスポットに駐車している車両の残り時間を表示する
        if spot_number in self.active_tickets:
            parked_time = self.active_tickets[int(spot_number)]
            max_parking_time = 300  # 最大駐車時間を300秒（5分）と仮定 - この値を調整できます
            remaining_time = max(0, max_parking_time - (time.time() - parked_time))
            messagebox.showinfo("残り時間", f"スポット {spot_number} に駐車している車両の残り時間は {remaining_time:.2f} 秒です。")
        else:
            messagebox.showerror("エラー", "指定されたスポットには車両が駐車していません.")

def main():
    # CoinParkingSimulatorクラスのインスタンスを作成
    coin_parking_simulator = CoinParkingSimulator()

    # ボタンのアクション用の関数を定義

    def park_vehicle():
        # "駐車する" ボタンがクリックされたときに車両を駐車
        # 関連する情報を表示し、駐車場の状態を更新
        pass

    def remove_vehicle():
        # "車両を出庫する" ボタンがクリックされたときに車両を出庫
        # 関連する情報を表示し、駐車場の状態を更新
        pass
    
    # 他のボタンアクション用の関数を定義

    # GUIウィンドウを作成し、ラベル、エントリ、ボタンを配置

    root = tk.Tk()
    root.title("Coin Parking Simulator")

    frame = ttk.Frame(root, padding=10)
    frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))

    label_spot = ttk.Label(frame, text="駐車スポット番号:")
    entry_spot = ttk.Entry(frame)

    label_vehicle = ttk.Label(frame, text="車両ナンバー:")
    entry_vehicle = ttk.Entry(frame)

    # ボタンを作成し、GUIに配置

    root.mainloop()

if __name__ == "__main__":
    main()