Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions src/Games/README.md
Original file line number Diff line number Diff line change
@@ -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).
11 changes: 11 additions & 0 deletions src/Games/ReactGame/Core/Difficulty.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace ReactGame.Core;

// ReSharper disable UnusedMember.Global
public enum Difficulty
{
Training = 1,
Easy = 2,
Normal = 3,
Hard = 4,
JoJoMode = 5
}
124 changes: 124 additions & 0 deletions src/Games/ReactGame/Core/Game.cs
Original file line number Diff line number Diff line change
@@ -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();
}

/// <summary>
/// Бесконечный цикл отрисовки кадров
/// </summary>
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++;
}
}

/// <summary>
/// Рисует секцию блоков
/// </summary>
/// <returns>Номер целевого блока слева направо</returns>
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;
}
}
43 changes: 43 additions & 0 deletions src/Games/ReactGame/Core/Menu.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
namespace ReactGame.Core;

public abstract class Menu
{
/// <summary>
/// Отрисовывает меню
/// </summary>
public abstract void Draw();

/// <summary>
/// Выводит цветной текст
/// </summary>
/// <param name="text">Выводимый текст</param>
/// <param name="color">Используемый цвет</param>
private protected static void WriteText(
string text, ConsoleColor color = ConsoleColor.Gray)
{
Console.ForegroundColor = color;
Console.Write(text);

Console.ForegroundColor = ConsoleColor.Gray;
}

/// <summary>
/// Посимвольно выводит цветной текст
/// </summary>
/// <param name="text">Выводимый текст</param>
/// <param name="delay">Интервал между выводом 1 символа</param>
/// <param name="color">Используемый цвет</param>
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;
}
}
125 changes: 125 additions & 0 deletions src/Games/ReactGame/Core/PreviewMenu.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}

/// <summary>
/// Генерирует рандомный цвет
/// </summary>
/// <returns>ConsoleColor</returns>
private ConsoleColor GenerateColor()
=> (ConsoleColor)_random.Next(9, 15);

/// <summary>
/// Посылает тупую домохозяйку нахуй
/// </summary>
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);
}
}
Loading