Chcę być anonimowym wtedy, kiedy tego na prawdę chcę a nie wtedy, kiedy mogę...

Zabawa z Pascalem i garść problemów.


Dodano dnia 01.04.2009


Tak, jak obiecałem, tym razem trochę bardziej "geekowo" chociaż to, co opiszę może służyć tylko jako informacja dla mało zaawansowanych programistów Pascala, jak zachowywać się w razie niepowodzeń (czyli prawie ciągle ;)).

Przed świętami na zajęciach, nauczyciel oznajmił nam, że aby otrzymać pozytywną ocenę z przedmiotu, jakim jest Programowanie Strukturalne i Obiektowe, trzeba napisać program na zaliczenie z zakresu programowania w języku Pascal (tak, jesteśmy trochę do tyłu, wiem). Ok, zaliczenie, jak zaliczenie... Ale dlaczego kurde na święta!? Lubię popracować nad czymś, co mnie interesuje ale święta to czas "wolnego"(?) więc jakoś nie widzi mi się pisanie programu dla mnie i dla paru osób (bo zapewne tacy się znajdą). Ale to akurat nauczyciel decyduje więc postanowiłem nie stawiać oporu, bo po co? Poza tym, jeżeli zaliczenie dla mnie to i również zaliczenie dla reszty klasy a co za tym idzie, niezły zarobek. Zawsze znajdzie się osoba, która nie może/nie chce/nie potrafi napisać sama prostego kodu.

Do rzeczy. Musiałem napisać program dla siebie, dla znajomej i paru osobom stworzyć dokumentację. Oczywiście źle oszacowałem czas na zrealizowanie "zleceń" i miałem lekki poślizg. Nie. Lekki to złe słowo. Miałem kolosalny poślizg. Dlaczego? Zacząłem w ostatni weekend czasu wolnego, czyli dwa dni przed oddaniem prac. Jako, że nie jestem pracownikiem firmy usługowej (post do tyłu) więc dbam o klienta. Tak więc w sobotę wieczorem zacząłem pisać program i tworzyć dwie dokumentacje nie dla mnie. O tych pracach nie będę wiele pisał ze względu na klientów. Mogliby przecież sobie tego nie życzyć, prawda?

Pracę skończyłem w niedzielę po południu. Za pomocą kreatora instalatora stworzyłem trzy intalki, zgrałem na serwer, przesłałem do znajomych i zarobiłem. Czas na moją pracę. Dopiero teraz się zaczęło...

Do mojego projektu, którym jest gra zręcznościowa stworzona na wzór popularnej gry na legendarnego Pegasus'a, w której sterujemy jazdą wyścigówki i staramy się nie wpaść na żadną przeszkodę. Oczywiście do takiego projektu potrzebna jest możliwość odczytywania stanu klawiszy przez cały okres działania programu. Do tego celu użyłem oczywiście funkcji ReadKey. Co w tym trudnego? Jeżeli ktoś próbował pierwszy raz używać readkey w FPC (wersja niższa niż 2.2.2 wie, że to jest trochę męczące). Po godzinie doszukiwania się błędu w programie (naturalnie po kompilacji, program nie działał tak, jak chciałem) zgłosiłem się na forum 4programmers.net (w końcu od tego ono jest, prawda?), gdzie dostałem dosyć szybko odpowiedź. Po dni spędzonym w niemiłej atmosferze prób wskrzeszenia kawałku kodu dowiedziałem się, że najzwyczajniej w świecie mój kompilator to już przeżytek i muszę ściągnąć nowszą wersję. Ok. Upgrade będzie, jak znalazł.

Chwila poszukiwań i już po paru minutach ściągam najnowszą wersję FPC na swoją maszynę. Instaluję, przerzucam kod programu do kompilatora, kompiluję i co? Error (Coś z -opentiom3). Oczywiście, wcześniej szło zbyt prosto, żeby teraz kod skompilował się bez problemu... No nic. Kopiowanie treści błędu, Google, search i... I masa totalnie pogiętych, wyssanych z palca bzdurnych rad, które nie pomogły mi w żaden sposób. Przeszukałem strony polskie, angielskie i nawet parę rosyjskich. Wszędzie proponowali skasowanie pliku fp.cfg, który podobno był winny. Wiecie co? To nie zadziałało. Za każdym włączeniem kompilatora, plik tworzył się na nowo i przy kompilacji znowu dowiadywałem się, że jakiś argument jest zły.

