import pygame
import random

# 初始化
pygame.init()

# 窗口设置
WIDTH = 600
HEIGHT = 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("卡通贪吃蛇 无敌版")
clock = pygame.time.Clock()

# 卡通配色
BG_COLOR = (22, 28, 42)
SNAKE_MAIN = (50, 210, 120)
SNAKE_EDGE = (30, 160, 85)
FOOD_RED = (255, 70, 90)
WHITE = (255, 255, 255)

# 基础参数
grid = 20
speed = 10

# 兼容旧版字体
font = pygame.font.Font(None, 36)

# 蛇初始数据
snake = [[WIDTH // 2, HEIGHT // 2]]
dx = grid
dy = 0

# 生成食物


def new_food():
    x = random.randrange(0, WIDTH - grid, grid)
    y = random.randrange(0, HEIGHT - grid, grid)
    return [x, y]


food = new_food()
score = 0

# 主循环
while True:
    clock.tick(speed)
    screen.fill(BG_COLOR)

    # 关闭窗口
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # 方向控制（禁止反向直接撞自己）
    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP] and dy != grid:
        dx, dy = 0, -grid
    if keys[pygame.K_DOWN] and dy != -grid:
        dx, dy = 0, grid
    if keys[pygame.K_LEFT] and dx != grid:
        dx, dy = -grid, 0
    if keys[pygame.K_RIGHT] and dx != -grid:
        dx, dy = grid, 0

    # 蛇头移动
    head_x, head_y = snake[0]
    new_x = head_x + dx
    new_y = head_y + dy

    # ========== 穿墙特效：撞墙不死，无缝传送 ==========
    if new_x >= WIDTH:
        new_x = 0
    elif new_x < 0:
        new_x = WIDTH - grid
    if new_y >= HEIGHT:
        new_y = 0
    elif new_y < 0:
        new_y = HEIGHT - grid

    # 添加新蛇头
    snake.insert(0, [new_x, new_y])

    # 吃食物
    if new_x == food[0] and new_y == food[1]:
        score += 1
        food = new_food()
    else:
        snake.pop()

    # ========== 去掉撞自己死亡判定，随便撞 ==========

    # 绘制卡通圆润蛇（椭圆，不是方块）
    for body in snake:
        x, y = body
        pygame.draw.ellipse(screen, SNAKE_MAIN, (x, y, grid, grid))
        pygame.draw.ellipse(screen, SNAKE_EDGE, (x, y, grid, grid), 2)

    # 绘制卡通圆形食物
    pygame.draw.ellipse(screen, FOOD_RED, (food[0], food[1], grid, grid))

    # 分数显示
    score_text = font.render("Score : " + str(score), True, WHITE)
    screen.blit(score_text, (15, 15))

    pygame.display.update()
