Skip to content

Latest commit

 

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Aim Trainer на PascalABC.NET

Тренажёр реакции и меткости с графикой GraphABC. Проект на Pascal, открытый исходный код, 4 режима игры, достижения, статистика и профили.

Pascal License: MIT


📌 Содержание


Обзор

Aim Trainer – это полноценный тренажёр для развития реакции, меткости и точности движений мыши. Изначально проект задумывался как простая «кликалка по кругам», но со временем вырос в многорежимную программу с элементами геймификации, системой достижений, таблицей лидеров и профилями.

Всё написано на Pascal с использованием встроенной графической библиотеки GraphABC, входящей в состав PascalABC.NET. Проект открытый и распространяется под лицензией MIT.


Функционал

🎮 Режимы игры (4 шт.)

Режим Описание
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 независимых профилей со своей статистикой, рекордами, настройками и достижениями.
  • Автосохранение – прогресс сохраняется после каждой игры. При повреждении файла создаётся бэкап.

Скриншоты

image image

Управление

Действие Клавиша / Мышь
Выстрел (Classic / синий круг Dual) ЛКМ
Выстрел (красный круг Dual) ПКМ
Рестарт текущего режима (без сохранения) R
Выход в меню (с сохранением) M
Пауза P
Завершить забег (сохранить) Esc
Переключить эффекты в меню Клик вне кнопок меню
Закрыть справку / настройки Клик вне панели

Запуск

Требования

  • Операционная система: Windows (рекомендуется).
  • Среда разработки: PascalABC.NET (версия 3.8 или новее).
  • Файлы проекта: все .pas файлы должны находиться в одной папке.

Инструкция

  1. Скачайте или склонируйте репозиторий.
  2. Откройте файл AIM_Trainer_AI.pas в PascalABC.NET.
  3. Нажмите F9 (или «Запустить») для компиляции и запуска.
  4. Убедитесь, что в папке есть все модули (Base.pas, Control_AI.pas, AimCircle.pas) – они подключаются автоматически.
  5. После первого запуска будут созданы файлы 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

Хранит всё состояние игры:

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

Отвечает за один круг-мишень:

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

Хранит лучшие результаты и флаги:

TStats = record
  BestScore: integer;
  BestAccuracy: real;
  BestPrecision: real;
  BestAvgReaction: real;
  GamesPlayed: integer;
  TutorialSeen: boolean;
end;

TSettings

Настройки пользователя:

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 и конечный автомат:

  • scMainMenuStartScreen
  • scCountdownCountdownScreen
  • scGameGameLoop
  • scGameOverGameOverScreen

В каждом цикле обязательно вызывается:

  • UpdateInput() – сброс одноразовых флагов ввода.
  • Redraw – перерисовка.
  • LimitFrameRate() – мягкое ограничение FPS (~240 кадров/с).

Это обеспечивает корректную обработку кликов и клавиш, а также защиту от излишней нагрузки CPU.


Известные недочёты

  • Режим Flick Shot требует доработки – время появления круга очень мало, почти нереально успеть кликнуть. Планируется пересмотр механики.
  • Код не идеален, есть места, которые можно сократить и оптимизировать. Рефакторинг – в планах.
  • Настоящая светлая тема пока не реализована – все темы держатся на тёмном фоне, чтобы не переписывать десятки вызовов Font.Color.

Возможные улучшения

  • Добавление нескольких кругов одновременно (уже частично заложена структура Circles).
  • Режим «Бесконечный» с возрастающей скоростью.
  • Звуковые эффекты через внешние библиотеки (сейчас System.Console.Beep).
  • Поддержка мыши с более чем 3 кнопками.
  • Сетевая таблица рекордов.
  • Полноценная светлая тема оформления.

Лицензия

Данный проект распространяется под лицензией MIT – вы можете свободно использовать, модифицировать и распространять код с указанием авторства.


Ссылка на официальный сайт PascalABC.NET: https://pascalabc.net/

Удачи в тренировках! 🎯

About

AIM trainer written on PascalABC.NET

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages