diff --git a/src/Games/README.md b/src/Games/README.md
index e115c7b..b9289b9 100644
--- a/src/Games/README.md
+++ b/src/Games/README.md
@@ -1,41 +1,48 @@
-## ExtremeCodeOS games
+## ExtremeCodeOS Games
### Введение
Лучшая операционная система нуждается в играх,
чтобы было чем заняться после работы, без перехода
на другие ОС.
-Папка **games** в корне операционной системы содержит
+Папка **Games** в корне операционной системы содержит
ряд простых консольных казуальных игр.
### Игры
Игры с их описанием:
-- _ExtremeCodeOs_ _runner_
-Простой 3-х полосный раннер на С.
-_безопасный выход из игры_ _-_ _q_
+- _ExtremeCodeOs runner_
+ >Простой 3-х полосный раннер на С.
+ _Безопасный выход из игры - q._
- _Limpopo_ (#95)
>Древнее национальное развлечение племени Мумба-Юмба воплощено в нашей ОС в консольном варианте.
(Рекомендуется играть в одиночестве перед зеркалом)
-
-
- _TicTacToe_
- Игра крестики ноликина С.
+ >Игра крестики нолики на С.
Специально для ExtremeCodeOS.
Вводим с клавиатуры номер ячейки, которую
хотим ввести ```0 - 9```
- _Console Money Finder_
- Передвигайтесь по карте и
+ >Передвигайтесь по карте и
собирайте деньги.
Простая игра на C# специально
- для ExtremeCodeOS
+ для ExtremeCodeOS.
+
+- _React Game_
+ >Помечайте место,
+ где находится жёлтая звезда
+ и не промахивайтесь, помечая
+ космический мусор (Полный help в самой игре)
### Запуск
Все игры находятся в своих подпапках, как исходные
коды программ.
-В случае игры на С команда компиляции для gcc будет следующая:
+В случае игры на С, команда компиляции через **gcc** будет следующая:
+___
gcc <имя исходника>.c -O1 -o <имя игры>.<расширение>
-
---
+
+Скомпилированная версия игры **React Game** находится в релизах
+[официального репозитория](https://github.com/BlitGaming/ReactGame).
diff --git a/src/Games/ReactGame/Core/Difficulty.cs b/src/Games/ReactGame/Core/Difficulty.cs
new file mode 100644
index 0000000..ad0e01e
--- /dev/null
+++ b/src/Games/ReactGame/Core/Difficulty.cs
@@ -0,0 +1,11 @@
+namespace ReactGame.Core;
+
+// ReSharper disable UnusedMember.Global
+public enum Difficulty
+{
+ Training = 1,
+ Easy = 2,
+ Normal = 3,
+ Hard = 4,
+ JoJoMode = 5
+}
\ No newline at end of file
diff --git a/src/Games/ReactGame/Core/Game.cs b/src/Games/ReactGame/Core/Game.cs
new file mode 100644
index 0000000..8b414b5
--- /dev/null
+++ b/src/Games/ReactGame/Core/Game.cs
@@ -0,0 +1,124 @@
+using System.Diagnostics;
+
+namespace ReactGame.Core;
+
+public class Game : Menu
+{
+ private Random _random;
+ private int _goals;
+
+ public Game()
+ {
+ _random = new Random();
+ }
+
+ ///
+ /// Бесконечный цикл отрисовки кадров
+ ///
+ public override void Draw()
+ {
+ while (true)
+ {
+ Console.Clear();
+
+ int targetBlock = DrawSection();
+ var stopWatch = new Stopwatch();
+
+ stopWatch.Start();
+
+ string? userInput = Console.ReadLine();
+ int.TryParse(userInput, out var inputNumber);
+
+ if (userInput == "exit")
+ {
+ WriteText("\nВыход из игры...", ConsoleColor.Yellow);
+ Thread.Sleep(1000);
+
+ break;
+ }
+
+ stopWatch.Stop();
+
+ if (stopWatch.ElapsedMilliseconds > 5000 / ((int)Program.Difficulty / 2))
+ {
+ WriteText("\nВремя вышло!", ConsoleColor.Red);
+ Thread.Sleep(1000);
+
+ break;
+ }
+
+ if (inputNumber != targetBlock)
+ {
+ WriteText("\nНеверный ответ", ConsoleColor.Red);
+ Thread.Sleep(1000);
+
+ break;
+ }
+
+ _goals++;
+ }
+ }
+
+ ///
+ /// Рисует секцию блоков
+ ///
+ /// Номер целевого блока слева направо
+ private int DrawSection()
+ {
+ int leftCount = _random.Next(4 * (int) Program.Difficulty);
+ int rightCount = _random.Next(4 * (int) Program.Difficulty);
+
+ int targetBlock = -1;
+
+ WriteText($"Текущее количество очков: {_goals}.\n", ConsoleColor.Blue);
+
+ for (int i = 0; i <= leftCount; i++)
+ {
+ if (i == leftCount)
+ {
+ WriteText("* ", ConsoleColor.Yellow);
+
+ targetBlock = leftCount + 1;
+ }
+
+ int symbol = _random.Next(2);
+
+ switch (symbol)
+ {
+ case 0:
+ WriteText("= ");
+ break;
+ case 1:
+ WriteText("+ ");
+ break;
+ case 2:
+ WriteText("- ");
+ break;
+ }
+ }
+
+ for (int i = 0; i <= rightCount; i++)
+ {
+ if (rightCount <= 0) break;
+
+ int symbol = _random.Next(2);
+
+ switch (symbol)
+ {
+ case 0:
+ WriteText("= ");
+ break;
+ case 1:
+ WriteText("+ ");
+ break;
+ case 2:
+ WriteText("- ");
+ break;
+ }
+ }
+
+ Console.Write("\n\n");
+
+ return targetBlock;
+ }
+}
\ No newline at end of file
diff --git a/src/Games/ReactGame/Core/Menu.cs b/src/Games/ReactGame/Core/Menu.cs
new file mode 100644
index 0000000..c84fa87
--- /dev/null
+++ b/src/Games/ReactGame/Core/Menu.cs
@@ -0,0 +1,43 @@
+namespace ReactGame.Core;
+
+public abstract class Menu
+{
+ ///
+ /// Отрисовывает меню
+ ///
+ public abstract void Draw();
+
+ ///
+ /// Выводит цветной текст
+ ///
+ /// Выводимый текст
+ /// Используемый цвет
+ private protected static void WriteText(
+ string text, ConsoleColor color = ConsoleColor.Gray)
+ {
+ Console.ForegroundColor = color;
+ Console.Write(text);
+
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+
+ ///
+ /// Посимвольно выводит цветной текст
+ ///
+ /// Выводимый текст
+ /// Интервал между выводом 1 символа
+ /// Используемый цвет
+ private protected static void WritingText(
+ string text, float delay, ConsoleColor color = ConsoleColor.Gray)
+ {
+ Console.ForegroundColor = color;
+
+ foreach (var character in text)
+ {
+ Console.Write(character);
+ Thread.Sleep((int) (delay * 1000));
+ }
+
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+}
\ No newline at end of file
diff --git a/src/Games/ReactGame/Core/PreviewMenu.cs b/src/Games/ReactGame/Core/PreviewMenu.cs
new file mode 100644
index 0000000..79f1604
--- /dev/null
+++ b/src/Games/ReactGame/Core/PreviewMenu.cs
@@ -0,0 +1,125 @@
+#pragma warning disable CS8794
+namespace ReactGame.Core;
+
+public class PreviewMenu : Menu
+{
+ private readonly Random _random;
+
+ public PreviewMenu()
+ {
+ _random = new Random();
+ }
+
+ public override void Draw()
+ {
+ Console.Clear();
+
+ WritingText("ReactGame\n\n", 0.05f, GenerateColor());
+
+ if (Program.ShowsHelp)
+ {
+ ShowHelp();
+ }
+
+ AskForDifficulty();
+ AskForStartGame();
+ }
+
+ private static void ShowHelp()
+ {
+ WritingText(
+ "\nПомощь по игре:\n" +
+ "Цель игры - назвать правильный порядковый номер жёлтой звезды слева направо.\n" +
+ "Первый блок слева может быть звездой, а может быть космическим мусором. (Порядковый номер 1).\n" +
+ "Космический мусор - серый, звезда - жёлтая.\n" +
+ "Длина строки с блоками меняется рандомно и зависит от выбранной сложности.\n" +
+ "Чтобы выключить отображение помощи при каждом запуске, запускайте игру с параметром: -nh | -NH | --no-help.\n" +
+ "Нажмите любую кнопку, чтобы перейти к игре.", 0.075f, ConsoleColor.Yellow
+ );
+
+ Console.ReadKey();
+ Console.Clear();
+ }
+
+ private static void AskForDifficulty()
+ {
+ string[] names = Enum.GetNames(typeof(Difficulty));
+
+ for (int i = 1; i <= names.Length; i++)
+ {
+ WriteText($"{i}. {names[i - 1]}\n", ConsoleColor.Blue);
+ }
+
+ WriteText("Выберите номер сложности (от 1 до 6): ");
+
+ string? userInput = Console.ReadLine();
+ bool inputIsWrong = !int.TryParse(userInput, out var inputNumber);
+
+ if (inputIsWrong) throw new NullReferenceException();
+
+ if (inputNumber is not (1 or 2 or 3 or 4 or 5))
+ {
+ PoshlaNahui();
+ }
+ else
+ {
+ Program.Difficulty = (Difficulty)inputNumber;
+ }
+ }
+
+ private static void AskForStartGame()
+ {
+ WriteText("Хотите начать игру (Y либо N)? ");
+
+ string? userInput = Console.ReadLine();
+ Console.Write("\n");
+
+ switch (userInput)
+ {
+ case null:
+ throw new NullReferenceException();
+ case "n":
+ case "N":
+ NoNotAllowed();
+ break;
+ case "y":
+ case "Y":
+ Program.Game.Draw();
+ break;
+ default:
+ PoshlaNahui();
+ break;
+ }
+ }
+
+ ///
+ /// Генерирует рандомный цвет
+ ///
+ /// ConsoleColor
+ private ConsoleColor GenerateColor()
+ => (ConsoleColor)_random.Next(9, 15);
+
+ ///
+ /// Посылает тупую домохозяйку нахуй
+ ///
+ private static void PoshlaNahui()
+ {
+ Console.Clear();
+
+ WritingText(
+ "Тебе русским языком сказали сука, ты чё делаешь?", 0.1f);
+ Thread.Sleep(1000);
+
+ Environment.Exit(777);
+ }
+
+ private static void NoNotAllowed()
+ {
+ Console.Clear();
+
+ WritingText("Всмысле блять нет? А зачем ты вообще её запустил?", 0.1f);
+ Thread.Sleep(1000);
+
+ Environment.Exit(228);
+ }
+}
\ No newline at end of file
diff --git a/src/Games/ReactGame/Program.cs b/src/Games/ReactGame/Program.cs
new file mode 100644
index 0000000..b407959
--- /dev/null
+++ b/src/Games/ReactGame/Program.cs
@@ -0,0 +1,40 @@
+using System.Runtime.CompilerServices;
+using ReactGame.Core;
+// ReSharper disable InconsistentNaming
+#pragma warning disable CS8618
+
+namespace ReactGame;
+
+public static class Program
+{
+ private static PreviewMenu PreviewMenu;
+ public static Game Game;
+ public static Difficulty Difficulty;
+ public static bool ShowsHelp;
+
+ public static void Main(string[] args)
+ {
+ CheckForParams(args);
+
+ PreviewMenu = new PreviewMenu();
+ Game = new Game();
+
+ PreviewMenu.Draw();
+ }
+
+ private static void CheckForParams(string[] args)
+ {
+ if (args == null)
+ {
+ throw new ArgumentNullException();
+ }
+
+ if (args.Any(param => param is "-nh" or "-NH" or "--no-help"))
+ {
+ ShowsHelp = false;
+ return;
+ }
+
+ ShowsHelp = true;
+ }
+}
\ No newline at end of file
diff --git a/src/Games/ReactGame/README.md b/src/Games/ReactGame/README.md
new file mode 100644
index 0000000..3d1aca9
--- /dev/null
+++ b/src/Games/ReactGame/README.md
@@ -0,0 +1,11 @@
+## ReactGame - Игра на скорость реакции
+
+### Краткое описание
+Эта игра весьма полезна для домохозяек, ведь помогает повысить их скорость реакции аж до 1 минуты
+против прошлых 2 минут!
+
+Помощь и скомпилированная игра в
+[официальном репозитории](https://github.com/BlitGaming/ReactGame).
+
+>Обновления игры заливаются только в официальный репозиторий.
+Это **beta release, в котором много багов.**
diff --git a/src/Games/ReactGame/ReactGame.csproj b/src/Games/ReactGame/ReactGame.csproj
new file mode 100644
index 0000000..b9de063
--- /dev/null
+++ b/src/Games/ReactGame/ReactGame.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/src/Games/ReactGame/ReactGame.sln b/src/Games/ReactGame/ReactGame.sln
new file mode 100644
index 0000000..e2adb7c
--- /dev/null
+++ b/src/Games/ReactGame/ReactGame.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactGame", "ReactGame.csproj", "{ADED3EB6-49F6-46AE-8FFE-E5C315EF0819}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {ADED3EB6-49F6-46AE-8FFE-E5C315EF0819}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ADED3EB6-49F6-46AE-8FFE-E5C315EF0819}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ADED3EB6-49F6-46AE-8FFE-E5C315EF0819}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ADED3EB6-49F6-46AE-8FFE-E5C315EF0819}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal