import pygame
import random
import time
import string

pygame.init()

WIDTH, HEIGHT = 800, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pygame 打字练习")

font = pygame.font.SysFont("Consolas", 32)
big_font = pygame.font.SysFont("Consolas", 48)

# 生成随机练习字符串（你可换成单词/句子）


def generate_text(length=30):
    return ''.join(random.choice(string.ascii_lowercase + ' ') for _ in range(length))


target_text = generate_text()
input_text = ""
index = 0
errors = 0
start_time = None
done = False

clock = pygame.time.Clock()

running = True
while running:
    screen.fill((30, 30, 30))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if not done and event.type == pygame.KEYDOWN:
            if start_time is None:
                start_time = time.time()

            if event.key == pygame.K_BACKSPACE:
                if index > 0:
                    input_text = input_text[:-1]
                    index -= 1
            elif event.key == pygame.K_RETURN:
                done = True
            else:
                ch = event.unicode
                input_text += ch
                if index < len(target_text) and ch == target_text[index]:
                    index += 1
                else:
                    errors += 1

    # 绘制目标文本
    screen.blit(big_font.render(target_text, True, (255, 255, 255)), (40, 80))

    # 绘制已输入文本
    input_color = (0, 255, 0) if index == len(input_text) else (255, 80, 80)
    screen.blit(big_font.render(input_text, True, input_color), (40, 160))

    # 提示
    hint = font.render("按 Enter 结束 | Backspace 删除", True, (180, 180, 180))
    screen.blit(hint, (40, 240))

    # 完成统计
    if done:
        elapsed = time.time() - start_time
        speed = len(target_text) / elapsed * 60 if elapsed > 0 else 0
        acc = (len(target_text) - errors) / len(target_text) * 100

        screen.blit(font.render(
            f"完成！用时: {elapsed:.2f}s", True, (255, 255, 0)), (40, 300))
        screen.blit(font.render(
            f"速度: {speed:.1f} 字/分钟", True, (255, 255, 0)), (40, 330))
        screen.blit(font.render(
            f"准确率: {acc:.1f}%", True, (255, 255, 0)), (40, 360))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
