Тренажёр реакции и меткости с графикой GraphABC. Проект на Pascal, открытый исходный код, 4 режима игры, достижения, статистика и профили.
- Обзор
- Функционал
- Скриншоты
- Управление
- Запуск
- Техническая информация для разработчиков
- Известные недочёты
- Возможные улучшения
- Лицензия
Aim Trainer – это полноценный тренажёр для развития реакции, меткости и точности движений мыши. Изначально проект задумывался как простая «кликалка по кругам», но со временем вырос в многорежимную программу с элементами геймификации, системой достижений, таблицей лидеров и профилями.
Всё написано на Pascal с использованием встроенной графической библиотеки GraphABC, входящей в состав PascalABC.NET. Проект открытый и распространяется под лицензией MIT.
| Режим | Описание |
|---|---|
| Classic | Классические клики ЛКМ по появляющимся кругам. Чем ближе к центру – тем выше точность. |
| Dual | Синие круги – ЛКМ, красные – ПКМ. |
| Tracking | Удерживай курсор на движущейся цели заданное время. Развивает плавность и стабильность движений. |
| Flick Shot | Круг появляется на долю секунды – нужно успеть кликнуть. Для очень быстрой реакции. |
- 8 достижений: Первая игра, В яблочко (точность ≥95%), Молниеносно (<150 мс), Комбо x100, Тысяча (1000 очков за игру), Снайпер (90% точности при 20+ выстрелах), Ветеран (1000 игр), Мастер Dual (500+ очков в Dual).
- Таблица лидеров – топ-10 по очкам для каждого режима, сохраняется в файл.
- Комбо-система – множитель очков x1.5 (5 подряд) и x2 (10 подряд).
- Размер круга, время жизни цели, количество жизней – всё настраивается.
- Звук – включается/отключается в настройках (через
System.Console.Beep). - Темы оформления: Тёмная, Неон, Минимализм.
- Отключение фоновых эффектов в меню по клику вне кнопок.
- След курсора во время игры.
- Вспышка, кольцевая волна и осколки при попадании.
- Всплывающий текст с количеством очков.
- Бомбы – с 15% шансом вместо цели появляется бомба (тёмный круг с белым крестом). Клик по ней – мгновенный провал. Не успел кликнуть – бомба исчезает без штрафа.
- Белая экранная вспышка при очень точном попадании (≥95%) – визуальный акцент без влияния на тайминг.
- График последних 50 реакций – сглажен кривой Безье, шкала 0–1000 мс.
- История сессий – все забеги сохраняются в CSV-файл (можно экспортировать и открыть в Excel).
- Профили – до 4 независимых профилей со своей статистикой, рекордами, настройками и достижениями.
- Автосохранение – прогресс сохраняется после каждой игры. При повреждении файла создаётся бэкап.
| Действие | Клавиша / Мышь |
|---|---|
| Выстрел (Classic / синий круг Dual) | ЛКМ |
| Выстрел (красный круг Dual) | ПКМ |
| Рестарт текущего режима (без сохранения) | R |
| Выход в меню (с сохранением) | M |
| Пауза | P |
| Завершить забег (сохранить) | Esc |
| Переключить эффекты в меню | Клик вне кнопок меню |
| Закрыть справку / настройки | Клик вне панели |
- Операционная система: Windows (рекомендуется).
- Среда разработки: PascalABC.NET (версия 3.8 или новее).
- Файлы проекта: все
.pasфайлы должны находиться в одной папке.
- Скачайте или склонируйте репозиторий.
- Откройте файл
AIM_Trainer_AI.pasв PascalABC.NET. - Нажмите F9 (или «Запустить») для компиляции и запуска.
- Убедитесь, что в папке есть все модули (
Base.pas,Control_AI.pas,AimCircle.pas) – они подключаются автоматически. - После первого запуска будут созданы файлы
profile1_stats.iniиprofile1_sessions.csvс начальными данными.
Примечание: Программа использует графический модуль GraphABC, входящий в стандартную поставку PascalABC.NET. Никаких дополнительных библиотек не требуется.
Проект состоит из четырёх модулей:
| Файл | Назначение |
|---|---|
Base.pas |
Базовые функции: обобщённый тернарный оператор IfThen<T>, отрисовка текста на фоне, кривая Безье. |
Control_AI.pas |
Обработка ввода (клавиатура, мышь) через события, структура TInputState, обновление флагов. |
AimCircle.pas |
Реализация логики кругов-целей (TCircle), их спавн, обновление, рендеринг, проверка попаданий, поддержка бомб и режимов Tracking/Flick. |
AIM_Trainer_AI.pas |
Основной игровой модуль: меню, экраны, состояния, статистика, достижения, профили, настройки, эффекты и горячие клавиши. |
Хранит всё состояние игры:
TGameState = record
Score: integer; // очки (зависят от размера цели)
Hits: integer; // чистое число попаданий
TotalShots: integer;
Loses: integer;
WrongClicks: integer;
TotalReactionTime: integer;
TotalPrecisionSum: real; // сумма точностей (0..1) для Precision
MaxLoses: integer;
Fail: boolean;
DiedToBomb: boolean;
TryTime: integer; // время от начала игры (мс)
Circles: array of TCircle;
MaxRadius, MaxCTime, CCTime: integer;
ReactionHistory: array[0..49] of integer; // последние 50 значений
ReactionCount, ReactionIndex: integer;
FPS: integer;
GameMode: TGameMode; // gmClassic / gmDual / gmTracking / gmFlick
Combo: integer; // текущая серия
MaxCombo: integer; // лучшая серия за забег
// ... прочие поля
end;Отвечает за один круг-мишень:
TCircle = record
X, Y, Time, SpawnTime, CType: integer;
SizeFactor: real; // 0.65..1.35 – влияет на очки
procedure Spawn(...);
procedure Update(...);
procedure Render(...);
function GetHitInfo(...): THitInfo; // возвращает попадание и точность
procedure UpdateHover(...); // для режима Tracking
end;Time– оставшееся время жизни (уменьшается вUpdate).CType– 0 (синий) или 1 (красный) для режима Dual.SizeFactor– случайный масштаб (меньше круг – больше очков).GetHitInfoвычисляет точность попадания в зависимости от расстояния до центра и определяет, попал ли игрок в бомбу.
Хранит лучшие результаты и флаги:
TStats = record
BestScore: integer;
BestAccuracy: real;
BestPrecision: real;
BestAvgReaction: real;
GamesPlayed: integer;
TutorialSeen: boolean;
end;Настройки пользователя:
TSettings = record
CircleSize: integer; // базовый радиус цели
LifetimeMs: integer; // время жизни цели
Lives: integer; // количество жизней
SoundEnabled: boolean;
end;InitGameState()– сброс игры перед началом.UpdateGame()– обновление логики каждый кадр: движение кругов, обработка кликов, FPS.ProcessClick(button)– унифицированная обработка кликов ЛКМ/ПКМ.FinishGameAndSaveStats()– подсчёт итогов, обновление рекордов, достижений и сохранение.RenderGame()– отрисовка игрового поля.RenderMainMenu()– отрисовка главного меню (частицы, плашка превью, кнопки режимов, график, рекорды).RenderGameOver()– экран результатов.LoadStats()/SaveStats()– загрузка и сохранение данных вprofileN_stats.ini.LogSession()– запись забега в CSV-файл.TryAddToLeaderboard()– обновление таблицы лидеров.
Данные сохраняются в INI-подобный файл profileN_stats.ini в формате ключ=значение:
[Stats]
BestScore=42
BestAccuracy=87.5
BestPrecision=78.3
BestAvgReaction=320.5
GamesPlayed=10
TutorialSeen=True
[Settings]
SetCircleSize=40
SetLifetimeMs=1000
SetLives=15
SetSoundEnabled=True
CurrentTheme=0
[ReactionHistory]
ReactionCount=15
ReactionIndex=5
Reaction0=280
Reaction1=310
...
[Achievements]
Achv0=True
Achv1=False
...
[Leaderboard]
LBCount0=5
LB00S=150
LB00A=85.5
...
История реакций хранится как кольцевой буфер размером 50. При завершении игры текущая сессия добавляется в сохранённый буфер (сохраняются последние 50 значений).
Главный цикл реализован через перечисление TScreen и конечный автомат:
scMainMenu→StartScreenscCountdown→CountdownScreenscGame→GameLoopscGameOver→GameOverScreen
В каждом цикле обязательно вызывается:
UpdateInput()– сброс одноразовых флагов ввода.Redraw– перерисовка.LimitFrameRate()– мягкое ограничение FPS (~240 кадров/с).
Это обеспечивает корректную обработку кликов и клавиш, а также защиту от излишней нагрузки CPU.
- Режим Flick Shot требует доработки – время появления круга очень мало, почти нереально успеть кликнуть. Планируется пересмотр механики.
- Код не идеален, есть места, которые можно сократить и оптимизировать. Рефакторинг – в планах.
- Настоящая светлая тема пока не реализована – все темы держатся на тёмном фоне, чтобы не переписывать десятки вызовов
Font.Color.
- Добавление нескольких кругов одновременно (уже частично заложена структура
Circles). - Режим «Бесконечный» с возрастающей скоростью.
- Звуковые эффекты через внешние библиотеки (сейчас
System.Console.Beep). - Поддержка мыши с более чем 3 кнопками.
- Сетевая таблица рекордов.
- Полноценная светлая тема оформления.
Данный проект распространяется под лицензией MIT – вы можете свободно использовать, модифицировать и распространять код с указанием авторства.
Ссылка на официальный сайт PascalABC.NET: https://pascalabc.net/
Удачи в тренировках! 🎯