Main page
         Tutorial
         Gallery
         Downloads

Programowanie mrowek



Wstep

Zakladam, ze czytelnikowi jest znany jezyk LISP, przynajmniej w podstawowym zakresie.
Uzytkownicy linuxa powinny sciagnac snapshota, skompilowac i zainstalowac AntzLisp'a.
Dla uzytkownikow Windowsa jest przygotowana specjalna binarka, prosze przejsc w dzial Download.
Przed odpalaniem programow dla mrowek nalezy ustawic poprawna sciezke do binarki AntzLisp'a w AntzSimulatorze, wchodzac w menu Options->Settings.

Lekcja 1: Przemieszczanie

Do pierwszej lekcji uzyjemy przykladowej mapy Tutorial1.abm.
Najpierw nauczymy sie pisac podstawowy program dla naszych mrowek, dzieki ktoremu nasze mrowki beda umialy sie przemieszczac.
Najpierw napiszemy swoisty Hello World!

(defun main () ())

Co robi ten program? Na razie nic, ale zaraz nauczymy nasza mrowke poruszac sie przed siebie.
Mrowka porusza sie przy pomocy funkcji ant_move, ktora ma postac (ant_move kierunek), przy czym kierunek to argument: FORWARD, BACKWARD, LEFT, RIGHT, UP, DOWN.

(defun main () (ant_move 'FORWARD))

No, nasza mroweczka porusza juz sie do przodu, tylko w koncu natrafia na sciane. Teraz musimy nauczyc ja obracania sie.
Obracamy sie przy pomocy funkcji ant_rotate, ktora ma postac (ant_rotate kierunek), przy czym kierunek to argument: LEFT lub RIGHT.
Ale skad bedziemy wiedzieli kiedy sie obrocic? To co widzi mrowka jest zapisane w zmiennych LEFT, FRONT, RIGHT i HERE.
Maly schemacik:

^
| W te strone jest obrocona mrowka
|

-- F2 --
L2 F1 R2
L1 HH R1

Legenda:
-- - miejsce niewidoczne.
HH - miejsce mrowki, rowniez zawartosc zmiennej HERE.
L1, L2 - elementy listy LEFT.
F1, F2 - elementy listy FRONT.
R1, R2 - elementy listy RIGHT.

Typ widocznego pola okreslaja stale: TUNNEL, TUNNEL_UP, TUNNEL_DOWN, EARTH, STONE, STOCK, QUEEN, SPAWN_POINT, ENEMY_STOCK, ENEMY_QUEEN, ENEMY_SPAWN_POINT.

Czyli np. jesli mrowka widzi przed soba kolejno tunel, a potem kamien, zawartosc listy FRONT bedzie wygladac tak: FRONT = '(TUNNEL STONE).
I jak sie domyslacie, to po czym bedziemy decydowac czy mrowka ma skrecic czy nie, jest pierwszy element listy FRONT(bedziemy sprawdzac czy jest rowny TUNNEL).

Teraz napiszemy program, dzieki ktoremu mrowka skreci w prawo, jesli przed soba ma cos innego niz tunel, w przeciwnym razie pojdzie prosto.
Czy wiecie jak pobrac pierwszy argument z listy? Sluzy do tego funkcja elt, ktora ma postac (elt lista indeks), czyli zeby pobrac pierwszy element z listy FRONT odpalamy (elt FRONT 0).

(defun main () (if (equal (elt FRONT 0) 'TUNNEL)
(ant_move 'FORWARD)
(ant_rotate 'RIGHT)
)
)


Prawda, ze proste?
Zeby bylo ciekawej, zrobimy, ze mrowka losowo bedzie skrecac w lewo lub w prawo. Do losowania liczb sluzy funkcja random, ktora ma postac (random n), przy czym funkcja losuje liczby z zakresu 0 do n. Funkcja zwraca liczbe zmiennoprzecinkowa, wiec musimy ja zaokraglic funkcja floor.

(floor (random 2))

I teraz jak sprawimy zeby mrowka skrecala losowo? Nic trudniejszego!

(defun main () (if (equal (elt FRONT 0) 'TUNNEL)
(ant_move 'FORWARD)
(ant_rotate (elt '(LEFT RIGHT) (floor (random 2))
)
)
)
)


W nastepnej lekcji naucze was kopania tuneli.

Lekcja 2: Kopanie

To bedzie bardzo krotka lekcja. Kopac w ziemi mozna przy pomocy funkcji (ant_dig). Mrowka wtedy kopie przed siebie.
Usprawnimy program z poprzedniej lekcji tak, zeby mrowka rowniez sprawdzala czy nie ma przed soba ziemi, jesli tak sie zdarzy, rozkazemy jej kopac!
Uzyjemy funkcji warunkowej cond, ktora ma postac (cond (cond1 var1) (cond2 var2) ...).
Dziala na tej zasadzie, ze sprawdza czy wynik dzialania kodu cond1 jest prawda, jesli jest wtedy odpala kod var1, a jesli nie, wtedy sprawdza wynik dzialania kodu cond2 i pewnie domyslacie sie co dalej.
Oto poprawiony kod z poprzedniej lekcji:

(defun main () (cond
((equal (elt FRONT 0) 'TUNNEL) (ant_move 'FORWARD))
((equal (elt FRONT 0) 'EARTH) (ant_dig))
(T (ant_rotate (elt '(LEFT RIGHT) (floor (random 2)))))
)
)