Разработать программу «Авиаразведка». Создать условную карту местно-
сти размером N x N. В ячейках карты расположить некоторое количество раз-
личных целей (например, танки, пушки, склады с горюче-смазочными материа-
лами и др.). Из произвольной точки, находящейся на границе карты, стартует самолёт-разведчик. Достигнув противоположной границы карты, он меняет курс и
летит в обратном направлении. Так продолжается до тех пор, пока не будет по-
крыта вся карта местности. Самолёт-разведчик фиксирует цели, чьи координаты
совпадают с его координатами и по достижении границ карты сообщает в штаб
информацию о типе и количестве обнаруженных целей. Процесс полёта самолета
и расположение целей визуализировать с помощью символов псевдографики.
Шаг 1 Создание класса Карта Map
Для создания карты N x M добавим в проект класс Map содержащие поля:
- fields (char[,]) — Двумерный массив символов
- rows (int) — кол-во строк, доступен только для чтения
- columns (int) -кол-во столбцов, доступен только для чтения
- Field (Dictionary<int, char>) — Словарь номер-символ, для генерации значений поля
Конструктор класса принимает два числа типа int, количество строк и столбцов, сохраняет их и запускает метод для генерации карты метод GenerateMap.
Так же добавим индексатор для получения доступа к массиву
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
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}"); } |