Tip
- Każdy "klocek" można testować osobno, a później w połączeniu z innymi. Warto i trzeba zmieniać kolejność stosowanych reguł!
To będzie nasza domyślna reguła. Umieszczamy ją w pliku robot01.py
zawierającym niezbędne minimum działającego bota:
python
rgkod01.py
Metody i właściwości biblioteki rg:
rg.toward(poz_wyj, poz_cel)
– zwraca następne położenie na drodze z bieżącego miejsca do podanego.self.location
– pozycja robota, który podejmuje działanie (self
).rg.CENTER_POINT
– środek areny.
Co powinien robić robot, kiedy dojdzie do środka? Może się bronić lub popełnić samobójstwo:
python
rgkod02.py
Wersja wykorzystująca pętlę.
python
rgkod03.py
Metody i właściwości biblioteki rg:
Słownik
game.robots
zawiera dane wszystkich robotów na planszy. Metoda.iteritems()
zwraca indekspoz
, czyli położenie (x,y) robota, oraz słownikrobot
opisujący jego właściwości, czyli:- player_id – identyfikator gracza, do którego należy robot;
- hp – ilość punktów HP robota;
- location – tupla (x, y) oznaczająca położenie robota na planszy;
- robot_id – identyfikator robota w Twojej drużynie.
rg.dist(poz1, poz1)
– zwraca matematyczną odległość między dwoma położeniami.
Łącząc omówione wyżej trzy podstawowe reguły, otrzymujemy robota podstawowego:
python
rgkod04a.py
Wybrane działanie robota zwracamy za pomocą instrukcji return
. Zwróć uwagę, jak ważna jest w tej wersji kodu kolejność umieszczenia reguł, pierwszy spełniony warunek powoduje wyjście z funkcji, więc pozostałe możliwości nie są już sprawdzane!
Powyższy kod można przekształcić wykorzystując zmienną pomocniczą ruch
, inicjowaną działaniem domyślnym, które może zostać zmienione przez kolejne reguły. Dopiero na końcu zwracamy ustaloną akcję:
python
rgkod04b.py
Przetestuj działanie robota podstawowego wystawiając go do gry z samym sobą w symulatorze. Zaobserwuj zachowanie się robotów tworząc różne układy początkowe:
(env)~/robot$ python ./symuluj robot04a.py robot04b.py
Robota podstawowego można rozbudowywać na różne sposoby przy użyciu różnych technik kodowania. Proponujemy więc wersję **A** <klocki02a>
opartą na funkcjach i listach oraz wersję **B** <klocki02b>
opartą na zbiorach. Obie wersje implementują te same reguły, jednak efekt końcowy wcale nie musi być identyczny. Przetestuj i przekonaj się sam.
Tip
Przydatną rzeczą byłaby możliwość dokładniejszego śledzenia decyzji podejmowanych przez robota. Najprościej można to osiągnąć używając polecenia print
w kluczowych miejscach algorytmu. Podany niżej Kod nr 6 wyświetla w terminalu pozycję aktualnego i atakowanego robota. Kod nr 7, który nadaje się zwłaszcza do wersji robota wykorzystującej pomocniczą zmienną ruch, umieszczony przed instrukcją return
pozwoli zobaczyć w terminalu kolejne ruchy naszego robota.
python
for poz, robot in game.robots.iteritems():
if robot.player_id != self.player_id:
if rg.dist(poz, self.location) <= 1:
print "Atak", self.location, "=>", poz
return ['attack', poz]
python
print ruch[0], self.location, "=>",
if (len(ruch) > 1):
print ruch[1]
else:
print