Как можно управлять свойствами и цветом шрифта в консоли - C#

Узнай цену своей работы

Формулировка задачи:

Решил я создать консольную игру, но возникло несколько проблемс) 1)Как можно управлять свойствами и цветом шрифта в консоли(да, знаю куча тем про это есть уже, но нужного ответа так и не нашел). то бишь можно ли использовать больше 16 цветов, разные шрифты(моно и разноширинные), управлять курсивом и жирностью в ходе исполнения программы? нужна эта магия что бы в самой игре моношрифт ровно отображал карту, а разноширинный шрифт позволял делать крутую отрисовку диалогов(с лицами персонажей). по поводу кодировки не работает Console.OutputEncoding = Encoding.GetEncoding(12001); //параметр задан неверно хотя это UTF-32 п.с. есть вариант создать форму и переоборудовать в консоль... (если честные способы не найдутся) 2)Сделал код для отрисовки 2д графики, круг и квадрат по изи линии и треугольники баганные(может кто мой код подправит?)
  public static byte[,] trean(int i, int j, int x, int y, int x1, int y1,int x2,int y2, float str, byte yes)//треугольник
        {
            byte[,] bytes = new byte[i, j];
            float t=fpoly(x,y,x1,y1,x2,x2);
            float cx = x + x1 + x2 / 3.0f;
            float cy = y + y1 + y2 / 3.0f;
            float mm;
            
            float cxm=Math.Abs(x-cx);
            float cym = Math.Abs(y - cy);
            float cxm1 = Math.Abs(x1 - cx);
            float cym1 = Math.Abs(y1 - cy);
            float cxm2 = Math.Abs(x2 - cx);
            float cym2 = Math.Abs(y2 - cy);
 
            if(cxm>cym) mm=cxm; else mm=cym;
            float xm = cxm / mm; float ym = cym / mm;
 
            if (cxm1 > cym1) mm=cxm1; else mm=cym1;
            float xm1 = cxm1 / mm; float ym1 = cym1 / mm;
 
            if (cxm2 > cym2) mm =cxm2; else mm = cym2;
            float xm2 = cxm2 / mm; float ym2 = cym2 / mm;
 
            xm *= str; ym *= str; xm1 *= str; ym1 *= str; xm2 *= str; ym2 *= str;
 
            for (int iv = 0; iv < bytes.GetLength(0)-5; iv++)
            {
                for (int jv = 0; jv < bytes.GetLength(1)-5; jv++)
                {
                    float a = fpoly(jv, iv, x1, y1, x2, y2);
                    float a1 = fpoly(x, y, jv, iv, x2, y2);
                    float a2 = fpoly(x, y, x1, y1, jv, iv);
                    if (t==a+a1+a2)
                    {
                        if (str != 0)
                        {
                            float av = fpoly(jv, iv, xm1, ym1, xm2, ym2);
                            float av1 = fpoly(xm, ym, jv, iv, xm2, ym2);
                            float av2 = fpoly(xm, ym, xm1, ym1, jv, iv);
                            if (t != av + av1 + av2) bytes[iv, jv] = yes;
 
                        }
                        else
                        {
                            bytes[iv, jv] = yes;
                        }
                    }
                }
            } return bytes;
        }
        public static byte[,] line(int i, int j, int x, int y, int x1, int y1, float str, byte yes) //линия
        {
            double xc, xz, yc, yz;
            byte[,] bytes = new byte[i, j];
            for (int iv = 0; iv < bytes.GetLength(0); iv++)
            {
                for (int jv = 0; jv < bytes.GetLength(1); jv++)
                {

                        xc = x - x1;
                        xz = x1 - jv;
                        yc = y - y1;
                        yz = y1 - iv;
                        xc = xc / xz;
                        yc = yc / yz;
                        double s = Math.Abs(xc - yc);

                         { if (s > 0) { bytes[iv, jv] = yes; } }
                    
                }
            }
            return bytes;
        }
        public static byte[,] polygon(int i, int j, int[,]xy, int grad, float str, byte yes)//многоугольник
        {
            byte[,] bytes = new byte[i, j];
            int ii=0;
            int iii = 0;
            int t=0;
            for (int iv = 0; iv < bytes.GetLength(0); iv++)
            {
                ++ii;
                iii = ++ii;
                if (ii == bytes.GetLength(1) - 1) ii = 0;
                if (iii == bytes.GetLength(1) - 1) iii = 0;
                t = fpoly(xy[iv,0], xy[iv,1], xy[ii, 0], xy[ii, 1], xy[iii, 0], xy[iii, 1]) + t;
            }
            
            float mm;
            float cx=0;
            float cy=0;
            for (int iv = 0; iv < xy.GetLength(0); iv++) cx+=bytes[iv,0];
            cx /= bytes.GetLength(0);
            for (int iv = 0; iv < xy.GetLength(1); iv++) cy += bytes[iv, 1];
            cy /= bytes.GetLength(1);
            float[,] cxy = new float[xy.GetLength(0), xy.GetLength(1)];

            for (int iv = 0; iv < cxy.GetLength(0); iv++) cxy[iv,0] = Math.Abs(xy[iv,0] - cx);
            for (int iv = 0; iv < cxy.GetLength(0); iv++) cxy[iv, 1] = Math.Abs(xy[iv,1] - cx);
 
            for (int iv = 0; iv < cxy.GetLength(0); iv++)
            {
                if (cxy[iv,0] > cxy[iv,1]) mm = cxy[iv,0]; else mm=cxy[iv,1];
                 cxy[iv,0] = cxy[iv,0] / mm*str; cxy[iv,1] = cxy[iv,1] / mm*str;
            }
 
            for (int iv = 0; iv < cxy.GetLength(0); iv++)
            {
                for (int jv = 0; jv < cxy.GetLength(1); jv++)
                {
                    float a = 0;
                     ii = 0;
                    for (int ivv = 0; ivv < cxy.GetLength(0); ivv++)
                    {
                        ++ii;
                        if (ii == cxy.GetLength(1) - 1) ii = 0;
                        a = fpoly(jv, iv, xy[ivv,0], xy[ivv,1], xy[ii,0], xy[ii,1])+a;
                    }
 
                    if (t == a)
                    {
                        if (str != 0)
                          {
                            float av = 0;
                             iii = 0;
                            for (int ivv = 0; ivv < cxy.GetLength(0); ivv++)
                            {
                                ++iii;
                                if (iii == cxy.GetLength(1) - 1) iii = 0;
                                av = fpoly(jv, iv, xy[ivv, 0], xy[ivv, 1], xy[iii, 0], xy[iii, 1]) + av;
                            }
                            if (t != av)
                            {
                                bytes[i, j] = yes;
                            }
 
                          }
                        else
                        {
                            bytes[i, j] = yes;
                        }
                    }
                }
            } return bytes;
        }
       public static int fpoly(float x, float y, float x1, float y1, float x2, float y2)//подсчет площади треугольника
        {
           double s = Math.Abs((((x - x2) * (y1 - y2)) - ((x1 - x2) * (y - y2))) / 2.0);
           int ss = Convert.ToInt32(Math.Floor(s));
            return ss;
        }
