Święta w ASCII Art

Transkrypt

Święta w ASCII Art
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
http://koolinus.wordpress.com/2008/12/25/merry-christmas-2008-edition/
trybie graficznym, wykorzystując fonty
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);
}
int main(void)
{
gotoxy(35, 2); // kolumna 35, wiersz 2
printf("Witaj!");
return 0;
}
Współrzędne znaków na ekranie:
Wiersz (y)
Kolumna (x)
x=0;y=0
x=1;y=0
x=2;y=0
x=3;y=0
...
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
#define
#define
#define
#define
#define
#define
#define
#define
CZARNY
NIEBIESKI
ZIELONY
CZERWONY
JASNOSC
MORSKI
PURPUROWY
BRAZOWY
SZARY
0
1
2
4
8
(NIEBIESKI + ZIELONY)
(CZERWONY + NIEBIESKI)
(CZERWONY + ZIELONY)
(CZERWONY + NIEBIESKI + ZIELONY)
#define
#define
#define
#define
#define
#define
JASNY_NIEBIESKI
JASNY_ZIELONY
JASNY_CZERWONY
TURKUSOWY
ROZOWY
ZOLTY
(JASNOSC
(JASNOSC
(JASNOSC
(JASNOSC
(JASNOSC
(JASNOSC
+
+
+
+
+
+
NIEBIESKI)
ZIELONY)
CZERWONY)
AQUA)
PURPUROWY)
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ę.
int main(void)
{
print(25, 5, JASNY_NIEBIESKI, CZARNY, "niebieski");
print(18, 5, JASNY_ZIELONY, CZARNY, "zielony");
print(10, 5, JASNY_CZERWONY, CZARNY, "czerwony");
return 0;
}
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
int main(void)
{
for(int i = 0; i < 10; i++)
{
clrscr(rand());
Sleep(100);
}
return 0;
}
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/5x103 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 main(void)
{
int licznik;
for (licznik = 0; licznik < 100; licznik++)
{
printf("%d \n", licznik);
Sleep(500);
}
return 0;
}
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!!

Podobne dokumenty