import pygame
import sys

# -------------------------- 游戏常量设置 --------------------------
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 600
TILE_SIZE = 40
WORLD_CHUNK_SIZE = 200  # 超大开放世界范围
FPS = 60

# 颜色定义
WHITE = (255, 255, 255)
GREEN = (34, 139, 34)
BROWN = (139, 69, 19)
BLUE = (30, 144, 255)
RED = (220, 20, 60)

# -------------------------- 玩家类 --------------------------
class Player:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 28
        self.height = 28
        self.speed = 5
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)

    def update(self, keys):
        dx, dy = 0, 0
        if keys[pygame.K_w]:
            dy -= self.speed
        if keys[pygame.K_s]:
            dy += self.speed
        if keys[pygame.K_a]:
            dx -= self.speed
        if keys[pygame.K_d]:
            dx += self.speed

        self.x += dx
        self.y += dy
        self.rect.x = self.x
        self.rect.y = self.y

    def draw(self, surface, camera_x, camera_y):
        draw_x = self.x - camera_x
        draw_y = self.y - camera_y
        pygame.draw.rect(surface, RED, (draw_x, draw_y, self.width, self.height))

# -------------------------- 世界地块生成 --------------------------
def get_tile_color(world_x, world_y):
    """简易程序化生成地形"""
    seed_val = (world_x * 7919 + world_y * 3571) % 100
    if seed_val < 12:
        return BLUE      # 水
    elif seed_val < 25:
        return BROWN     # 泥土
    else:
        return GREEN     # 草地

# -------------------------- 摄像机类 --------------------------
class Camera:
    def __init__(self):
        self.x = 0
        self.y = 0

    def follow(self, player):
        # 摄像机跟随玩家居中
        self.x = player.x - SCREEN_WIDTH // 2
        self.y = player.y - SCREEN_HEIGHT // 2

# -------------------------- 主游戏循环 --------------------------
def main():
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("Pygame开放世界沙盒")
    clock = pygame.time.Clock()

    player = Player(WORLD_CHUNK_SIZE//2, WORLD_CHUNK_SIZE//2)
    camera = Camera()

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

        # 事件监听
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        keys = pygame.key.get_pressed()
        player.update(keys)
        camera.follow(player)

        # 绘制可视范围内的地块
        start_tile_x = int(camera.x // TILE_SIZE) - 1
        start_tile_y = int(camera.y // TILE_SIZE) - 1
        end_tile_x = start_tile_x + SCREEN_WIDTH//TILE_SIZE + 3
        end_tile_y = start_tile_y + SCREEN_HEIGHT//TILE_SIZE + 3

        for tx in range(start_tile_x, end_tile_x):
            for ty in range(start_tile_y, end_tile_y):
                world_px = tx * TILE_SIZE
                world_py = ty * TILE_SIZE
                screen_x = world_px - camera.x
                screen_y = world_py - camera.y
                tile_color = get_tile_color(tx, ty)
                pygame.draw.rect(screen, tile_color, (screen_x, screen_y, TILE_SIZE-1, TILE_SIZE-1))

        # 绘制玩家
        player.draw(screen, camera.x, camera.y)

        pygame.display.flip()

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()
