Podstawy Informatyki 1 mgr inż. Tomasz Jaworski Święta w ASCII Art Czym jest ASCII Art? ASCII-Art to sposób tworzenia bardzo prostych rysunków w programach komputerowych, w których pracuje się z tekstem (np. edytory, programy pocztowe, itp.). Rysunki te są układane za pomocą zwykłych znaków ASCII, stawianych na obszarze o stałej szerokości kolumn (stałej ilości znaków w każdym wierszu) oraz o stałej wysokości znaków (tym samym stopniu pisma). Tego typu sposób tworzenia grafiki, a raczej jej symbolizowania, nosi nazwę semigrafiki. Pierwotnie rysunki ASCII-Art tworzono w programach pracujących w trybie tekstowym, z czasem zaczęto tworzyć je również w programach pracujących w trybie graficznym, wykorzystując fonty http://koolinus.wordpress.com/2008/12/25/merry-christmas-2008-edition/ o stałym kroju pisma. ASCII-Art były początkowo tworzone z myślą o wydrukowaniu ich na drukarkach znakowych a nie graficznych. Obecnie stosowane są również np. w sygnaturkach programów pocztowych. Jednym z przykładów prostych ASCII-Art mogą być emotikony. Źródło: http://pl.wikipedia.org/wiki/ascii-art Jako przykład tego typu sztuki, posłużyć może poniższy napis Podstawy Informatyki. \ / _ (_) _/ / _ _ _ / _ \ / _` / / _` \ \ /\ / / '_ \ _/ _ \ ' '_ ` _ \ / _` / / (_) (_ \ \ (_ \ V V / _ _ (_) (_ _ _ < \_ \ / \,_ /\ \,_ \_/\_/ \, \ /_ _ _ \ / _ _ _ _ \,_ \ \, _ \_\_ / / / / Do jego utworzenia wykorzystano znaki \ / - ( ) V ` < >, dostępne z klawiatury. Rysunki ASCII Art można wyświetlać również w konsoli systemowej, za pomocą funkcji printf. Jednak natura tej funkcji nakłada pewne ograniczenia. Możliwy jest jeden kolor oraz brak zarządzania współrzędnymi (np. autor chce narysować losowe gwiazdki w różnych miejscach ekranu). W tym celu można wykorzystać funkcje systemowe (dla Windows a), aby wyświetlać dowolny napis pod dowolnie wybranymi współrzędnymi oraz w kolorze.
Wyświetlanie tekstu na współrzędnych i w kolorze Konsola tekstowa systemu Windows pozwala na wyświetlanie tekstów za pomocą funkcji putc/puts/printf itd... Tekst ten wyświetlany jest w domyślnym kolorze (szary na czarnym tle) oraz na współrzędnych określanych przez aktualną pozycję kursora. Wykorzystując funkcje z Windows API (ang. Application Programming Interface) możliwe jest dowolne ustawianie kursora w oknie konsoli oraz zmiana koloru wyświetlanych znaków oraz ich tła. Poniżej przedstawiono przykład funkcji która, korzystając z API konsoli systemu Windows, wyświetla tekst w dowolnym punkcie tej konsoli. Przykład: #include <windows.h> void gotoxy(int x, int y) HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD position = x, y; SetConsoleCursorPosition(hStdout, position); gotoxy(35, 2); // kolumna 35, wiersz 2 printf("witaj!"); Współrzędne znaków na ekranie: Kolumna (x) x=0;y=0 x=1;y=0 x=2;y=0 x=3;y=0... Wiersz (y) x=0;y=1 x=1;y=1 x=2;y=1...... x=0;y=2 x=1;y=2 x=2;y=2..................... A kolor? #include <windows.h> #define CZARNY 0 #define NIEBIESKI 1 #define ZIELONY 2 #define CZERWONY 4 #define JASNOSC 8 #define MORSKI (NIEBIESKI + ZIELONY) #define PURPUROWY (CZERWONY + NIEBIESKI) #define BRAZOWY (CZERWONY + ZIELONY) #define SZARY (CZERWONY + NIEBIESKI + ZIELONY) #define JASNY_NIEBIESKI #define JASNY_ZIELONY #define JASNY_CZERWONY #define TURKUSOWY #define ROZOWY #define ZOLTY (JASNOSC + NIEBIESKI) (JASNOSC + ZIELONY) (JASNOSC + CZERWONY) (JASNOSC + AQUA) (JASNOSC + PURPUROWY) (JASNOSC + ZOLTY0
#define BIALY (JASNOSC + SZARY) void print(int x, int y, int kolor_znaku, int kolor_tla, const char* tekst) HANDLE uchwyt_konsoli = GetStdHandle(STD_OUTPUT_HANDLE); // ustawienie kursora COORD position = x, y ; SetConsoleCursorPosition(uchwyt_konsoli, position); // zapamietanie aktualnego koloru WORD stary_kolor; CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(uchwyt_konsoli, &info); stary_kolor = info.wattributes; // ustawienie nowego koloru, wyswietlenie tkstu i przywrócenie koloru SetConsoleTextAttribute(uchwyt_konsoli, kolor_znaku + 16*kolor_tla); puts(tekst); SetConsoleTextAttribute(uchwyt_konsoli, stary_kolor); Oraz przykład wykorzystania funkcji print Wyświetla on tekst pod zadanymi współrzędnymi x,y oraz w kolorze, wybranym przez programistę. print(25, 5, JASNY_NIEBIESKI, CZARNY, "niebieski"); print(18, 5, JASNY_ZIELONY, CZARNY, "zielony"); print(10, 5, JASNY_CZERWONY, CZARNY, "czerwony"); wynik: Czyszczenie ekranu zadanym kolorem void clrscr(int kolor_tla) HANDLE uchwyt_konsoli = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = 0, 0; DWORD count; // pobranie informacji o oknie konsoli CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(uchwyt_konsoli, &info); // wypelnienie okna pustymi znakami (spacjami) FillConsoleOutputCharacter(uchwyt_konsoli, ' ', info.dwsize.x * info.dwsize.y, coord, &count); // ustawienie jednego koloru/tla dla kazdego znaku konsoli
FillConsoleOutputAttribute(uchwyt_konsoli, 16*kolor_tla, info.dwsize.x * info.dwsize.y, coord, &count); // ustawienie kursora w punkcie 0,0 SetConsoleCursorPosition(uchwyt_konsoli, coord); Przykład użycia Poniższy przykład czyści ekran losowo wybranymi kolorami z częstotliwością 10Hz for(int i = 0; i < 10; i++) clrscr(rand()); Sleep(100); Animacja - opóźnienia czasowe Ideą animacji jest wyświetlanie sekwencji obrazów z szybkością dobraną tak, aby widz miał wrażenie płynności ruchu. Sprowadza się to do wyświetlania obrazów statycznych z zadaną częstotliwością, np. 30fps (ang. frames per second). Zakładając, że programista chce wyświetlać 5 obrazów na sekundę (5fps), czas przerwy pomiędzy kolejnymi obrazami to 1/5 sekundy lub 1/5x10 3 milisekundy. Wykorzystanie funkcji Sleep pozwala na uzyskanie przerwy czasowej, o długości zależnej od parametru tej funkcji. Prototyp: void Sleep(unsigned int milliseconds); Parametr milliseconds to długość przerwy czasowej w milisekundach. Jedna sekunda to 1000ms; 1 minuta to 60,000ms. Sleep przykład Poniższy przykład wyświetla liczby z zakresu 0 99, przy czym przerwy czasowe pomiędzy wyświetleniem kolejnych to 500ms (0,5 sek). int licznik; for (licznik = 0; licznik < 100; licznik++) printf("%d \n", licznik); Sleep(500); I w końcu... Zadanie świąteczne Wyświetl na ekranie konsoli kolorową choinkę z animacjami świeczek, gwiazdek, itd.. Warunek zaliczenia: choinka ma być ładna ;-)
Jeśli rysowanie choinki wydaje się zbyt trudne (zdolności plastyczna na poziomie gry Wisielec), to animowany napis Wesołych Świat też będzie mile widziany. Do napisów polecam narzędzie konsolowe FIGLET lub jego implementację w postaci serwera WWW: http://asciiset.com/figletserver.html Powodzenia oraz Wesołych Świąt!!