Нарисовать фигуры в консоли без их пересечения - C#
Формулировка задачи:
Отображать новые фигуры(допустим квадрат) в области консоли ограниченного рамками размера(30х20) так, чтобы новые фигуры не пересекались с уже отображенными.
Пересечение вызывает исключение.
Вот что у меня есть. Собственно как сделать пересечения и прочее не знаю...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Figure
{
class Figure
{
int count;
int num;
public Figure()
{
count = 0;
num = 25;
}
public void Init()
{
string[] mas = new string[25];
for (int i = 0; i < mas.Length; i++)
{
mas[i] = "*";
}
}
public void View(string[] mas)
{
for (int i = 0; i < mas.Length; i++)
{
if (count % 5 == 0)
{
Console.Write("\n" + mas[i] + "\t");
count++;
}
else
{
Console.Write(mas[i] + "\t");
count++;
}
}
}
}
class Program
{
static void Main(string[] args)
{
}
}
}Решение задачи: «Нарисовать фигуры в консоли без их пересечения»
textual
Листинг программы
class Space
{
int[,] buffer; // Сюда рисуем и определяем пересечения
public Space()
{
Clear();
}
public void Clear()
{
buffer = new int[20, 30];
}
public void AddPoint(Figure f, int x, int y)
{
if (x < 0 || y < 0 || x >= buffer.GetLength(1) || y >= buffer.GetLength(0))
return;
int h = f.GetHashCode(); // Уникальное значение для каждой фигуры
if (buffer[y, x] != h && buffer[y, x] != 0)
throw new Exception("Пересечение !");
buffer[y, x] = h;
}
public void Draw()
{
Console.Clear();
Console.SetCursorPosition(0, 0);
for (int r = 0; r < buffer.GetLength(0); r++)
{
for (int c = 0; c < buffer.GetLength(1); c++)
{
Console.Write(buffer[r, c] != 0 ? '*' : ' ');
}
Console.WriteLine();
}
}
}
abstract class Figure
{
public readonly int Left; // Координата X
public readonly int Top; // Координата Y
public Figure(int Left, int Top)
{
this.Top = Top;
this.Left = Left;
}
public abstract void Draw(Space Space);
}
class Square : Figure
{
public readonly int Width; // Ширина
public Square(int Left, int Top, int Width)
: base(Left, Top)
{
this.Width = Width;
}
public override void Draw(Space Space)
{
for (int y = 0; y < Width; y++)
{
for (int x = 0; x < Width; x++)
{
Space.AddPoint(this, Left + x, Top + y);
}
}
}
}
public static class Program
{
public static void Main()
{
Space space = new Space();
Figure[] figures = {
new Square(0, 0, 5),
new Square(10, 10, 5),
new Square(28, 10, 5), // обрезается
// new Square(1, 1, 5), // пересечение с иключением
};
foreach (var figure in figures)
figure.Draw(space);
space.Draw();
Console.ReadLine();
}
}