import turtle
import math

# ============ 初始化窗口 ============
screen = turtle.Screen()
screen.title("飞行模拟器 - Python Turtle")
screen.setup(width=900, height=600)
screen.bgcolor("#87CEEB")
screen.tracer(0)

# ============ 飞行状态 ============
pitch = 0.0
roll = 0.0
PITCH_RATE = 1.5
ROLL_RATE = 2.0
MAX_PITCH = 60.0

# ============ 画笔 ============
pen = turtle.Turtle()
pen.hideturtle()
pen.speed(0)
pen.penup()

hud = turtle.Turtle()
hud.hideturtle()
hud.speed(0)
hud.penup()

# ============ 中文字体 ============
# Windows 常用: "Microsoft YaHei"(微软雅黑), "SimHei"(黑体), "SimSun"(宋体)
# macOS 常用: "PingFang SC", "STHeiti"
# Linux 常用: "WenQuanYi Micro Hei", "Noto Sans CJK SC"
CN_FONT = "Microsoft YaHei"   # 如果还是乱码, 改成 "SimHei"

# ============ 键盘控制 ============
def on_up():
    global pitch
    pitch = min(MAX_PITCH, pitch + PITCH_RATE)

def on_down():
    global pitch
    pitch = max(-MAX_PITCH, pitch - PITCH_RATE)

def on_left():
    global roll
    roll -= ROLL_RATE
    if roll < -180: roll += 360

def on_right():
    global roll
    roll += ROLL_RATE
    if roll > 180: roll -= 360

def on_reset():
    global pitch, roll
    pitch = 0.0
    roll = 0.0

screen.listen()
screen.onkey(on_up, "Up")
screen.onkey(on_down, "Down")
screen.onkey(on_left, "Left")
screen.onkey(on_right, "Right")
screen.onkey(on_reset, "r")
screen.onkey(lambda: screen.bye(), "q")

# ============ 绘制背景 ============
def draw_background():
    pen.clear()
    cx, cy = 0, 0
    pitch_offset = pitch * 3
    roll_rad = math.radians(roll)
    slope = math.tan(roll_rad)

    for y in range(300, -301, -4):
        x_left, x_right = cx - 450, cx + 450
        y_left  = cy + pitch_offset + slope * (x_left  - cx)
        y_right = cy + pitch_offset + slope * (x_right - cx)
        y_mid = (y_left + y_right) / 2

        if y > y_mid + 2:
            color = "#8B7355"      # 地面
        elif y < y_mid - 2:
            color = "#87CEEB"      # 天空
        else:
            color = "#FFFFFF"      # 地平线

        pen.pencolor(color)
        pen.pensize(4)
        pen.goto(x_left, y)
        pen.pendown()
        pen.goto(x_right, y)
        pen.penup()

# ============ 人工地平线 ============
def draw_horizon():
    pen.pencolor("white")
    pen.pensize(3)
    cx, cy = 0, 0
    pitch_offset = pitch * 3
    roll_rad = math.radians(roll)
    length = 400
    dx = length * math.cos(roll_rad)
    dy = length * math.sin(roll_rad)

    x1 = cx - dx
    y1 = cy + pitch_offset - dy
    x2 = cx + dx
    y2 = cy + pitch_offset + dy

    pen.penup()
    pen.goto(x1, y1)
    pen.pendown()
    pen.goto(x2, y2)
    pen.penup()

    # 刻度
    pen.pencolor("yellow")
    pen.pensize(2)
    for i in range(-3, 4):
        if i == 0: continue
        offset = i * 60
        ox = cx + offset * math.cos(roll_rad)
        oy = cy + pitch_offset + offset * math.sin(roll_rad)
        for j in [-5, 5]:
            px = ox + j * math.sin(roll_rad)
            py = oy - j * math.cos(roll_rad)
            pen.goto(ox, oy)
            pen.pendown()
            pen.goto(px, py)
            pen.penup()

# ============ 飞机符号 ============
def draw_aircraft():
    pen.pencolor("orange")
    pen.pensize(3)
    pen.penup()
    pen.goto(0, 0)
    pen.dot(8, "orange")
    pen.goto(-25, 0)
    pen.pendown()
    pen.goto(25, 0)
    pen.penup()
    pen.goto(-30, -3)
    pen.pendown()
    pen.goto(-25, 0)
    pen.penup()
    pen.goto(30, -3)
    pen.pendown()
    pen.goto(25, 0)
    pen.penup()
    pen.goto(0, 10)
    pen.pendown()
    pen.goto(0, 20)
    pen.penup()

# ============ HUD 信息 (中文) ============
def draw_hud():
    hud.clear()

    # 俯仰角
    hud.goto(-420, 250)
    hud.color("white")
    hud.write(f"俯仰: {pitch:.1f}°", font=(CN_FONT, 14, "bold"))

    # 滚转角
    hud.goto(-420, 220)
    hud.write(f"滚转: {roll:.1f}°", font=(CN_FONT, 14, "bold"))

    # 操作提示
    hud.goto(-420, -260)
    hud.color("lightyellow")
    hud.write("↑↓ 俯仰   ←→ 滚转   R 重置   Q 退出",
              font=(CN_FONT, 13, "normal"))

    # 姿态描述
    hud.goto(200, 250)
    hud.color("lightgreen")
    if pitch > 5:
        att = "爬升"
    elif pitch < -5:
        att = "下降"
    else:
        att = "平飞"

    if roll > 45:
        bank = "右急转"
    elif roll > 10:
        bank = "右倾斜"
    elif roll < -45:
        bank = "左急转"
    elif roll < -10:
        bank = "左倾斜"
    else:
        bank = "机翼水平"

    hud.write(f"{att}  |  {bank}", font=(CN_FONT, 14, "bold"))

# ============ 主循环 ============
def game_loop():
    draw_background()
    draw_horizon()
    draw_aircraft()
    draw_hud()
    screen.update()
    screen.ontimer(game_loop, 33)

game_loop()
screen.mainloop()