Komputery to maszyny liczące, dla których istnieją tylko zera i jedynki, ale to pewnie już wiesz. Sprytni ludzie wymyślili, że można za pomocą tych dwóch cyfr zrobić jednak więcej niż tylko liczyć. Można zapisywać różne inne informacje, wykorzystując wszelakie działania na zerach i jedynkach.
Jednym z ciekawych pomysłów był tekst, który mógł być tak zapisywany. Zaistniała jednak ciekawsza idea – otóż za pomocą komputerów zaczęto zapisywać siatki tzw. pikseli - małych punktów o konkretnym kolorze. I tak od punktu do punktu, w siatce zaczęło być tyle pikseli, że zaczęły tworzyć wzory, a następnie skomplikowaną grafikę. Nazwaliśmy to bitmapą.
Bitmapa to dwuwymiarowy obraz, w którym każdy piksel może mieć jeden z wielu kolorów. Dziś wykorzystamy podobny koncept. Użyjemy bowiem wielolinijkowego łańcucha znaków, jako właśnie bitmapy. Spacja będzie tutaj reprezentować pustą przestrzeń, a pozostałe znaki będą znakami wiadomości użytkownika. Można powiedzieć, że zaczniemy zajmować się trochę grafiką, ale taką binarną 😉
Opis programu bitmapowej wiadomości
Dziś dla odmiany użyjemy edytora Mu Editor, który jest bardzo prostym edytorem kodu Python dla początkujących. Zaczniemy od powiadomienia użytkownika, o co w ogóle się rozchodzi, zapytamy też o wiadomość i przy okazji zaimportujemy moduł sys - przyda nam się później 😉

Jak widzimy importujemy moduł sys, następnie zostaje wyświetlona wiadomość mówiąca co program robi (wiem, z błędem). No i finalnie w linii nr 3 wyświetlamy znak zachęty by inputem odczytać to co wpise użytkownik. Jeśli zaś użytkownik nic nie wpisze to zakończymy przygodę z takim delikwentem, a by to zrobić musimy przyrównać wpisany str do pustego łańcucha, jak poniżej.

Mamy tu linię 29 i 30 w których sprawdzamy za pomocą instrukcji warunkowej czy to co jest w message nie jest przypadkiem tym samym co pusty łańcuch znaków. Jeśli tak to stosujemy metodę exit bez pożegnania.
Pattern i główna pętla
Dla uproszczenia tutaj użyjemy statycznego wzoru znakowego, który znajdziesz poniżej do skopiowania.
....................................................................
************** * *** ** * ******************************
********************* ** ** * * ****************************** *
** ***************** ******************************
************* ** * **** ** ************** *
********* ******* **************** * *
******** *************************** *
* * **** *** *************** ****** ** *
**** * *************** *** *** *
****** ************* ** ** *
******** ************* * ** ***
******** ******** * *** ****
********* ****** * **** ** * **
********* ****** * * *** * *
****** ***** ** ***** *
***** **** * ********
***** **** *********
**** ** ******* *
*** * *
** * *
....................................................................
W tym długim ciągu będziemy podmieniać sobie znaki na takie, które wpisał użytkownik. Linie z kropek są dla ułatwienia i uatrakcyjnienia wyglądu. Na początek musimy oczywiście wszystać to wielkie coś jako string, a następnie przechodzić po nim jakoś.

Oczywiscie wykorzystaliśmy pętlę for, która tutaj będzie brała sobie każdą kolejną linię tekstu z tabicy linii tekstu. Tablica taka jest tworzona za pomocą metody splitlines(), która umieszcza ją w tablicy rozdzielając każdą kolejną na podstawie nowej linii.
Teraz musimy przechodzić przez znaki w linii, a do tego przyda się kolejna pętla, ale też... wykorzystamy twojego znajomego, jeśli czytałeś poprzedni artykuł. Znowu użyjemy enumerate, które numeruje elementy pętli. Jeśli nie pamiętasz, zajrzyj do artykułu o Paradoksie Dnia Urodzin 😉

Jak widzimy, używamy wewnętrznej pętli for, która iteruje po kolejnych znakach. enumerate numeruje każdy znak, dlatego mamy dwie zmienne pętli - jedna przechowuje numer znaku, a zmienna bit przechowuje sam znak. Dlatego zatem jak zobaczymy, że znak jest spacją, to też wyświetlamy spację, by zachować białe przestrzenie. Argument end w funkcji print pozwala określić, że wyświetlona wartość nie zakończy się nową linią.
Natomist w przypadku, gdy znak nie był spacją, to wyświetlamy z mesage konkretny znak. Jaki znak wyświetlamy? Znak, który stoi na pozycji numer.... modulo z pozycji na jakiej jesteśmy w linii i długości wpisanej wiadomosci. Czyli po prostu jaka będzie reszta z takiego dzielenia, taką pozycję znaku do wyświetlenia uzyskamy. I mamy praktywcznie wiasomość w postaci takiej jak początkowy pattern. Ważne jednak jest by na końcu, bo ogarnęliśmy jedną linię, wyświetlić przejście do kolejnej.
Finalna pętla będzie zatem prezentować się jak poniżej.

Finalnie zatem widzimy, że program nie jest jakiś super skomplikowany. Chodziło tu jednak o pomysł, i ten artystyczny sznyt 😉 Pobaw się nim i nie bój go zepsuć!
