Untitled

 avatar
unknown
plain_text
21 days ago
4.5 kB
7
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