Как можно управлять свойствами и цветом шрифта в консоли - C#
Формулировка задачи:
Решил я создать консольную игру, но возникло несколько проблемс)
1)Как можно управлять свойствами и цветом шрифта в консоли(да, знаю куча тем про это есть уже, но нужного ответа так и не нашел).
то бишь можно ли использовать больше 16 цветов, разные шрифты(моно и разноширинные), управлять курсивом и жирностью в ходе исполнения программы?
нужна эта магия что бы в самой игре моношрифт ровно отображал карту, а разноширинный шрифт позволял делать крутую отрисовку диалогов(с лицами персонажей).
по поводу кодировки не работает Console.OutputEncoding = Encoding.GetEncoding(12001); //параметр задан неверно хотя это UTF-32
п.с. есть вариант создать форму и переоборудовать в консоль... (если честные способы не найдутся)
2)Сделал код для отрисовки 2д графики, круг и квадрат по изи линии и треугольники баганные(может кто мой код подправит?)
должно выглядеть примерно вот так(так же можно заметить что шрифт по высоте больше ширины и круг получается сплюснутым, может кто идейку подкинет исправления сие проблемы(кроме элипса)):
010000
010000
001000
001000
000100
000100
3)Отрисовка карты- я выбрал такой метод: 2 двумерных массива byte и int,
byte- для технической карты проверки стен взаимодействия с врагами и прочее.
int-содержит правила отрисовки карты.
(Просто вдруг у кого появится более хорошая идея)
4)Нормальный звук а не Console.Beep(); хотя, думаю это я тоже сам решу.
Ну вроде все проблемы перечислил, пойду менюшку напильником дорабатывать)
Заранее спасибо!
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 уже занято.
О самой игре жанр jrpg, название Conman, сюжет типичный для жанра... а вот механика довольно необычная.
6 стихий- огонь вода ветер земля метал тьма
огонь>ветер>земля>вода>огонь тьма против света и метал ко всем средне(физический урон)
4 класса брони железо, кожа, ткань, кольчуга...
Так-же будет не совсем обычная система опыта, инвентарь, зелья, хардкор и прочее)))
Решение задачи: «Как можно управлять свойствами и цветом шрифта в консоли»
textual
Листинг программы
Console.ForegroundColor = ConsoleColor.DarkRed;//Цвет текста Console.BackgroundColor = ConsoleColor.DarkYellow;//Фон текста Console.WriteLine("Цвета в консоли"); Console.ReadKey();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д