public override void Draw(Drawer drawer) { drawer.Draw(this); }
public void Run() { GetKeyAsync(); // Запускаем асинхронный метод считывания ввода с клавиатуры drawer.PrepareField(name); // Отрисовываем игровое поле Console.CursorVisible = false; // Отключаем отображение курсора generate.Walls(); // Генерируем стены на карту while (!exit) // Запускаем игровой цикл, переменная exit модифицируется при помощи делегата передаваемого в объект змейки { if (toRemove.Count > 0) { // Проверяем список умерших юнитов, и удаляем их из списка юнитов. foreach (AbstractUnit unit in toRemove) { drawBuffer[unit.PosY, unit.PosX] = ' '; units.Remove(unit); } toRemove.Clear(); } for (int i = 0; i < units.Count; i++) { // Отрисовываем на поле элементы AbstractUnit из сгенерированного списка юнитов Units if (units[i] is IMovable) { // Элементы реализующие интерфейс IMovable производят движения и отрисовывают себя сами (units[i] as IMovable).Move(drawBuffer); } else { // Элементы класса AbstractUnit необходимо отрисовать вручную. drawBuffer[units[i].PosY, units[i].PosX] = units[i].Sign; } // Передаём элемент в змейку для проверки координат и реализации механик поедания, в случае если координаты совпадают snake.CheckPosition(units[i]); } snake.Move(drawBuffer); // Двигаем змейку freeCells.Clear(); // Очищаем список пустых ячеек drawer.Draw(); // Отрисовываем проделанную работу // Проверяем ввод с клавиатуры CheckSnakeDirection(); // Генерируем игровые объекты в пустых ячейках используя список пустых ячеек generate.Units(); // Осуществляем паузу между отрисовками Thread.Sleep(speed); } // Отрисовка экрана GAME OVER в случае завершения цикла while foreach (AbstractUnit unit in units) { // Убиваем асинхронные процессы живущих юнитов if (unit is IAging) { (unit as IAging).ItsTimeToDie(); } } Console.Clear(); Console.SetCursorPosition(53, 13); Output.Print("b", "r", " GAME OVER "); Console.SetCursorPosition(53, 14); Output.Print("w", "", " press enter "); Console.SetCursorPosition(53, 27); Output.Print("w", "", $" score: {stats[0]} "); Console.ReadKey(); Console.CursorVisible = true; }