Nadeszła ta wiekopomna chwila 🤩!!! Prace nad programem ostatecznie dobiegły do mety i tak po ponad 4 miesiącach siedzenia w języku Java, udaje mi się skończyć projekt! "Statistic Table Generator" dostępny do pobrania już niebawem, a na razie zapraszam na kulisy samych prac nad aplikacją. Zapraszam do środeczka 😁!
KULISY "STATISTIC TABLE GENERATOR". JAK PRZEBIEGAŁY PRACE?
Zaczniemy od samego początku, czyli od pomysłu i kiedy przyszedł pierwszy dzień pracy. Potem przedstawię pokrótce z czym borykałem się najbardziej, a także jak pierwotnie miał nazywać się program jaki stworzyłem 😲.
O CZYM MOWA?
Dosłownie parę zdań o programie, zanim opiszę same kulisy. "Statistic Table Generator", to aplikacja generująca tabelę z danymi powstałą w wyniku podanego wyrażenia w polu tekstowym ⭐. Podając wbudowane słowa kluczowe, jesteś w stanie sam(a) wprowadzić jakieś równanie, wyregulować zaokrąglanie wartości, maksymalną liczbę iteracji i po kliknięciu przycisku, natychmiast otrzymać dane co każdą iterację, dokładnie jak w pętli "for" 🔥!
Program oferuje dużo więcej, niż samo generowanie tabeli. Możesz przełączyć się na graficzną reprezentację w formie wykresu 📊 oraz wyeksportować otrzymane dane w formie pliku tekstowego (tabela) bądź graficznego (wykres) 👑! Wybierając tabelaryczny zestaw danych, masz możliwość otrzymania ich w formie tablicy w jednym ze wspieranych języków programowania 🤩!
OD CZEGO SIĘ ZACZĘŁO?
Pomysł na to przyszedł już jakiś czas temu, lecz już nie wiem kiedy dokładnie. Pewnego razu, myśląc nad skonstruowaniem równania do gry, musiałem znowu wchodzić do Pythona i pisać szybki kod z pętlą "for" wypisujący coś na kształt takiej tabeli. Nie pasowało mi, że trzeba po raz kolejny odrywać się od roboty tak dużo czasu, tym bardziej że z pewnością jeszcze nieraz będę chciał stworzyć grę z systemem doświadczenia i przydałby się taki automatyczny kreator tabeli dla przyspieszenia analizy, testów i nas samych ✅.
Wtedy przyszedł mi do głowy pomysł na aplikację, która oczekiwałaby równania w polu tekstowym, użytkownik wpisuje, klika przycisk i program sam mu generuje wartości, lecz elegancko sformatowane i jeszcze z możliwością eksportu (pomysł na implementację tego przyszedł trochę później 🙂) 🔥! Tak narodził się pomysł na "Statistic Table Generator", choć wtedy miał nazywać się inaczej (szczegóły niżej) 😉.
Przede wszystkim, za cel postawiłem sobie dowolność we wprowadzaniu równania do programu za pomocą linijki tekstu, aby dać użytkownikowi możliwość wpisywania dowolnego wyrażenia arytmetycznego (oczywiście w przyjętej formie), które by automatycznie kalkulowało finalną wartość dla danego poziomu doświadczenia 🔥.
Trzeba było też wymyślić sposób na układanie bardziej skomplikowanych wyrażeń używając jedynie pola tekstowego. Wtedy przyszedł mi do głowy pomysł wstawiania kluczy 🔑. Na przykład "lvl" miało oznaczać iterację (poziom doświadczenia lub numer poziomu gry). W efekcie końcowym, przykładowe wyrażenie "300*lvl" dawałoby 300 dla poziomu 1, 600 dla poziomu 2 itd. Słowo "sqr" wprowadzałoby potęgowanie wyrażenia "uchwyconego" w nawias do kwadratu. "cube" podnosiłoby wyrażenie do potęgi trzeciej, a "sqrt" wyznaczałoby pierwiastek kwadratowy ⭐.
Mając w głowie powyższe założenia, zabrałem się do pracy wierząc, że uda mi się złożyć taką zabaweczkę ❤️!
NAZWA PROJEKTU
Sama nazwa przeszła przez parę "ewolucji" 🙂. Na początku prac, projekt nosił nazwę "Generator tabeli doświadczenia", gdyż podstawowym impulsem jaki mnie skłonił do napisania aplikacji, było wpisywanie równań dla szybkiego otrzymania danych dotyczących poziomów doświadczenia do gier RPG ⚔. We wrześniu jednak stwierdziłem, że lepiej będzie zmienić nazwę na bardziej uniwersalną, aby mogła sugerować, że takie dane nie ograniczają się wyłącznie do liczby punktów doświadczenia per poziom 💡. Przecież takie dane mogą również pasować do wyznaczania czasu na dany poziom (rozumiany jako etap/mapa/plansza), wyznaczania wzrostu liczby punktów zdrowia przeciwników na daną falę i tak dalej 👍.
Dylemat związany z nazwą pojawił się również w momencie budowania instalatora. Początkowo chciałem zrobić, aby sam tytuł programu też podlegał spolszczeniu. Po pewnym czasie (przed rozpoczęciem prac nad filmem) postanowiłem tego nie robić, jako że to nie miałoby sensu i powstałoby przez to wiele problemów 🛑. Zrobiłby się kisiel przy nazwie pliku wykonywalnego 😅. Zrobiłby się w nazwie katalogu tworząc folder w "Program Files" (co w przypadku, gdyby ktoś nieświadomie przy ustawieniach domyślnych zainstalował sobie to samo w dwóch innych folderach 🤯?). W przyszłości też mogłoby nieźle namieszać, gdybym musiał później wycofać się z polskiego tytułu, bo np. w którymś momencie zrobiłyby się krzaki w znakach diakrytycznych, obojętnie czy to w nazwie pliku ".exe", czy w nazwie katalogu, a już wypuściło się instalator zmieniający tytuł na polski i angielski 💣.
W efekcie końcowym stanęło na tym, że ostateczna nazwa projektu to "Statistic Table Generator" - nie podlega spolszczeniu ani w instalatorze, ani w samej aplikacji 😁!
POSTĘP PRAC
Pora na najistotniejszą część - prezentacja kamieni milowych projektu jak on z biegiem czasu stawał się coraz potężniejszy i zmieniał swoją strukturę 💪!
GENERACJA TABELI Z DANYMI (16.07)
Pierwszym punktem było konwertowanie podanego wyrażenia tekstowego na wyrażenie arytmetyczne i wygenerowanie tabelki z danymi 1️⃣. Po lewej stronie kolumna prezentująca aktualną iterację, a po prawej, wartości funkcji w danym punkcie X. Brzmi prosto, a dopiero po jakichś 2 tygodniach uzyskałem wynik, o który mi chodziło 😜.
Chciałem, żeby program potrafił obsługiwać dowolną liczbę różnych równań, więc po opracowaniu wstępnej konwersji operatorów arytmetycznych wraz z zapewnieniem kolejności wykonywania zgodnej z zasadami matematyki, doszły później słowa kluczowe nadające odpowiednią interpretację, takie jak "lvl" (aktualna iteracja w pętli) czy "sqrt" (pierwiastek kwadratowy z wyrażenia podanego w nawiasie).
Na tym etapie konwerter już działał znakomicie uwzględniając następujące czynniki 👇:
- znak minusa kiedy dany operand (argument operatora) ma być traktowany jak jednoargumentowy np. "(-1)", a kiedy jako dwuargumentowy ("b-a") uwzględniając również minus na początku wyrażenia bez pary nawiasów okrągłych,
- walidacja danych (wszystko opatrzone wyskakującym okienkiem), czyli:
- wykrywanie literówek w wyrażeniu,
- niedomknięcie nawiasów,
- używanie obcych dla programu znaków,
- dzielenie przez zero,
- uwzględnianie słów kluczowych przetwarzających dane wyrażenie w nawiasie na swój własny, unikalny sposób:
- "lvl" jako numer iteracji w pętli,
- "sqr" jako kwadrat wyrażenia,
- "cube" jako sześcian wyrażenia,
- "sqrt" jako pierwiastek kwadratowy z wyrażenia,
- wsparcie liczb zmiennoprzecinkowych.
Program przetwarzając podane wyrażenie sprawdza znak po znaku, czy przestrzega ono wszystkich zasad prawidłowej notacji matematycznej. Jeżeli gdziekolwiek zostanie znaleziony błąd notacyjny (np. znak mnożenia zaraz po znaku dzielenia), zgłaszany jest wyjątek, który przerywa całą operację przetwarzania ⛔. Na niego nałożony jest komunikat w postaci wyskakującego okienka z powiadomieniem o niewłaściwym wyrażeniu. Taki sam efekt końcowy objęty jest również sytuacją, gdy otrzymana wartość jest mniejsza bądź równa zero (nie miałoby to sensu 😉).
Była możliwość skorzystania z metody "eval" z języka JavaScript, która uprościłaby cały proces, natomiast jak sprawdziłem ile czasu mieliło taką małą rzecz, odpuściłem to sobie jak najprędzej ❌. Poza tym, fajnie było popracować samemu nad takim algorytmem przetwarzającym dane wyrażenie znak po znaku 😊.
Pierwsza działająca wersja powstała 16 lipca i wówczas tak wyglądał efekt 👇:
![]() |
Wygląd programu z dnia 16 lipca.
Sama tabelka to jeszcze zdecydowanie za mało na to, żeby powstało jakieś "widowisko", bo to dopiero jedna funkcjonalność 🙂.
GENERACJA WYKRESU (24.08)
Kolejnym punktem było dodanie rysowania wykresu funkcji na podstawie podanego równania 📊. Nigdy nie zapomnę ile razy człowiek musiał weryfikować czy każdy najdrobniejszy element rysuje się prawidłowo 🤯. Tu poprawić, tam przesunąć, jeszcze w innym miejscu miał rosnąć, lecz tylko do pewnego momentu - masakra 💥! Sam panel rysujący graficzny wykres funkcji zajął jakiś miesiąc prac, nie licząc późniejszych poprawek.
24 sierpnia tak wyglądał prototyp 👇:
![]() |
Wygląd programu z dnia 24 sierpnia.
5 dni później wszedł film prezentujący działanie całości w akcji, na którym znalazła się prezentacja okna palety kolorów umożliwiającego ustawianie kolorów poszczególnym elementom wykresu 🎨:
![]() |
Wygląd programu z dnia 29 sierpnia.
EKSPORT DANYCH DO PLIKU (14.09)
Trzeci większy punkt i ostatni zarazem, to było coś, o czym nie myślałem na samym początku prac 🧨. Zapis do pliku OBU rodzajów danych: tabela (jako "txt") oraz wykres (jako obraz PNG). 14 sierpnia "Statistic Table Generator" został "uzbrojony" w eksport do plików zewnętrznych 🌟. Mogę jednak Cię zaskoczyć, że choć brzmi to poważnie i można sobie wyobrażać nie wiadomo co, to całość wraz z panelem do wybierania opcji zajęła mi tylko 2 tygodnie, więc to była najkrótsza większa implementacja w całym programie 👍.
Największym przekleństwem było spolszczenie okna dialogowego ("JFileChooser") oraz okna palety kolorów ("JColorChooser"). Wydawało mi się, że w Javie to będzie kwestia wywołania kilku metod i sprawa załatwiona, lecz okazało się, że trzeba było zaprogramować całe pętle wyszukujące odpowiednie komponenty poprzez instrukcje warunkowe i weryfikacje zgodności typów klas ("instanceof"). Delikatnie pisząc, to nie było przyjemne doświadczenie 😅. Koniec końców udało się osiągnąć jakiś kompromis i efekt końcowy opublikowałem 14 września ✅.
Oto efekt implementacji eksportu do pliku 👇:
![]() |
Wygląd programu z dnia 14 września.
POPRAWKI W KODZIE
Potem nastał czas na poprawki i refaktoryzację 🔨. Optymalizacja trwała miesiąc i to był ostatni etap prac idący od połowy września ⏩. Skończony dopiero teraz 😜. Szufladkowanie metod, ćwiartowanie klas, optymalizowanie wyrażeń i upraszczanie zapisów. Tak wyglądało moje życie przez tamten czas. Algorytm przetwarzający równanie był rzeczą, którą na każdym etapie musiałem naprawiać na nowo. Co jakaś większa modyfikacja w kodzie, tam algorytm się psuł 💥.
Tak w bardzo dużym streszczeniu przebiegały prace nad programem ✔️. 1 czerwca zaczął się cały proces tworzenia. Plan wypalił połowicznie, bo choć rzeczywiście, udało mi się doprowadzić ten program do końca, to jednak potrzebowałem o wiele więcej czasu niż założyłem ⏰. Sądziłem, że wystarczy kwartał na to, aby projekt został w całości napisany i zoptymalizowany od góry do dołu. Okazało się, że potrzebowałem ponad miesiąc więcej (jakieś +40 dni), żeby projekt doczekał się radosnego "przyjścia na świat" 🏁.
KIEDY NADEJDZIE PUBLIKACJA?
Teraz informacja stanowiąca istotę tego artykułu. Możesz pomyśleć, że jak dzisiaj ogłosiłem zakończenie prac nad programem, to już teraz można odliczać 7 dni do publikacji ⌛. Niestety nie 😞. Czeka mnie jeszcze etap wdrażania aplikacji. Najpierw muszę pomyśleć nad postacią publikowanych plików, żeby to jakoś porządnie wyglądało. Na pewno program wleci w postaci pliku wykonywalnego celem obejścia instalowania środowiska uruchomieniowego JDK ℹ️. Już kilka dni wcześniej przygotowałem osobne miejsce na sam program z odnośnikiem do pobrania 💾 - to jest ten link.
Po tym, jak wszystkie testy na innych komputerach przebiegną bez zarzutów, zabieram się za film będący oficjalną zapowiedzią programu, tak jak ma to miejsce przy grach 🎮. Dopiero potem liczymy 7 dni i wtedy program wchodzi na stronę z linkiem do pobrania 🙂. Jest duża szansa, że zdążę to wypuścić w październiku, a jeżeli nie, to na pewno powiadomię.
Tyle z mojej strony. Także czekać i zaglądać co jakiś czas 🔍😉! Jeżeli gier w tym roku nie będzie, to przynajmniej wyjdzie mój pierwszy oficjalnie wydany program ✊!



