Решение задачи «Авиаразведка» на C#

C#

Разработать программу «Авиаразведка». Создать условную карту местно-
сти размером N x N. В ячейках карты расположить некоторое количество раз-
личных целей (например, танки, пушки, склады с горюче-смазочными материа-
лами и др.). Из произвольной точки, находящейся на границе карты, стартует самолёт-разведчик. Достигнув противоположной границы карты, он меняет курс и
летит в обратном направлении. Так продолжается до тех пор, пока не будет по-
крыта вся карта местности. Самолёт-разведчик фиксирует цели, чьи координаты
совпадают с его координатами и по достижении границ карты сообщает в штаб
информацию о типе и количестве обнаруженных целей. Процесс полёта самолета
и расположение целей визуализировать с помощью символов псевдографики.

Решение задачи "Авиаразведка" на C#

Шаг 1 Создание класса Карта Map

Для создания карты N x M добавим в проект класс Map содержащие поля:

  • fields (char[,]) — Двумерный массив символов
  • rows (int) — кол-во строк, доступен только для чтения
  • columns (int) -кол-во столбцов, доступен только для чтения
  • Field (Dictionary<int, char>) — Словарь номер-символ, для генерации значений поля

Конструктор класса принимает два числа типа int, количество строк и столбцов, сохраняет их и запускает метод для генерации карты метод GenerateMap.

Так же добавим индексатор для получения доступа к массиву

public class Map
    {
        private char[,] fields;
        private int rows;
        private int columns;
        private Dictionary<int, char> Field = new Dictionary<int, char>
        {
            { 0, '-'},//Field
            { 1, 'T'},//Tank,
            { 2, 'B'},//Base,
            { 3, 'I'},//Infantry,
            { 4, '*'}//Fuel
        };
        public Map(int r, int c)
        {
            fields = new char[r, c];
            rows = r;
            columns = c;
            GenerateMap();
        }
        public int Rows { get { return rows; } }
        public int Columns { get { return columns; } }
        public char this[int N, int M]
        {
            get
            {
                if (N > rows || M >= columns)
                    throw new ArgumentOutOfRangeException();
                return fields[N, M];
            }
        }
        private void GenerateMap()
        {
            for (int i = 0; i < rows; i++)
                for (int j = 0; j < columns; j++)
                    fields[i, j] = Field[new Random().Next(0, 5)];
        }

 }

Шаг 2 Создание класса Самолет (Plane)

Создадим объект самолет с параметрами x и y, где хранится текущие координаты самолета. Свойство CurLine — возвращает значение текущей строки.

Свойство ShotMap — Массив с картой

allObjects — список для сохранения всех «сфотографированных» объектов.

При создании класса, конструктор заполняет массив ShotMap символами #.

Перед классом нужно объявить делегат dlgPlane

public delegate void dlgShot(object sender);

 

    public class Plane
    {
        private int x;
        private int y;
        private string curLine;
        private List<char> allObjects;
        private char[,] shotMap;

        public event dlgShot PlaneShot;
        public char[,] ShotMap { get; }
        public string CurLine
        {
            get
            {
                var b = getOneLine(x);
                curLine = String.Join(",", b);
                return curLine;
            }
        }
        public Plane(int row, int col)
        {
            x = 0;
            y = 0;
            shotMap = new char[row, col];
            allObjects = new List<char>();
            for (int i = 0; i < col; i++)
                for (int j = 0; j < row; j++)
                    shotMap[i, j] = '#';
        }
        public void ShotingField(int x, int y, char obj)
        {
            this.x = x;
            this.y = y;
            shotMap[x, y] = obj;
            allObjects.Add(obj);
            PlaneShot(this);
        }
        private char[] getOneLine(int line)
        {
            int cols = shotMap.GetLength(1);
            char[] a = new char[cols];
            for (int i = 0; i < cols; i++)
            {
                a[i] = shotMap[line, i];
            }

            return a;
        }
        public void GetCountObj()
        {
            var lst = allObjects.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
            foreach (var x in lst)
            {
                Console.WriteLine("Объект " + x.Key + " встречается " + x.Value + " р.");
            }
        }

    }

Шаг 3 Код в Main()

Объявим переменные для паузы SLEEP в мс. и размеры поля. После этого можно запускать наш самолет в полет нажав F5.

using ConsoleApp1;


const int SLEEP = 100;
const int ROWS = 20;
const int COLS = 20;
Dictionary<char,int>Fields = new Dictionary<char,int>();

Map map = new Map(ROWS, COLS);
Plane plane = new Plane(ROWS, COLS);
plane.PlaneShot += Plane_PlaneShot;

int currentLineCursor = Console.CursorTop;
for (var i = 0; i < map.Rows; i++)
{
    currentLineCursor = i;
    // -------------------- >>>>>>>>>>
    if (i % 2 == 0)
    {
        for (var x = 0; x < map.Columns; x++)
        {
            Console.SetCursorPosition(0, currentLineCursor);
            plane.ShotingField(i, x, map[i, x]);
            Thread.Sleep(SLEEP);
        }
        Console.WriteLine();
    } // <<<<<<<<<<<<<<< -----------------------
    else
    {
        for (var x = map.Columns - 1; x >= 0; x--)
        {
            Console.SetCursorPosition(0, currentLineCursor);
            plane.ShotingField(i, x, map[i, x]);
            Thread.Sleep(SLEEP);
        }
        Console.WriteLine();
    }

    Thread.Sleep(SLEEP);
}

plane.GetCountObj();

void Plane_PlaneShot(object sender)
{
    Plane pl = (Plane)sender;
    Console.WriteLine($"{pl.CurLine}");
}

Добавить комментарий