Untitled
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