Нарисовать фигуры в консоли без их пересечения - 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();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5