piątek, 1 grudnia 2006

Historia programu

Początki
Jakiś czas temu, nudząc się na którejś z lekcji polskiego, wpadłem na pomysł. Był nim program, który umożliwiałby granie w szachy na kurnik.pl. Niby nic wielkiego. Ot co, programik miał analizować to, co się dzieje na szachownicy i przekazywać informacje o położeniu bierek do programu szachowego, po czym czekać na jego odpowiedź i wykonać za gracza ruch.
Niewątpliwie zaświtanie tej myśli w mojej głowie było spowodowane tym, że w pierwszej klasie liceum grałem z kolegami w szachy. A to na przerwie się jakąś partyjkę strzeliło, a to na jakiejś wyjątkowo nudnej lekcji ktoś wyjął z plecaka szachownicę. Natomiast obowiążkowo na lekcjach wychowawczych organizowaliśmy coś na kształt turniejów. Pasja do tej gry przeniosła się częściowo na serwis internetowy www.kurnik.pl. Polubiłem to miejsce. Spędzało się tam bardzo przyjemnie wolny czas przy ulubionej, nie pochodzącej z komputerowego świata, grze.
Jak każdy, kto choć raz odiwedził Kurnik, wie, że wszystkim kontom przypisany jest ranking. Jest to taki drugi identyfikator człowieka zaraz po jego loginie. Ranking odzwierciedla umiejętności w danej grze. I tak, mając 1700 punktów rankingowych uchodzi się za kogoś, kto z szachami ma trochę do czynienia, a posiadając powyżej dwóch tysięcy, za wybitnego gracza. Oczywiście kto zdrowy na umyśle, dąży do uzyskania jak największej liczby koło swojego nicku. Tak też było ze mną.
Kurnik stwarza tą niepowtarzalną sposbność, która pozwala na to, co nie oszukujmy się, człowiek lubi robić: oszukiwać by osiągnąć korzyść dla siebie. Mówię tutaj oczywiście o wykorzystaniu podczas rozgrywania pratii kurnikowej programu szachowego ;) Nie jestem pierwszym, który na to wpadł. Napewno było wielu przede mną, a i po mnie też będzie pewnie jeszcze więcej osób. Jednak to, że interesuję się programowaniem spowodowało, że zamiast próbować oszukiwać w sposób jaki to robią tak zwani "kompiarze", chciałem wykorzystać swoje umiejętności. Zagadałem do kolegi - Mariusa - i przedstawiłem mu smój pomysł. Pomyśleliśmy trochę jakby można było wykonać taki program. W szczegóły techniczne nie będę się wdawał, bo i po co niepotrzebnie przynudzać, ale w skrócie powiem, że program miał działać prawie jak człowiek - mieliśmy mu zaprogramować oczy. Polegało to na sprawieniu, żeby program "widział" co się dzieje na kurnikowej szachownicy oraz tej drugiej, w jakimś programie szachowym.
Projekt został obgadany, ale wykonania w najbliższym czasie się nie doczekał. Jednak pewnego dnia przypomniałem sobie o nim.

Pierwsza wersja
Po dość dłuższym czasie, który upłynął od obgadania projektu z Mariusem, zaczałem pomysł wprowadzać w życie. Oczywiście odrazu pojawiły się pytania i problemy do rozwiązania mimo, że wcześniej myślałem, że będzie to tak banalne jak wynikało to z rozmów z Mariusem. Jednak dylemat polegał na tym, jak odczytywać szachownicę? Jakiego programu szachowego użyć? I wiele pomniejszych. Pytawszy co chwilę google o poradę, w ciągu kilku dni skodziłem pierwszą jako-tako działającą wersję. Zasada działania programu, wtedy jeszcze niemającego nazwy, była trywialna. Korzystałem wówczas z aplikacji szachowej Bringer. Szachotron 1 porównywał stan szachownicy w Bringerze z tą na Kurniku, próbkując odpowiednie piksele wyświetlane na ekranie. Jeśli zaszła jakaś zmiana, wykonywany był automatycznie ruch.
W zasadzie to nie można było tego release'a nazwać czymś w pełni działającym ;) Prawdę mówiąc skuteczność programu wynosiła 1:1 - tyle ile razy wygrywał, tylko samo razy się sypał :D

