コード例 #1
0
        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;
        }