Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Сдвиг вправо, сдвиг влево квадрата, и как сделать, чтобы все это было в ограниченном секторе

На картинке консоль разбита на три сектора в большой вывод фигур, и они не должны выходить за рамки. Во втором добавление и перемещение последнего добавленного квадрата. Проблема в том, что я не могу создать этот ограниченный сектор, добавить фигуру и заставить двигаться фигуру. У меня получается вывести на экран фигуру, и все, на этом месте я застрял В 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)) { //логика движения или чего-то еще }

Комментариев нет:

Отправить комментарий