import pygame
import sys

pygame.init()
WIDTH = 640
HEIGHT = 480
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("双人乒乓球对战")

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 30, 30)
BLUE = (20, 30, 220)

# 字体（海龟编辑器兼容）
font = pygame.font.Font(None, 50)
tip_font = pygame.font.Font(None, 32)

# 球拍参数
paddle_w = 12
paddle_h = 90
paddle_speed = 6

# 左球拍
left_x = 20
left_y = HEIGHT // 2 - paddle_h // 2
# 右球拍
right_x = WIDTH - 32
right_y = HEIGHT // 2 - paddle_h // 2

# 小球
ball_size = 14
ball_x = WIDTH // 2
ball_y = HEIGHT // 2
ball_dx = 4
ball_dy = 4

score_left = 0
score_right = 0
win_score = 10
game_over = False

clock = pygame.time.Clock()

# 重置小球位置
def reset_ball():
    global ball_x, ball_y, ball_dx, ball_dy
    ball_x = WIDTH // 2
    ball_y = HEIGHT // 2
    ball_dx *= -1
    ball_dy = 4 if ball_dy > 0 else -4

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

    # 事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r and game_over:
                score_left = 0
                score_right = 0
                game_over = False
                reset_ball()

    if not game_over:
        # 按键检测
        keys = pygame.key.get_pressed()
        # 左边 W S
        if keys[pygame.K_w] and left_y > 0:
            left_y -= paddle_speed
        if keys[pygame.K_s] and left_y < HEIGHT - paddle_h:
            left_y += paddle_speed
        # 右边 上下箭头
        if keys[pygame.K_UP] and right_y > 0:
            right_y -= paddle_speed
        if keys[pygame.K_DOWN] and right_y < HEIGHT - paddle_h:
            right_y += paddle_speed

        # 小球移动
        ball_x += ball_dx
        ball_y += ball_dy

        # 上下墙壁反弹
        if ball_y <= 0 or ball_y >= HEIGHT - ball_size:
            ball_dy *= -1

        # 球拍碰撞
        left_paddle = pygame.Rect(left_x, left_y, paddle_w, paddle_h)
        right_paddle = pygame.Rect(right_x, right_y, paddle_w, paddle_h)
        ball_rect = pygame.Rect(ball_x, ball_y, ball_size, ball_size)

        if ball_rect.colliderect(left_paddle) or ball_rect.colliderect(right_paddle):
            ball_dx *= -1

        # 得分判定
        if ball_x < 0:
            score_right += 1
            reset_ball()
        if ball_x > WIDTH:
            score_left += 1
            reset_ball()

        # 判断胜利
        if score_left >= win_score or score_right >= win_score:
            game_over = True

    # 绘制中间虚线
    for y in range(0, HEIGHT, 30):
        pygame.draw.rect(screen, WHITE, (WIDTH//2 - 2, y, 4, 15))

    # 绘制球拍
    pygame.draw.rect(screen, RED, (left_x, left_y, paddle_w, paddle_h))
    pygame.draw.rect(screen, BLUE, (right_x, right_y, paddle_w, paddle_h))
    # 绘制小球
    pygame.draw.ellipse(screen, WHITE, (ball_x, ball_y, ball_size, ball_size))

    # 分数显示
    text_l = font.render(str(score_left), True, RED)
    text_r = font.render(str(score_right), True, BLUE)
    screen.blit(text_l, (WIDTH//4, 20))
    screen.blit(text_r, (WIDTH*3//4, 20))

    # 游戏结束弹窗
    if game_over:
        overlay = pygame.Surface((WIDTH, HEIGHT))
        overlay.set_alpha(150)
        overlay.fill(BLACK)
        screen.blit(overlay, (0, 0))
        if score_left >= win_score:
            win_text = font.render("红方胜利！", True, RED)
        else:
            win_text = font.render("蓝方胜利！", True, BLUE)
        tip_text = tip_font.render("按 R 重新开始", True, WHITE)
        screen.blit(win_text, win_text.get_rect(center=(WIDTH//2, HEIGHT//2 - 30)))
        screen.blit(tip_text, tip_text.get_rect(center=(WIDTH//2, HEIGHT//2 + 20)))

    pygame.display.update()

pygame.quit()
sys.exit()