Помоги, пожалуйста, прокомментировать подробно мой код:
import pygame
import random
import pandas as pd
import time

# Инициализация Pygame
pygame.init()

# Размеры окна
width, height = 800, 600
screen = pygame.display.set_mode((width, height))

# Загрузка изображений
hedgehog_image = pygame.image.load("img/hedgehog.jpg")
fox_image = pygame.image.load("img/fox.jpg")

# Загрузка звуков
dog_sound = pygame.mixer.Sound("sounds/dog_bark.wav")
rooster_sound = pygame.mixer.Sound("sounds/rooster_crow.wav")

# Тексты для режима "ошибок"
texts = [
    ("Кошка идёт по дороге", True),
    ("Рыба ходить на улица", False)
]

# Привязка клавиш
key_mapping = {
    pygame.K_h: "H",
    pygame.K_f: "F"
}

# Ответы для картинок
image_answers = {
    "hedgehog": "H",
    "fox": "F"
}

# Ответы для звуков
sound_answers = {
    "dog": "H",
    "rooster": "F"
}

# Ответы для текста
text_answers = {
    True: "H",
    False: "F"
}

# Запись результатов
results = []

# Время процедуры в секундах
duration = 1 * 60  # 1 минута
start_time = time.time()

def show_instructions():
    font = pygame.font.Font(None, 36)
    instructions = [
        "Выберите режим эксперимента:",
        "1 - Картинки (ежик и лиса)",
        "2 - Звуки животных (собака и петух)",
        "3 - Тексты (верные и ошибочные фразы)"
    ]
    screen.fill((0, 0, 0))
    for i, line in enumerate(instructions):
        rendered_line = font.render(line, True, (255, 255, 255))
        screen.blit(rendered_line, (width // 2 - rendered_line.get_width() // 2, height // 2 - rendered_line.get_height() // 2 + i * 40))
    pygame.display.flip()

    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    return 1
                elif event.key == pygame.K_2:
                    return 2
                elif event.key == pygame.K_3:
                    return 3

def show_mode_instructions(mode):
    font = pygame.font.Font(None, 36)
    if mode == 1:
        instructions = [
            "Режим Картинки:",
            "Нажмите H для ежика и F для лисы.",
            "Нажмите любую клавишу, чтобы начать."
        ]
    elif mode == 2:
        instructions = [
            "Режим Звуки:",
            "Нажмите H для собаки и F для петуха.",
            "Нажмите любую клавишу, чтобы начать."
        ]
    elif mode == 3:
        instructions = [
            "Режим Тексты:",
            "Нажмите H, если текст верный, и F, если неверный.",
            "Нажмите любую клавишу, чтобы начать."
        ]

    screen.fill((0, 0, 0))
    for i, line in enumerate(instructions):
        rendered_line = font.render(line, True, (255, 255, 255))
        screen.blit(rendered_line, (width // 2 - rendered_line.get_width() // 2, height // 2 - rendered_line.get_height() // 2 + i * 40))
    pygame.display.flip()

    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                waiting = False

def image_mode():
    image_type = random.choice(["hedgehog", "fox"])
    image = hedgehog_image if image_type == "hedgehog" else fox_image
    correct_answer = image_answers[image_type]
    
    screen.blit(image, (width // 2 - image.get_width() // 2, height // 2 - image.get_height() // 2))
    pygame.display.flip()
    
    return correct_answer

def sound_mode():
    sound_type = random.choice(["dog", "rooster"])
    sound = dog_sound if sound_type == "dog" else rooster_sound
    correct_answer = sound_answers[sound_type]
    
    sound.play()
    time.sleep(1)
    
    return correct_answer

def text_mode():
    text, is_correct = random.choice(texts)
    correct_answer = text_answers[is_correct]
    
    font = pygame.font.Font(None, 48)
    rendered_text = font.render(text, True, (255, 255, 255))
    screen.fill((0, 0, 0))
    screen.blit(rendered_text, (width // 2 - rendered_text.get_width() // 2, height // 2 - rendered_text.get_height() // 2))
    pygame.display.flip()
    
    return correct_answer

def run_experiment():
    global results
    mode = show_instructions()
    
    if mode == 1:
        experiment_function = image_mode
    elif mode == 2:
        experiment_function = sound_mode
    elif mode == 3:
        experiment_function = text_mode

    show_mode_instructions(mode)  # Показ инструкций для выбранного режима

    while time.time() - start_time < duration:
        correct_answer = experiment_function()
        
        reaction_start = time.time()
        response = None

        while response is None:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN and event.key in key_mapping:
                    response = key_mapping[event.key]
                    reaction_time = time.time() - reaction_start
                    is_correct = response == correct_answer

                    results.append({
                        "Mode": mode,
                        "Response": response,
                        "Correct": is_correct,
                        "ReactionTime": reaction_time
                    })
                    
                    screen.fill((0, 0, 0))
                    pygame.display.flip()
                    pygame.time.delay(1000)

                if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                    pygame.quit()
                    return

run_experiment()

pygame.quit()

df = pd.DataFrame(results)
df.to_csv('results.csv', index=False)
print("Results saved to results.csv")