import tkinter as tk
import random

# 游戏基础配置
WIDTH = 480
HEIGHT = 700
CAR_WIDTH = 40
CAR_HEIGHT = 70
OBSTACLE_WIDTH = 40
OBSTACLE_HEIGHT = 70
LANE_NUM = 3  # 3条车道
LANE_WIDTH = WIDTH // LANE_NUM

class RacingGame:
    def __init__(self, root):
        self.root = root
        self.root.title("2D赛车小游戏-Tkinter")
        self.root.resizable(False, False)

        # 画布创建
        self.canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="#3a7f30")
        self.canvas.pack()

        # 绘制赛道
        self.draw_road()

        # 玩家赛车初始位置（中间车道底部）
        self.player_x = LANE_WIDTH * 1 + (LANE_WIDTH - CAR_WIDTH) // 2
        self.player_y = HEIGHT - CAR_HEIGHT - 20
        self.player_car = self.canvas.create_rectangle(
            self.player_x, self.player_y,
            self.player_x + CAR_WIDTH, self.player_y + CAR_HEIGHT,
            fill="red", outline="black", width=2
        )

        # 游戏变量
        self.score = 0
        self.game_over = False
        self.obstacles = []
        self.speed = 6

        # 分数文本
        self.score_text = self.canvas.create_text(60, 30, text=f"分数：{self.score}", font=("微软雅黑",16), fill="white")
        self.game_over_text = None

        # 键盘绑定
        self.root.bind("<Left>", self.move_left)
        self.root.bind("<Right>", self.move_right)
        self.root.bind("<Up>", self.move_up)
        self.root.bind("<Down>", self.move_down)

        # 循环生成障碍、游戏主循环
        self.spawn_obstacle()
        self.game_loop()

    def draw_road(self):
        """绘制马路与车道分隔线"""
        # 黑色主马路区域
        self.canvas.create_rectangle(LANE_WIDTH*0, 0, LANE_WIDTH*3, HEIGHT, fill="#444444")
        # 车道白线
        for i in range(1, LANE_NUM):
            x = LANE_WIDTH * i
            for y in range(0, HEIGHT, 80):
                self.canvas.create_rectangle(x-3, y, x+3, y+40, fill="white")

    def move_left(self, event):
        if self.game_over: return
        if self.player_x > LANE_WIDTH * 0 + 5:
            self.canvas.move(self.player_car, -15, 0)
            self.player_x -=15

    def move_right(self, event):
        if self.game_over: return
        if self.player_x + CAR_WIDTH < LANE_WIDTH *3 -5:
            self.canvas.move(self.player_car, 15, 0)
            self.player_x +=15

    def move_up(self, event):
        if self.game_over: return
        if self.player_y > 10:
            self.canvas.move(self.player_car, 0, -12)
            self.player_y -=12

    def move_down(self, event):
        if self.game_over: return
        if self.player_y + CAR_HEIGHT < HEIGHT -10:
            self.canvas.move(self.player_car, 0, 12)
            self.player_y +=12

    def spawn_obstacle(self):
        """随机在车道生成敌方车辆"""
        if self.game_over: return
        lane = random.randint(0, LANE_NUM-1)
        obs_x = LANE_WIDTH * lane + (LANE_WIDTH - OBSTACLE_WIDTH)//2
        obs_y = -OBSTACLE_HEIGHT
        obs = self.canvas.create_rectangle(
            obs_x, obs_y, obs_x+OBSTACLE_WIDTH, obs_y+OBSTACLE_HEIGHT,
            fill="blue", outline="black", width=2
        )
        self.obstacles.append(obs)
        # 每隔700ms生成一辆车
        self.root.after(700, self.spawn_obstacle)

    def check_collision(self):
        """碰撞检测：玩家车与障碍车相撞判定"""
        px1, py1, px2, py2 = self.canvas.coords(self.player_car)
        for obs in self.obstacles:
            ox1, oy1, ox2, oy2 = self.canvas.coords(obs)
            # 矩形碰撞公式
            if not (px2 < ox1 or px1 > ox2 or py2 < oy1 or py1 > oy2):
                self.game_over = True
                self.game_over_text = self.canvas.create_text(
                    WIDTH//2, HEIGHT//2,
                    text=f"游戏结束！最终分数：{self.score}",
                    font=("微软雅黑",24), fill="yellow"
                )
                return True
        return False

    def game_loop(self):
        if self.game_over: return
        # 移动所有障碍车向下
        to_remove = []
        for obs in self.obstacles:
            self.canvas.move(obs, 0, self.speed)
            ox1, oy1, ox2, oy2 = self.canvas.coords(obs)
            # 车辆驶出屏幕，删除并加分
            if oy1 > HEIGHT:
                to_remove.append(obs)
                self.score +=10
                self.canvas.itemconfig(self.score_text, text=f"分数：{self.score}")
        # 清理出界障碍
        for obs in to_remove:
            self.canvas.delete(obs)
            self.obstacles.remove(obs)

        # 碰撞检测
        self.check_collision()

        # 持续循环
        self.root.after(20, self.game_loop)

if __name__ == "__main__":
    window = tk.Tk()
    game = RacingGame(window)
    window.mainloop()