import pygame
import random
import sys
import math

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("坦克大战【可动测试版】")
clock = pygame.time.Clock()
FPS = 60
font = pygame.font.Font(None, 32)

# 颜色
BLACK = (0, 0, 0)
WHITE = (255,255,255)
GREEN = (0, 220, 0)
RED = (220, 0, 0)
YELLOW = (255, 220, 0)


class PlayerTank:
    def __init__(self):
        self.x = 80
        self.y = HEIGHT//2
        self.size = 32
        self.speed = 3
        self.hp = 3
        self.angle = 0

    def update(self):
        # 每一帧持续读取按键
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w]:
            self.y -= self.speed
        if keys[pygame.K_s]:
            self.y += self.speed
        if keys[pygame.K_a]:
            self.x -= self.speed
        if keys[pygame.K_d]:
            self.x += self.speed

        # 屏幕边界
        self.x = max(0, min(WIDTH - self.size, self.x))
        self.y = max(0, min(HEIGHT - self.size, self.y))

        # 炮管跟随鼠标
        mx, my = pygame.mouse.get_pos()
        self.angle = math.atan2(my - (self.y+self.size/2), mx - (self.x+self.size/2))

    def draw(self):
        tank_surf = pygame.Surface((self.size, self.size), pygame.SRCALPHA)
        pygame.draw.rect(tank_surf, GREEN, (4, 4, 24, 24))
        pygame.draw.rect(tank_surf, YELLOW, (12, 0, 8, 16))
        rotated = pygame.transform.rotate(tank_surf, -math.degrees(self.angle))
        ox = self.x + self.size/2 - rotated.get_width()/2
        oy = self.y + self.size/2 - rotated.get_height()/2
        screen.blit(rotated, (ox, oy))

    def get_center(self):
        return (self.x + self.size/2, self.y + self.size/2)
    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)


class AITank:
    def __init__(self):
        self.x = WIDTH - 100
        self.y = HEIGHT//2
        self.size = 32
        self.speed = 1.6
        self.hp = 2
        self.shoot_cd = 0
        self.shoot_delay = 120
        self.angle = 0

    def update(self, target_pos, bullet_list):
        tx, ty = target_pos
        cx, cy = self.x+self.size/2, self.y+self.size/2
        dx = tx - cx
        dy = ty - cy
        dist = math.hypot(dx, dy)
        self.angle = math.atan2(dy, dx)

        if dist > 180:
            self.x += (dx/dist)*self.speed
            self.y += (dy/dist)*self.speed
        self.x = max(0, min(WIDTH - self.size, self.x))
        self.y = max(0, min(HEIGHT - self.size, self.y))

        self.shoot_cd +=1
        if self.shoot_cd >= self.shoot_delay and dist < 550:
            self.shoot_cd = 0
            bullet_list.append(Bullet(cx, cy, self.angle, True))

    def draw(self):
        tank_surf = pygame.Surface((self.size, self.size), pygame.SRCALPHA)
        pygame.draw.rect(tank_surf, RED, (4, 4, 24, 24))
        pygame.draw.rect(tank_surf, WHITE, (12, 0, 8, 16))
        rotated = pygame.transform.rotate(tank_surf, -math.degrees(self.angle))
        ox = self.x + self.size/2 - rotated.get_width()/2
        oy = self.y + self.size/2 - rotated.get_height()/2
        screen.blit(rotated, (ox, oy))

    def get_rect(self):
        return pygame.Rect(self.x, self.y, self.size, self.size)


class Bullet:
    def __init__(self, x, y, angle, is_ai=False):
        self.x = x
        self.y = y
        self.angle = angle
        self.speed = 7
        self.is_ai = is_ai
        self.radius = 4

    def update(self):
        self.x += math.cos(self.angle) * self.speed
        self.y += math.sin(self.angle) * self.speed

    def out_bound(self):
        return self.x <0 or self.x>WIDTH or self.y<0 or self.y>HEIGHT

    def draw(self):
        pygame.draw.circle(screen, YELLOW, (int(self.x), int(self.y)), self.radius)


def main():
    player = PlayerTank()
    ai_tank = AITank()
    bullets = []
    game_over = False
    game_result = ""

    running = True
    while running:
        clock.tick(FPS)
        screen.fill(BLACK)

        # 事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
                cx, cy = player.get_center()
                bullets.append(Bullet(cx, cy, player.angle))

        if not game_over:
            player.update()
            ai_tank.update(player.get_center(), bullets)

            # 更新子弹
            for b in bullets[:]:
                b.update()
                if b.out_bound():
                    bullets.remove(b)
                    continue
                # 击中判定
                bullet_rect = pygame.Rect(b.x-4, b.y-4,8,8)
                if not b.is_ai and bullet_rect.colliderect(ai_tank.get_rect()):
                    ai_tank.hp -=1
                    bullets.remove(b)
                if b.is_ai and bullet_rect.colliderect(player.get_rect()):
                    player.hp -=1
                    bullets.remove(b)

            if player.hp <= 0:
                game_over = True
                game_result = "你战败！"
            if ai_tank.hp <= 0:
                game_over = True
                game_result = "胜利！击毁敌方坦克"

        player.draw()
        ai_tank.draw()
        for bullet in bullets:
            bullet.draw()

        hp_text = font.render(f"我方生命: {player.hp}", True, GREEN)
        ai_hp_text = font.render(f"敌方生命: {ai_tank.hp}", True, RED)
        screen.blit(hp_text, (10, 10))
        screen.blit(ai_hp_text, (10, 40))

        if game_over:
            over_surf = font.render(game_result, True, WHITE)
            screen.blit(over_surf, (WIDTH//2 - 120, HEIGHT//2))

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()