Druga wersja
Tak jakoś się bawiłem pierwszą kompletnie niedopracowaną wersją, która miała wiecej dziur niż jej samej było i doszedłem do wniosku, że tak nie może być. W końcu, aby coś dobrze działało, musi mieć solidne fundamenty. Z takim przyświecającym mi mottem, poszedłem po poradę. Jak zwykle dobra wyrocznia google udzieliła mi konkretnych odpowiedzi. Dowiedziałem się co to jest UCI [ Universal Chess Interface ], jaka jest specyfikacja protkołu UCI oraz tego, że w internecie są dzisiątki darmowych, ogólnodostępnych silników szachowych. Myslę sobie, nic tylko brać, używać i wygrywać na Kurniku ;)
No tak, ale co mi po samym silniku szachowym, który tak wogóle komunikuje się ze światem zewnętrznym przy pomocy stdin/stdout [ standardowe wejście/ wyjście, czyli konsola - dla niewiedzących co to jest ;) ]? Kolejne pytanie, kolejna odpowiedź google: piping. OK, postudiowałem troszkę dokumentacji, pobawiłem się jakimiś przykładowymi kodami i wziąłem się za właściwe pisanie.
Zajęło mi to kilka wieczorów. Efekt był porażający :) W porównaniu z poprzednią wersją, ta aktualna, która została opatrzona numerkiem 2, była niesamowita i niezawodna.
Zrezygnowałem z opcji autoplay, a poruszanie bierkami na kurniku było sterowane przez gracza: wciskało się odpowiedni skrót klawiszowy, na przykład alt+X, a Szachotron pobierał informacje o stanie szachownicy na Kurniku, przesyłał wykonany przez oponenta ruch do silnika szachowego i czekał na jego odpowiedź, po czym ruszał odpowiednią bierką. Rozegrałem w ten sposób kilkadziesiąt partii i było naprawdę fajnie ;) Oczywiście było tak do czasu wykrycia pewnego buga..
Dokładnie to zanim znalazłem gdzie tkwił bład, zdrowo się namęczyłem. Otóż normlanie sobie grając w pewnym momencie, kompletnie losowo, Szachotron źle interpretował informację o ruchu z silnika szachowego. Jak się pózniej okazało, winny tego był parser odpowiedzialny za filtrowanie outputa silnika.
Jako, że wersja 2 bazowała na starym kodzie poprzedniej wersji, była bardzo zawiła i była bardzo mało elastyczna. Przez ograniczenia jakie stawiała mi tamta struktura kodu, nie zdołałem poprawić buga w parserze. W sumie ten błąd nie występował aż tak często i praktycznie dało sie bezproblemowo grać. W związku z tym postanowiłem, że pozostawie projekt w takim stadium rozwoju jakim był.
Jednak pewnego dnia po jakiejś dluższej przerwie w graniu na kurnik.pl, gdy przeglądałem jakąś plytkę z backupami, natknąłem się na archiwum nazwane "szachotron 2". Nagle naszła mnie ochota, aby zreaktywować projekt. Takim sposobem zacząłem pisać Szachotron 3.

3 komentarze:

Anonimowy pisze...

Hehehe... good job - polać mu! :D
P.S. A gdzie wzmianka o mnie? ;)

Szachotron pisze...

Nie zapomniałem o Tobie, wzmianka jest ;)

Anonimowy pisze...

problem prawdopodobnie tkwil w zwalnianiu zasobow ;]
przynajmniej ja tak mialem ;]

pozdrawiam,
q