Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Po co mi ta Scala? Scalatron!

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ę ;-) 

programowanie inne

Komentarze

0 nowych
alucosoftware   7 #1 31.05.2012 14:06

Bardzi ciekawy wpis i oczywiście wyjątkowo przyjazny sposób nauki.

  #2 31.05.2012 21:13

Ciekawa rzecz. Może to zaciekawiłoby mnie na tyle, abym nauczył się programować na poziomie nieco wyższym niż 'hello word'. Przyjże się temu i (być może, być może) stworze własne AI. Interesuje mnie to jak jest z planszami: jest jedna, jest ich wiele, czy też są one tworzone losowo. I jeszcze: czy to się łapie pod określenie'automat komórkowy'?

Frankfurterium   10 #3 31.05.2012 22:01

Plansze są losowe, aczkolwiek przy uruchamianiu serwera (z linii komend) możemy ustawić wartości co ważniejszych parametrów rozgrywki (np. czas rundy, wielkość areny, 'zagęszczenie' stworów). Przyznam szczerze, nie zagłębiałem się w to zagadnienie. Poza tym Scalatron ma otwarte źródło. Twórcy wręcz zachęcają do modyfikacji i kompilacji własnego serwera. Jest o tym trochę na stronie głównej.

Co do automatu komórkowego - jak teraz patrzę na definicję z Wikipedii, to tak mi to wygląda, choć od razu widać pewne odstępstwo. Przedziały czasowe - jeżeli za odniesienie wziąć główne boty, to miniboty działają dwa razy szybciej, z kolei sterowne przez serwer drapieżniki i ofiary nieco wolniej.

Druedain   14 #4 01.06.2012 00:37

Aaaa, muszę to mieć! Dzięki za wpis, bo zachęciłeś mnie jak diablo :P

Druedain   14 #5 01.06.2012 01:05

† diabli

Frankfurterium   10 #6 01.06.2012 12:05

Nie ma za co. Scala to dosyć innowacyjny (dla niektórych po prostu dziwny :p) język, przyciąga ciekawych świata programistów, więc nic dziwnego, że i wyniki bywają ciekawe i/lub innowacyjne ;-)

iluzion   5 #7 01.06.2012 19:08

Na główną!

Za każdym razem jak widzę wpisy o Scali to coś mnie ciągnie, żeby przeczytać. Nie inaczej było tym razem, bo to fajny język... tylko złożony. Obawiam się, że życia mi nie starczy, żeby go poznać.

Kolejny raz zadaję sobie pytanie "Po co mi ta Scala?". Do aplikacji GUI na dzień dzisiejszy nie jest najwygodniejszym rozwiązaniem. Do pisania skryptów realizujących konkretne zadanie tu i teraz raczej też nie. Do aplikacji webowych pewnie tak, ale ta dziedzina jak na razie jest mi obca. Oj ciężko mają nowe języki. Nie jest łatwo się przebić.

OT: Na JVM jest jeszcze jeden interesujący język programowania: http://looplang.org/

Frankfurterium   10 #8 01.06.2012 20:56

Właśnie przy aplikacjach webowych Scala pokazuje pazurki. Ponoć, bo sam dopiero w ten świat wnikam. Zainteresowałem się frameworkiem Play, który od drugiej wersji pozwala tworzyć i w Javie, i w Scali. Implementacje scalowe potrafią mierzyć 1/3 javowych odpowiedników - i to bez siłowego brnięcia w skrajnie nieczytelne konstrukcje. Zresztą to tylko jeden ze sporej, jak na tak młody język, ilości frameworków. Liczba narzędzi przyrasta bardzo dynamicznie. Przydałoby się tylko, powszechna bolączka językowa, porządne IDE...

Kiedyś planuję bliżej przyjrzeć się GO. Na razie nie chcę sobie mieszać w głowie nauką dwóch języków + może do tego czasu w pełni przeportują go na JVM, bo coś się do Maszyny przyzwyczaiłem ;-)

iluzion   5 #9 01.06.2012 21:42

Go na JVM? To by chyba zabiło większość istotnych cech, które obecna implementacja oferuje. Największą zaletę języków na JVM (tak sądzę) jest to, że dają dostęp do masy istniejących bibliotek Javy i większości IDE dla Javy za pomocą wtyczek. To bardzo ułatwia start, chociaż nie pozwala zazwyczaj wykorzystać w pełni tych oryginalnych cech i nowych ficzerów. No ale nie od razu Rzym zbudowano.

Frankfurterium   10 #10 01.06.2012 22:57

Panowie, nie tworzę komercyjnego kodu. Rzadko tworzę nawet kod przez kogokolwiek poza mną używalny, więc nikomu krzywdy nie zrobię. Mam chyba prawo, choćby dla własnej zachcianki, poprogramować w GO na JVM, co :P

Jeżeli o IDE chodzi, to długo nie mogłem się zdecydować - Eclipse czy Netbeans. Ostatecznie oba z kilkoma pluginami nawet na dobrym sprzęcie muliły niemiłosiernie, dlatego przerzuciłem się na lekkie edytorki. Teraz nie mogę się zdecydować - Sublime Text 2 czy Kate...

A Scala, jak to ładnie nazwałeś, jest pomostem. Nieco dosadniej - stoi w rozkroku. Mnie osobiście takie rozwiązanie odpowiada. Ogólne przeznaczenie, obiektowość i funkcyjność do kupy.
Wbrew pozorom cała ta 'potworkowatość', jak głupio by to nie zabrzmiało, jest opcjonalna. Kiedy piszemy obiektowo, wiele rzeczy wygląda podobnie jak w innych językach, za to pierwiastek funkcyjny... Kod pisany z jego duchem może być albo piękny, albo potworkowaty, kiedy się przedobrzy (kupa niejawności i opcjonalności). Autor języka i o tym pomyślał. Ten rozdział czytałem po łebkach, ale zdaje się, że część właściwości można zablokować na poziomie kompilatora - tak go ustawić, by w danej sytuacji zgłaszał ostrzeżenie lub nawet błąd.

Virooz   3 #11 01.06.2012 23:30

Zabawa z AI? Nauka nowego języka? A do tego dobra zabawa? Na początku nie mogłem uwierzyć, że to dzieje się naprawdę. :) Idealna rozrywka po skończonej sesji.

Wielkie dzięki za ten interesujący wpis. Zabieram się za czytanie tutoriala i tworzenie własnego bota.

_qaz7   6 #12 02.06.2012 14:04

nie jest to nowy pomysł, w latach 80 były tzw 'Core Wars', gdzie za pomocą Redcode tworzony boty do 'walki'

kokko   2 #13 05.06.2012 12:04

Na to czekałem, dzięki!! Uwielbiam gierki tego typu. Fajnie, że dałeś cynka!
Swego czasu grałem w colobota. Obenie chłopaki z colobot.cba.pl robią colobota 2 na podstawie udostępnionych im źródeł pierwszej wersji. Też by się tym przydało zainteresować jak skończą.