Untitled
unknown
plain_text
8 months ago
4.5 kB
8
Indexable
import pygame
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg
import os
# 初始化 Pygame
pygame.init()
# 視窗設定
WIDTH, HEIGHT = 1200, 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("車輛加減速最佳化模擬器")
# 顏色定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
GRAY = (200, 200, 200)
# 車輛圖片
car_image = pygame.image.load("C:/Users/sylvi/Automobile-energy-consumption-detector/src/train.png")
car_image = pygame.transform.scale(car_image, (100, 50))
# 最佳化速度曲線
time_optimal = np.linspace(0, 60, 100)
speed_optimal_time = np.zeros_like(time_optimal)
for i, t in enumerate(time_optimal):
if t < 10: # 加速
speed_optimal_time[i] = 7.2 * t
elif t < 50: # 巡航
speed_optimal_time[i] = 72.0
else: # 減速
speed_optimal_time[i] = 72.0 - 7.2 * (t - 50)
# 計算對應的距離
distance_optimal = np.zeros_like(time_optimal)
for i in range(1, len(time_optimal)):
dt = time_optimal[i] - time_optimal[i-1]
avg_speed = (speed_optimal_time[i] + speed_optimal_time[i-1]) / 2
distance_optimal[i] = distance_optimal[i-1] + avg_speed * dt / 3.6
# 車輛類別
class Vehicle:
def __init__(self):
self.position = 0.0 # 米
self.speed = 0.0 # km/h
self.acceleration = 0.0 # km/h/s
self.time = 0.0 # 秒
self.energy_consumption = 0.0 # 能耗
self.max_speed = 120.0 # km/h
self.min_speed = 0.0
def update(self, dt):
# 更新速度與位置
self.speed += self.acceleration * dt
self.speed = max(self.min_speed, min(self.speed, self.max_speed)) # 限制速度範圍
self.position += self.speed * dt / 3.6
self.time += dt
# 能耗模型
self.energy_consumption += (0.01 * self.speed**2 + 0.2 * self.acceleration**2) * dt
# 創建車輛
vehicle = Vehicle()
# 儀表板繪製函數
def draw_dashboard():
screen.fill(WHITE)
# 繪製道路
road_y = HEIGHT - 100
pygame.draw.line(screen, BLACK, (50, road_y), (WIDTH - 50, road_y), 5)
# 繪製車輛
car_x = 50 + (WIDTH - 100) * (vehicle.position / distance_optimal[-1])
car_rect = car_image.get_rect()
car_rect.midbottom = (car_x, road_y)
screen.blit(car_image, car_rect)
# 繪製速度表
font = pygame.font.Font(None, 36)
speed_text = font.render(f"Speed: {vehicle.speed:.1f} km/h", True, BLACK)
screen.blit(speed_text, (50, 50))
position_text = font.render(f"Position: {vehicle.position:.1f} m", True, BLACK)
screen.blit(position_text, (50, 100))
energy_text = font.render(f"Energy: {vehicle.energy_consumption:.1f} kW", True, BLACK)
screen.blit(energy_text, (50, 150))
draw_speedometer()
# 速度計繪製函數
def draw_speedometer():
center_x, center_y = WIDTH - 150, 150
radius = 60
pygame.draw.circle(screen, GRAY, (center_x, center_y), radius)
pygame.draw.circle(screen, BLACK, (center_x, center_y), radius, 5)
angle = np.radians(180 * (vehicle.speed / vehicle.max_speed) - 90)
needle_x = center_x + radius * 0.8 * np.cos(angle)
needle_y = center_y + radius * 0.8 * np.sin(angle)
pygame.draw.line(screen, RED, (center_x, center_y), (needle_x, needle_y), 5)
# 遊戲主循環
running = True
clock = pygame.time.Clock()
while running:
dt = clock.tick(30) / 1000 # 轉換為秒
# 處理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 獲取鍵盤輸入
keys = pygame.key.get_pressed()
# 控制加速度(油門/煞車)
if keys[pygame.K_UP]:
vehicle.acceleration = 2.0 # 持續加速
elif keys[pygame.K_DOWN]:
vehicle.acceleration = -2.0 # 持續減速
else:
vehicle.acceleration = -0.5 # 自然減速
# 更新車輛狀態
vehicle.update(dt)
# 檢查是否到達終點
if vehicle.position >= distance_optimal[-1]:
print("Arrived at destination!")
print(f"Total time: {vehicle.time:.1f} s")
print(f"Energy: {vehicle.energy_consumption:.1f} kW")
running = False
# 繪製畫面
draw_dashboard()
pygame.display.flip()
pygame.quit()
Editor is loading...
Leave a Comment