今回は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()