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