Tworzenie własnego bota, cz. 1: Podstawy

02.11.2012 - Kuba Kowalski
Trudność

Protokół komunikacji

Wciąż jednak nie wiemy w jaki sposób napisać bota, który potrafi komunikować się z grą i naprawdę w nią grać. Dlatego w tym rozdziale, na przykładzie gry Kółko i krzyżyk, przedstawimy protokół komunikacji, a w następnym stworzymy bardzo prostego bota poprawnie grającego w tę grę.

Komunikacja pomiędzy botem a logiką (programem kontrolującym zasady gry) przebiega przez standardowe wejście-wyjście. Każdy wysłany komunikat należy zakończyć znakiem nowej linii.

Koniec tury

Wszystkie obsługiwane przez system gry są turowe. Każdy bot sam decyduje kiedy zakończyć swoją turę, ale ma na to określoną zasadami gry ilość czasu. Zakończenie tury polega na wypisaniu na ekran frazy #END\n, gdzie \n jest znakiem nowej linii. Jeśli komunikat systemowy (wszystkie komunikaty zaczynające się od # posiadają specjalne właściwości i nazywane są komunikatami systemowymi) końca tury nie dotrze do gry w wymaganym czasie, gra kończy się błędem z powodu przekroczenia przez bota limitu czasu.

Z punktu widzenia programu bota komunikat końca tury dzieli wykonywany kod na to co się dzieje przed końcem tury od tego co się dzieje już w turze następnej. Innymi słowy wszystkie komunikaty wysłane po #END\n dotrą do logiki dopiero w następnej turze. Program bota można więc sobie wyobrażać w pseudokodzie jako pętlę:

1
2
3
while True:
   RozegrajTure()
   print "#END\n"

Program bota nie musi się kończyć i dopuszczalne (a wręcz pożądane) jest aby działał w nieskończonej pętli. W momencie zakończenia gry system Meridius sam zadba o zamknięcie uruchomionych botów.. Warto jeszcze nadmienić, że zakończenie programu bota zanim zakończy się gra zostaje potraktowane jako ucieczka i kończy grę z błędem z winy bota.

Zapytania

Zapytania są to komunikaty których celem jest uzyskanie informacji na temat aktualnego stanu gry. Prawidłowe zapytania dla danej gry są określone w jej dokumentacji i mają postać funkcji która może (ale nie musi) pobierać pewne argumenty. Gra natomiast przesyła zakończoną znakiem nowej linii odpowiedź na to zapytanie na standardowe wejście.

Rozważmy kilka przykładów. W dokumentacji gry Kółko i krzyżyk jest napisane, że zapytanie LastMove (konwencją jest, że w zapytania są oznaczane kolorem niebieskim) zwraca współrzędne ostatnio postawionego symbolu w formacie x spacja y lub -1 -1 jeśli jest to pierwsza tura gry i żaden z graczy nie postawił jeszcze symbolu. W związku z tym możliwy jest następujący scenariusz komunikacji (kolor czarny oznacza treści wysyłane przez logikę gry):

LastMove
2 2

Był to przykład zapytania które nie posiada argumentów. W grze można również poznać symbol znajdujący się na konkretnej pozycji korzystając z zapytania SymbolAt ?x ?y. O zapytaniu takim można myśleć jak o funkcji nazywającej się SymbolAt i pobierającej dwa argumenty (w przypadku tego zapytania są to dwie liczby oznaczające współrzędne pola o którym chcemy uzyskać informację). Zapytanie takie wywołujemy podstawiając w miejsce argumentów interesujące nas wartości. Pomiędzy kolejnymi argumentami (oraz pomiędzy nazwą funkcji a pierwszym argumentem) musi być co najmniej jedna spacja, a argumenty opcjonalnie można brać w cudzysłów. Przykładowy scenariusz komunikacji:

SymbolAt 1 2
X
SymbolAt "1" 2
X
SymbolAt   2   2
O

Komendy

Przesłane do gry zapytania są od razu obliczane: odpowiedź jest generowana i niezwłocznie przekazywana botowi. Komendy są funkcjami wywoływanymi przez boty analogicznie jak zapytania, różnią się jednak tym, że wykonanie komend jest odłożone na czas po zakończeniu tury przez danego bota i gra w żaden sposób na nie nie odpowiada.

Przykładowo w grze Kółko i krzyżyk bot ma dostępną jedną komendę PlaceSymbol ?x ?y (zgodnie z konwencją komendom przypisany jest kolor czerwony), która jest deklaracją postawienia symbolu na polu ?x ?y. Ponieważ komenda jest wykonania dopiero po zakończeniu tury, nie modyfikuje ona wartości zwracanych przez zapytania, co ilustruje następujący przykład z gry:

SymbolAt 0 0
-
PlaceSymbol 0 0
SymbolAt 0 0
-

Natomiast w sytuacji gdy bot zakończy turę, to kolejne zapytanie będzie miało miejsce po ustawieniu symbolu na wskazanym polu i zwróci nową wartość:

#END
SymbolAt 0 0
O

Podsumowując, najczęstsze wykorzystanie komend i zapytań jest następujące:

  • Zapytania zazwyczaj nie zmieniają stanu gry. Dwukrotne wysłanie takiego samego zapytania w ciągu jednej tury zwróci taką samą odpowiedź.
  • Za pomocą komend boty deklarują jakie wykonają działania. Stan gry jest modyfikowany dopiero po zakończeniu tury.

Przesłane do gry komendy są składowane i wywoływane w takiej kolejności w jakiej przychodziły. Każda gra może jednak różnie definiować szczegóły, np. który ruch brany jest pod uwagę jeśli bot może w trakcie tury może wykonać tylko jedną akcję. W przypadku gry Kółko i krzyżyk liczy się decyzja która została podjęta jako ostatnia.

0
Twoja ocena: Brak

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com