Po co mi ta Scala? Scalatron!
31.05.2012 01:43
Ostatnimi czasy tematyka programowania i języków na blogach Dobrych Programów nieco przycichła, więc pomyślałem, że może pora znów skrobnąć coś o Scali. Dalej nie mam ochoty (a najpewniej i wiedzy) na kurs z prawdziwego zdarzenia, dlatego może krótko o jednej z form wykorzystania języka. Jakaś przydatna aplikacja desktopowa? Nie dziś. Praca z frameworkiem, dzięki której w przyszłości może uda nam się coś zarobić? Też nie. Teraz chodzi tylko i wyłącznie o pure fun!
Terminator - zrób to sam!
Oglądaliście kiedyś, choćby w TV, pojedynki zaprojektowanych specjalnie ku temu robotów? Czytaliście o zawodach na aplikację, która skilluje (od kill, nie skill) procesy wszystkich innych uczestników? A może marzyliście o zaprojektowaniu niszczycielskiej AI? Proszę bardzo, oto Scalatron!
Ale o co chodzi?
Plansza u góry to arena. Duża kolorowa kropka to bot – w uproszczeniu zaprojektowany przez użytkownika podprogram, który po wkroczeniu na arenę wraz z pewnym budżetem punktów żyje własnym życiem. Mniejsze kropki to sterowane przez komputer stwory i roślinki. Kontakt z nimi może punkty dodawać lub odbierać. Same mogą trwać w miejscu, uciekać od naszego bota... lub go gonić. Wspomnieć należy, że botów na planszy może przebywać kilka, a ich interakcja nie ogranicza się do podkradania jeden drugiemu jedzenia – mogą sobie nawzajem (i innym żyjątkom) robić krzywdę.
Manewry zaczepno-obronne
Każdy bot może przeznaczyć część swoich punktów na stworzenie jednego bądź kilku minibotów - takich bezzałogowych dronów. Te żyją tak długo, na ile wystarczy im uciekającej z każdym ruchem energii, ale można je zagospodarować na wiele ciekawych sposobów. Np. wysłać na cyber jihad – podprowadzić w pobliże wroga i uaktywnić autodestrukcję. Oczywiście cel może mieć zaprogramowaną swoistą tarczę antyrakietową – po zauważeniu wrażego minibota może przechwycić go własnym tworem. Minibot mógłby też pełnić rolę miny, przynęty w zasadzce, może zbierać pożywienie i transportować je do bota-matki, naganiać jadalne stworzonka, a nawet tworzyć kolejne pokolenia minibotów. Taktyka polegająca na biernym czekaniu i nękaniu wroga eskadrą minibotów nie jest może zbyt racjonalna, jeśli wziąć pod uwagę potrzebne do realizacji ilości energii, ale widok musi być nieziemski, więc właśnie do jej realizacji dążę uparcie ;‑)
Niby proste, ale...
Podobnie jak w wielu ponadczasowych grach (szachy, karcianki, snooker) ogólne zasady są nieskomplikowane, ścieżki osiągnięcia sukcesu już niekoniecznie. Takie oprogramowanie bota (i minibotów), by sprawdził się w każdej sytuacji i więcej punktów zyskiwał niż tracił, stanowi nie lada wyzwanie. Ogranicza nas zmysł taktyczny, znajomość języka i, co tu dużo gadać, algorytmika. By nieco nas odciążyć i ułatwić nam zabawę, twórcy stworzyli swego rodzaju IDE. Proste ale funkcjonalne, mieszczące się na lokalnej stronie internetowej (czy jak to się zwie :p). Oczywiście nic nie stoi na przeszkodzie, by własnego bota tuningować w prawdziwym IDE lub dowolnym edytorze tekstu.
Od zera do Scala-codera
Twórcy obok IDE zamieścili kurs niewymagający znajomości Scali (choć podpórka w postaci C++/Javy/Innego języka jest mocno wskazana). Więcej nawet, jedną z intencji powstania Scalatrona było stworzenie możliwości nauki języka w jak najciekawszej formie. Na około 50 stronach PDF‑a przedstawiona została budowa i stopniowe ulepszanie całkiem nieźle radzącego sobie bota. Znaczną część instrukcji wypełniają komentarze, co robi każdy nowy kawałek kodu, stąd pula adresatów tego wpisu nie ogranicza się do Scala-hax0rów. A, jeszcze drobiazg - całość, oczywista oczywistość, po angielsku.
Jak to się robi?
A konkretnie - jak to wygląda z technicznego punktu widzenia? W każdym jednym cyklu serwer przesyła botowi łańcuch tekstowy zawierający podstawowe informacje, z których najważniejsze to ilość zgromadzonej energii, a także mapa tego, co bot wokół siebie widzi. Zadaniem napisanych przez nas obiektów i funkcji jest analiza tych danych i wybranie odpowiedniej reakcji. Z reguły jest to ruch lub stworzenie i wysłanie w żądanym kierunku minibota. Czasem wybuch (tego drugiego), zostawienie wiadomości na arenie bądź w polu statusu jednostki. Reakcję odsyłamy serwerowi również w postaci odpowiednio spreparowanego łańcucha tekstowego.
Przykładowy komunikat ze strony serwera gry:
React(generation=0,name=Frank,time=453,view=[tutaj ASCI-artowa mapa widzianego wycinka gry],energy=1350)
Przykładowa odpowiedź:
Move(direction=1:1) albo Spawn(direction=1:0,energy=200)
Oczywiście na głowie mamy wielokrotnie dłuższe metody i funkcje pomocnicze odpowiedzialne za czynności tak prozaiczne, jak parsowanie nadchodzących wiadomości, czytanie sytuacji z mapy i wybór odpowiedniej reakcji. Na szczęście część z nich można skopiować z udostępnionego kursu. W końcu parsowanie nadchodzącego Stringa zawsze i w każdej sytuacji wygląda tak samo, a autorzy nie zautomatyzowali tej czynności chyba tylko dlatego, żeby zachować pole do nauki podstaw Scali.
To może jeszcze o...
O czym tylko napomknąłem, a o czym wspomnieć na koniec warto – na planszy botów może być kilka. Każdy jeden twór przechowywany jest w pliku .jar Kiedy już skonstruujemy naszą niesamowitą, zabójczą AI, po kompilacji możemy ją umieścić gdzieś w internecie albo skonfrontować ją z innymi stamtąd pobranymi. Istnieje też system benchmarku oceniający potencjał naszego bota, a nawet oficjalny ranking aplikacji do zabijania (aktualny lider kilkaset razy przewyższa przykładowego bota konstruowanego na potrzeby kursu).
War has never been so much fun
Ja już jestem po kilkunastu (dosyć nieporadnych, trzeba przyznać) próbach stworzenia czegoś z potencjałem. Zabawa jest wymagająca, ale jednak ciekawa i niosąca masę satysfakcji, np. kiedy „No wreszcie zestrzelił to cholerne @#$#%”. Wierzę, że kiedyś wreszcie uda mi się bez podpórek poradnika skonstruować coś, co w ładnym stylu więcej zyskuje niż traci.
Czego i wam życzę ;‑)