Проект «Aim Trainer» — это тренажёр реакции и меткости, реализованный на языке Pascal с использованием графической библиотеки GraphABC. Программа предлагает два режима игры, ведёт подробную статистику, сохраняет прогресс в файл и имеет приятный анимированный интерфейс.
- Обзор
- Функционал
- Управление
- Запуск
- Техническая информация для разработчиков
- Возможные улучшения
- Лицензия
Aim Trainer — это игра, в которой игрок должен как можно быстрее и точнее кликать по появляющимся на экране кругам. Программа отслеживает время реакции, точность попадания (с учётом расстояния до центра круга), а также ведёт историю реакций, отображаемую в виде графика.
Особенности:
- Два режима: Classic (только левая кнопка мыши) и Dual (синие круги – ЛКМ, красные – ПКМ).
- Расчёт точности клика: попадание в центр даёт 100%, клик на середине радиуса – 50%, промах – 0%.
- График последних 50 реакций с шкалой от 0 до 1000 мс.
- Анимированный фон в главном меню (частицы, соединяющиеся линиями, и линии от курсора).
- Сохранение лучших результатов, средней точности и всей истории реакций в файл
stats.txt. - Возможность отключить визуальные эффекты в меню одним кликом вне кнопок.
| Функция | Описание |
|---|---|
| Главное меню | Отображает заголовок, кнопки выбора режима, график реакции и лучшие результаты. |
| Обратный отсчёт | Перед началом игры показывается 3, 2, 1 для подготовки. |
| Игровой процесс | На экране появляется круг, который плавно уменьшается. Игрок должен кликнуть по нему до исчезновения. |
| Режимы | Classic – клик ЛКМ по любому кругу. Dual – синий круг (ЛКМ) или красный (ПКМ). |
| Статистика в игре | FPS, счёт, точность (%), средняя реакция, оставшиеся жизни. |
| Окончание игры | При потере всех жизней (15) или по нажатию ESC появляется экран результатов с детальной статистикой. |
| Сохранение | Лучший счёт, лучшая точность, лучшая средняя реакция, количество сыгранных игр и все 50 последних реакций сохраняются в текстовый файл. |
| График реакции | В меню отображается график реакции с метками 0, 200, 400, 600, 800, 1000 мс. |
| Визуальные эффекты | Частицы движутся по экрану, между ними и от курсора рисуются линии. При наведении на заголовок появляется полупрозрачный круг. Все эффекты можно включить/выключить кликом вне кнопок. |
| Действие | Клавиша / Мышь |
|---|---|
| Выбор режима | Клик ЛКМ по кнопке в главном меню |
| Игра (Classic) | Клик ЛКМ по кругу |
| Игра (Dual) | Клик ЛКМ по синему кругу, ПКМ по красному |
| Завершить игру и показать результат | ESC (в любой момент игры) |
| Продолжить после Game Over | SPACE |
| Переключить эффекты меню | Клик ЛКМ в любом месте главного меню, кроме кнопок |
- Операционная система: Windows (рекомендуется).
- Среда разработки: PascalABC.NET (версия 3.8 или новее).
- Файлы проекта: все
.pasфайлы должны находиться в одной папке.
- Скачайте или склонируйте репозиторий.
- Откройте файл
AIM_Trainer_AI.pasв PascalABC.NET. - Нажмите F9 (или «Запустить») для компиляции и запуска.
- Убедитесь, что в папке есть файл
Base.pasиControl_AI.pas– они подключаются автоматически. - После первого запуска будет создан файл
stats.txtс начальными данными.
Примечание: Программа использует графический модуль GraphABC, входящий в стандартную поставку PascalABC.NET. Никаких дополнительных библиотек не требуется.
Проект состоит из трёх модулей:
-
Base.pas – базовые функции и процедуры:
Len2D– расстояние между точками.IfThen<T>– обобщённый тернарный оператор.DrawTextWithBackground– отрисовка текста на закруглённом фоне с тенью.DrawBezierLine– построение кривой Безье (используется в будущих расширениях).
-
Control_AI.pas – обработка ввода:
- Структуры
TButtonState,TInputState. - Глобальная переменная
Input. - Процедуры
InitInput,UpdateInput(вызывается в конце каждого кадра). - Функции для проверки состояний клавиш и мыши (
IsKeyPressed,IsMouseButtonPressedи т.д.).
- Структуры
-
AIM_Trainer_AI.pas – основной игровой модуль:
- Логика игры, отрисовка, меню, сохранение.
Хранит всё состояние игры:
TGameState = record
Score, TotalShots, Loses, WrongClicks: integer;
TotalReactionTime: integer;
TotalAccuracySum: real; // сумма точностей за все клики (0..1)
MaxLoses: integer; // 15 по умолчанию
Fail: boolean;
TryTime: integer; // время от начала игры (мс)
Circles: array of TCircle; // массив кругов (сейчас 1)
MaxRadius, MaxCTime, CCTime: integer;
ReactionHistory: array[0..49] of integer; // последние 50 значений
ReactionCount, ReactionIndex: integer;
FPS: integer;
GameMode: TGameMode; // gmClassic, gmDual
// ... прочие поля
end;Отвечает за один круг-мишень:
TCircle = record
X, Y, Time, SpawnTime, CType: integer;
procedure Spawn(...);
procedure Update(...);
procedure Render(...);
function GetHitInfo(...): THitInfo; // возвращает попадание и точность
end;Time– оставшееся время жизни (уменьшается вUpdate).CType– 0 (синий) или 1 (красный) для режима Dual.GetHitInfoвычисляет точность попадания в зависимости от расстояния до центра.
Кнопка меню с подсветкой при наведении.
Элемент фоновой анимации: позиция, скорость, методы обновления и отрисовки.
Хранит лучшие показатели из файла.
InitGameState()– сброс игры перед началом.UpdateGame()– обновление логики каждый кадр: движение кругов, обработка кликов, FPS.RenderGame()– отрисовка игрового поля.RenderMainMenu()– отрисовка главного меню (частицы, заголовок, кнопки, график, рекорды).RenderGameOver()– экран результатов.LoadStats()/SaveStats()– загрузка и сохранение данных в файлstats.txt.DrawParticles()– анимация частиц и линий.DrawGraph()– построение графика реакции.
Данные сохраняются в текстовый файл stats.txt в формате ключ=значение:
BestScore=42
BestAccuracy=87.5
BestAvgReaction=320.5
GamesPlayed=10
ReactionCount=15
ReactionIndex=5
Reaction0=280
Reaction1=310
...
История реакций хранится как кольцевой буфер размером 50. При завершении игры текущая сессия добавляется в сохранённый буфер (сохраняются последние 50 значений).
Главный цикл реализован через перечисление TScreen и конечный автомат:
scMainMenu→StartScreenscCountdown→CountdownScreenscGame→GameLoopscGameOver→GameOverScreen
В каждом цикле обязательно вызывается:
UpdateInput()– сброс одноразовых флагов ввода.Redraw– перерисовка.
Это обеспечивает корректную обработку кликов и клавиш.
- Добавление нескольких кругов одновременно (уже заложена структура
Circles). - Режим «Бесконечный» с возрастающей скоростью.
- Звуковое сопровождение.
- Поддержка мыши с несколькими кнопками.
- Возможность кастомизации цветов и параметров.
Данный проект распространяется под лицензией GPL 3.0.
Ссылка на официальный сайт PascalABC.NET: https://pascalabc.net/
Удачи в тренировках! 🎯