На картинке консоль разбита на три сектора в большой вывод фигур, и они не должны выходить за рамки. Во втором добавление и перемещение последнего добавленного квадрата. Проблема в том, что я не могу создать этот ограниченный сектор, добавить фигуру и заставить двигаться фигуру. У меня получается вывести на экран фигуру, и все, на этом месте я застрял
В Main е добавил клавиши для управления они срабатывают но очень медленно. И иногда выдает такую ошибку как на втором скрине, не знаю как исправить.
Сразу извиняюсь за мой русский.
Прога профессора как все должно быть
class SahnePaneli
{
public SahnePaneli(int genislik, int yukseklik)
{
}
public void KonumAta(int x, int y)
{
}
public void Ciz()
{
//функция должна гарантировать, что все четырехугольная (Dortgen) форма, который можно сделать выресуются в область.
}
public void AktifSekilAta(Dortgen yeniSekil)
{
}
public void SekilSolaOtele()// активные функции четырехугольные формы используются для перемещения движущегося блока.
{//Каждый шаг должен быть сделан, когда контроль краш-теста.Активная Форма должна быть столкновением с границей ранее добавленных форм и сцен.
aktifSekil.SolaOtele();
if (aktifSekil.X == 0)
aktifSekil.SagaOtele();
}
public void SekilSagaOtele()
{
aktifSekil.SolaOtele();
if (aktifSekil.X == 0)
aktifSekil.SagaOtele();
}// вправо
public void SekilYukariOtele() { }//вверх
public void SekilAsagiOtele() { }//вниз
public bool SekillerCarpisiyormu()
{
return false;// на первое время сделал так что бы не мигала
}//проверка на то что бы последняя фигура при предвижении не влезла на предыдущюю
private int genislik;
private int yukseklik;
private int x;
private int y;
private Dortgen cizimAlani;
private Dortgen aktifSekil;
private int sekilSayisi;
private int maksimumSekilSayisi;
private Dortgen[] sekiller;
//cizimAlani новый объект используется для рисования границы сцены
//sekiller массив должен держать в себе ссылки класса Dikdortgen. размер этого каталога должен быть максимум 100.
//maksimumSekilSayi квота вместимости значений из Dortgen.
//Это значение должно быть меньше, чем 100.
//(Это значение может быть установлено в функции конструктора)
//sekilsayi, декорации был добавлен, чтобы указать количество четырехугольника.
//Каждый четырехугольник добавляют значение этой переменной должно быть увеличено на 1.
//aktifsekil содержит значени Dortgen Последнего добавленного объекта.
}
class BilgiPaneli// тут информациооная область (правая нижнея область)
{
public BilgiPaneli(int genislik, int yukseklik)
{
}//тут высота и ширина инфо области
//Функция Ciz() рисует поле BilgiPaneli.
//Функция BilgiCiz() предоставляет информацию, принадлежащую к активной форме в области рисования BilgiPaneli.
//Эта функция должна быть вызвана внутри Ciz().
public void KonumAta(int x, int y)
{
}
public void Ciz()
{
}
public void BilgiCiz()
{
}
public void SekilAta(Dortgen sekil)
{
}
private Dortgen aktifSekil;
private Dortgen cizimAlani;
private int genislik;
private int yukseklik;
private int x;
private int y;
}
class KontrolPaneli//тут панель контроля (верхняя правая область)
{
//Функция Ciz() рисует поле KontrolPaneli .
//Функция MenuCiz() отвечает за прорисовку значений KontrolPaneli
//Эта функция должна быть вызвана внутри Ciz().
public KontrolPaneli(int genislik, int yukseklik)
{
}
public void Ciz()
{
}
public void KonumAta(int x, int y)
{
}
public void MenuCiz()
{
}//тут вывод меню
private int genislik;
private int yukseklik;
private int x;
private int y;
private Dortgen cizimAlani;
}
class RastgeleSayi//Рандомное числа
{
public static int SayiUret(int min, int max)
{
if (rastgele == null)
rastgele = new Random();
return rastgele.Next(min, max);
}
private static Random rastgele;
}
class KarakterSeti // сдесь символы для постройки квадрата
{
public static char SolUstKose = '╔';
public static char SagUstKose = '╗';
public static char Duz = '═';
public static char Dikey = '║';
public static char SolAltKose = '╚';
public static char SagAltKose = '╝';
}
class Dortgen
{
public Dortgen() // здесь зодается высота и ширина рандомными числами, цвет так же и кординаты так же рандомно
{
this.genislik = RastgeleSayi.SayiUret(2, 20);
this.yukseklik = RastgeleSayi.SayiUret(2, 10);
renk = (ConsoleColor)RastgeleSayi.SayiUret(1, 15);
x = RastgeleSayi.SayiUret(1, 79);
y = RastgeleSayi.SayiUret(1, 79);
}
public Dortgen(int xSinir, int ySinir)
{
this.xSinir = xSinir;
this.ySinir = ySinir;
}
public void ciz() // тут все собирается
{
ConsoleColor ilkrenk = Console.ForegroundColor;
TepeCiz();
DikeyCiz();
TabanCiz();
}
public void DikeyCiz()//сдесь вертикальные столбци
{
ConsoleColor ilkrenk = Console.ForegroundColor;
for (int i = 1; i < yukseklik; i++)
{
Console.SetCursorPosition(x, y + i);
Console.Write(KarakterSeti.Dikey);
Console.SetCursorPosition(x + genislik + 1, y + i);
Console.Write(KarakterSeti.Dikey);
}
Console.ForegroundColor = ilkrenk;
}
public void TepeCiz()//сдесь нижняя часть квадрата
{
Console.ForegroundColor = renk;
Console.SetCursorPosition(x, y);
Console.Write(KarakterSeti.SolUstKose);
for (int i = 0; i < genislik; i++)
Console.Write(KarakterSeti.Duz);
Console.Write(KarakterSeti.SagUstKose);
}
public void TabanCiz()//здесь верхняя часть
{
Console.SetCursorPosition(x, y + yukseklik);
Console.Write(KarakterSeti.SolAltKose);
for (int i = 0; i < genislik; i++)
Console.Write(KarakterSeti.Duz);
Console.Write(KarakterSeti.SagAltKose);
}
public void SolaOtele()//сдесь я попытался сделать что бы двигалось в право и влево и вниз верх
{
x -= 1;
}
public void SagaOtele()
{
x += 1;
}
public void YukariOtele()
{
y -= 1;
}
public void AsagiOtele()
{
y += 1;
}
public void boyutAta(int genislik, int yukseklik)
{
this.genislik = genislik;
this.yukseklik = yukseklik;
}
public void RenkAta(ConsoleColor renk)
{
this.renk = renk;
}
private int genislik;
private int yukseklik;
private ConsoleColor renk;
private int x;
private int y;
private int xSinir;
private int ySinir;
public int X
{
get{ return x; }
}
public int Y
{
get { return y; }
}
}
class Program
{
static void Main(string[] args)
{
Dortgen dkg = new Dortgen();
while (true)
{
if (Console.ReadKey(true).Key == ConsoleKey.W)
{
dkg.YukariOtele();
}
else if (Console.ReadKey(true).Key == ConsoleKey.A)
{
dkg.SolaOtele();
}
else if (Console.ReadKey(true).Key == ConsoleKey.D)
{
dkg.SagaOtele();
}
else if (Console.ReadKey(true).Key == ConsoleKey.S)
{
dkg.AsagiOtele();
}
Console.Clear();
dkg.ciz();
}
}
}
Ответ
Из вашего вопроса, я понял что у вас две проблемы.
Скорость вывода и реакции консоли. Об этом я уже отвечал тут, оставлю ссылку на ответ. В принципе, все необходимое там описано, надеюсь с чтением проблем не возникнет, если что оставьте комментарий, постараемся найти взаимно понятный язык. Про особенности работы с консолью
Вычисление допустимых размеров и координат фигуры, чтобы она не вылетала за границы отведенной области.
Для исправления ошибки, достаточно немного изменить параметры генерации фигур.
public Dortgen()
{
this.genislik = RastgeleSayi.SayiUret(2, 20);
this.yukseklik = RastgeleSayi.SayiUret(2, 10);
renk = (ConsoleColor)RastgeleSayi.SayiUret(1, 15);
x = RastgeleSayi.SayiUret(1, areaWidth - this.genislik + 1);
y = RastgeleSayi.SayiUret(1, areaHeight - this.yukseklik + 1);
}
где:
areaWidth - ширина области вывода, меньше либо равно Console.WindowWidth
areaHeight - высота области вывода меньше либо равно Console.WindowHeight
аналогично проверяем пару (x,y) на допустимость значений.
if((x > 0) && (x < areaWidth - this.genislik + 1)
&& (y > 0) && (y < areaHeight - this.yukseklik + 1))
{
//логика движения или чего-то еще
}
Комментариев нет:
Отправить комментарий