LoginSignup
1
2

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

Posted at

今回はchatGPTを使用して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()
1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2