С линиями должна работать формула (x1-x3)/(x2-x3)=(y1-y3)/(y2-3) С треугольником и полигоном, делим на кучу треугольников 1 из вершин которых наши координаты отрисовки, если сумма их плащадь = площади многоугольника, то рисуем, иначе нет до кривой линии вообще не дошел сорри за названия переменных, поскольку часто приходится их менять, пишу короче, но думаю понятно ii и iii это i увеличенные на 1 и 2 соответственно, iv - поскольку i j уже занято.
должно выглядеть примерно вот так(так же можно заметить что шрифт по высоте больше ширины и круг получается сплюснутым, может кто идейку подкинет исправления сие проблемы(кроме элипса)): 010000 010000 001000 001000 000100 000100 3)Отрисовка карты- я выбрал такой метод: 2 двумерных массива byte и int, byte- для технической карты проверки стен взаимодействия с врагами и прочее. int-содержит правила отрисовки карты. (Просто вдруг у кого появится более хорошая идея) 4)Нормальный звук а не Console.Beep(); хотя, думаю это я тоже сам решу. Ну вроде все проблемы перечислил, пойду менюшку напильником дорабатывать) Заранее спасибо!
О самой игре жанр jrpg, название Conman, сюжет типичный для жанра... а вот механика довольно необычная. 6 стихий- огонь вода ветер земля метал тьма огонь>ветер>земля>вода>огонь тьма против света и метал ко всем средне(физический урон) 4 класса брони железо, кожа, ткань, кольчуга... Так-же будет не совсем обычная система опыта, инвентарь, зелья, хардкор и прочее)))

Решение задачи: «Как можно управлять свойствами и цветом шрифта в консоли»

textual
Листинг программы
            Console.ForegroundColor = ConsoleColor.DarkRed;//Цвет текста
            Console.BackgroundColor = ConsoleColor.DarkYellow;//Фон текста
            Console.WriteLine("Цвета в консоли");
            Console.ReadKey();

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


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

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

9   голосов , оценка 3.889 из 5
Похожие ответы