Podczas poszukiwań natrafiłem na jedną z przeglądanych rosyjskich stron. Mrugnęło mi coś związanego z problemem w argumencie -opentuim3, który faktycznie wywoływał błąd. No to szybko do translatora Google i tłumaczę treść strony. Jeżeli translator Google to z góry wiadomo, że treść przetłumaczona będzie równie bezsensowna, jak argumenty TP w sprawie cenzury. Jedyne, co udało mi się zrozumieć, to to, że -opentium3 trzeba zamienić na -oppentium3. Ale zaraz. Gdzie ja to mam naprawić? Żadnej informacji. Chwila poszukiwań i jest. Ścieżka do naprawy błędu to: Options->Compiler->Additional compiler args. Jesteśmy w domu...

Ok, więc przyszedł czas na programowanie. Pierwsze, za co wziąłem się to menu. Nieodłączny element każdej prawie aplikacji. Ale jak je zrealizować? Bardzo prosto:
  • W pierwszej kolejności należy "narysować menu". Moje wyglądało tak:
    Code:
    Nowa gra
    Wyniki
    Koniec


    Jak widać, żadna rewelacja.
  • Następnym krokiem będzie napisanie funkcji, która odczytuje klawisze (musimy podzielić ją na dwie części. W pierwszej sprawdzamy czy kod klawisza to #0 a w drugiej, sprawdzamy, jaki faktycznie klawisz został naciśnięty).
  • Teraz na podstawie wciśniętego klawisza (przyjmujemy, że możemy użyć tylko strzałek góra-dół), dodajemy lub odejmujemy wartość od zmiennej kontrolnej.
  • Ostatnim krokiem jest "detekcja" wciśnięcia klawisza Enter. Po udanym odczytaniu kodu #13 (kod Entera) sprawdzamy wartość zmiennej kontrolnej i na jej podstawie wywołujemy funkcję tworzącą mapę gry lub odczytującą najlepszy wynik.

Tak przedstawia się projekt działania menu. Bardzo proste ale działa i to bardzo dobrze. Dalszych kroków nie będę opisywał w taki sposób. Na końcu postu znajdziesz kod programu.

Ok, po stworzeniu menu poszło z górki. Tworzenie mapy i rysowanie samochodziku przyszło mi bardzo prosto. Mapa jest statyczna a samochodzik porusza się na zasadzie zmiennej kontrolnej (bardzo podobnie jak w przypadku menu). Po stworzeniu tych podstawowych elementów, stanąłem przed ciekawą zagwozdką. Jak generować przeszkody, do których się zbliżam? Odpowiedź przyszła dopiero na następny dzień. Przeszkodę trzeba najpierw narysować, potem dodać trzecią zmienną kontrolną, która po wciśnięcia któregoś z klawiszy (ciągle mówimy o strzałkach), dodaje do zmiennej i+1. Po odczytaniu zmiennej kontrolnej, czyścimy ekran, zmieniamy położenie przeszkody o wektor pozyskany ze zmiennej. Nic prostszego ;).

Metodę tworzenia nowej przeszkody na podstawie położenia starej, możesz wyłuskać z kodu ponieważ nie będę jej teraz opisywał.

Na koniec zostało mi stworzenie punktów kolizyjnych i zapisywanie ostatniego wyniku do pliku tekstowego. Faktem jest, że nie napisałem mechanizmu wybierania lepszej wartości wyniku ale to już z czystego lenistwa :].

Takim oto sposobem dotarłem do zakończenia programu, który przysporzył mi duuuużo nerwów. Podczas jego pisania nauczyłem się nawet paru nowych wulgaryzmów (nie ma to, jak poprzeklinać przy errorach ;)). Mam nadzieję, że informacje zamieszczone w notce i (przede wszystkim) w kodzie dołączonym, przydadzą się komuś. Taką oto pozytywną myślą kończę dzisiejszy wpis.

Bywaj.

Kod źródłowy programu PatFast
Kategoria: Programowanie


Nick:

Komentarz:

token



statystyka