import tkinter as tk
import random
import math

class DrivingGame:
    def __init__(self, root):
        self.root = root
        self.root.title("007. 驾驶小游戏")
        self.root.geometry("400x600")
        self.root.resizable(False, False)
        
        # ===== 游戏配置 =====
        self.width = 400
        self.height = 600
        self.player_speed = 10
        self.obstacle_speed = 5
        self.score = 0
        self.game_over = False
        
        # ===== 画布 =====
        self.canvas = tk.Canvas(root, width=self.width, height=self.height, bg="gray")
        self.canvas.pack()
        
        # ===== 玩家车辆 =====
        self.player = self.canvas.create_rectangle(
            self.width//2 - 25, self.height - 80, 
            self.width//2 + 25, self.height - 40, 
            fill="blue", outline="darkblue", width=2
        )
        
        # ===== 障碍物列表 =====
        self.obstacles = []
        
        # ===== 分数显示 =====
        self.score_text = self.canvas.create_text(
            50, 30, text="得分: 0", 
            fill="white", font=("Arial", 16, "bold")
        )
        
        # ===== 绑定按键 =====
        self.root.bind("<Left>", lambda e: self.move(-1))
        self.root.bind("<Right>", lambda e: self.move(1))
        self.root.bind("<space>", lambda e: self.restart())
        self.root.focus_set()
        
        # ===== 开始生成障碍物 =====
        self.spawn_obstacle()
        
        # ===== 游戏循环 =====
        self.game_loop()
    
    def move(self, direction):
        if self.game_over:
            return
        x1, y1, x2, y2 = self.canvas.coords(self.player)
        new_x1 = x1 + direction * self.player_speed
        new_x2 = x2 + direction * self.player_speed
        
        # 边界检测
        if 0 < new_x1 and new_x2 < self.width:
            self.canvas.move(self.player, direction * self.player_speed, 0)
    
    def spawn_obstacle(self):
        if self.game_over:
            return
        # 随机生成位置
        x = random.randint(50, self.width - 50)
        # 红色障碍物
        obs = self.canvas.create_rectangle(
            x - 25, -30, x + 25, 10, 
            fill="red", outline="darkred"
        )
        self.obstacles.append(obs)
        
        # 设置下一次生成时间（越玩越快）
        delay = max(800, 2000 - self.score * 50)
        self.root.after(delay, self.spawn_obstacle)
    
    def check_collision(self):
        player_coords = self.canvas.coords(self.player)
        for obs in self.obstacles[:]:  # 遍历副本
            obs_coords = self.canvas.coords(obs)
            # 简单的矩形碰撞检测
            if (player_coords[2] > obs_coords[0] and 
                player_coords[0] < obs_coords[2] and 
                player_coords[3] > obs_coords[1] and 
                player_coords[1] < obs_coords[3]):
                return True
        return False
    
    def game_loop(self):
        if self.game_over:
            return
        
        # 移动障碍物
        for obs in self.obstacles[:]:
            self.canvas.move(obs, 0, self.obstacle_speed)
            # 移除屏幕外的障碍物并加分
            if self.canvas.coords(obs)[1] > self.height:
                self.canvas.delete(obs)
                self.obstacles.remove(obs)
                self.score += 1
                self.canvas.itemconfig(self.score_text, text=f"得分: {self.score}")
                
                # 提升难度
                if self.obstacle_speed < 15:
                    self.obstacle_speed += 0.1
        
        # 检测碰撞
        if self.check_collision():
            self.game_over = True
            self.canvas.create_text(
                self.width//2, self.height//2, 
                text="GAME OVER!\n按空格键重新开始", 
                fill="yellow", font=("Arial", 20, "bold"),
                justify=tk.CENTER
            )
            return
        
        # 继续循环
        self.root.after(30, self.game_loop)
    
    def restart(self, event=None):
        if not self.game_over:
            return
        self.game_over = False
        self.score = 0
        self.obstacle_speed = 5
        self.canvas.itemconfig(self.score_text, text="得分: 0")
        self.canvas.delete("all")
        
        # 重新绘制玩家
        self.player = self.canvas.create_rectangle(
            self.width//2 - 25, self.height - 80, 
            self.width//2 + 25, self.height - 40, 
            fill="blue", outline="darkblue", width=2
        )
        
        # 清空障碍物列表
        self.obstacles = []
        
        # 重新开始游戏循环
        self.spawn_obstacle()
        self.game_loop()

if __name__ == "__main__":
    root = tk.Tk()
    game = DrivingGame(root)
    root.mainloop()