#include #include #include #include #include #include #include #define A_POGRUBIONY (1 << 0) #define KOLOR_BRAK -1 #define KOLOR_CZARNY 0 #define KOLOR_CZERWONY 1 #define KOLOR_ZIELONY 2 #define KOLOR_BRAZOWY 3 #define KOLOR_NIEBIESKI 4 #define KOLOR_MAGENTA 5 #define KOLOR_CYJAN 6 #define KOLOR_BIALY 7 typedef struct { int attr; int kolor; } atrybut; static atrybut const bombki[] = { {A_POGRUBIONY, KOLOR_CZERWONY}, {A_POGRUBIONY, KOLOR_NIEBIESKI}, {A_POGRUBIONY, KOLOR_BRAZOWY}, {A_POGRUBIONY, KOLOR_MAGENTA}, {A_POGRUBIONY, KOLOR_CYJAN}, {A_POGRUBIONY, KOLOR_BIALY}, }; static int const ile_b = sizeof bombki / sizeof *bombki; static atrybut const spacja = {0, KOLOR_BRAK}; static atrybut const choinka = {0, KOLOR_ZIELONY}; static atrybut const podstawa = {0, KOLOR_BRAZOWY}; static atrybut const podpis = {A_POGRUBIONY, KOLOR_CZERWONY}; static atrybut const gwiazdka = {A_POGRUBIONY, KOLOR_BRAZOWY}; static void inicjuj_rng() { bool ok = false; unsigned ziarno; int f = open("/dev/urandom", O_RDONLY); if (f != -1) { if (read(f, &ziarno, sizeof ziarno) == sizeof ziarno) { ok = true; } close(f); } if (!ok) { ziarno = time(NULL); } srand(ziarno); } static char const rysunek[] = " *\n" " /.\\\n" " /..'\\\n" " /'.'\\\n" " /.''.'\\\n" " /.'.'.\\\n" " /'.''.'.\\\n" " jgs ^^^[_]^^^\n" ; static void ustaw(atrybut const* attr) { static atrybut ostatni = {-1, -1}; if (ostatni.attr == attr->attr && ostatni.kolor == attr->kolor) return; ostatni = *attr; putp(exit_attribute_mode); if ((attr->attr & A_POGRUBIONY) != 0) { putp(enter_bold_mode); } if (attr->kolor != KOLOR_BRAK) { putp(tparm(set_a_foreground, attr->kolor)); } } int main() { setvbuf(stdout, NULL, _IOFBF, BUFSIZ); inicjuj_rng(); setupterm(NULL, 1, NULL); atrybut const* kolor = &choinka; for (int i = 0; rysunek[i] != '\0'; i++) { char c = rysunek[i]; if (c == '[') kolor = &podstawa; atrybut const* akt = kolor; if (c >= 'a' && c <= 'z') akt = &podpis; if (c == '.') akt = &bombki[rand() % ile_b]; if (c == '*') akt = &gwiazdka; if (c == ' ' || c == '\n') akt = &spacja; if (c == ']') kolor = &choinka; ustaw(akt); putchar(c); } putp(exit_attribute_mode); return 0; }