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

Шаг 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}");
}







