3.6.2. Rozpoczynamy¶
3.6.2.1. Tworzenie robota¶
Podstawowa struktura klasy reprezentującej każdego robota jest następująca:
class Robot:
def act(self, game):
return [<some action>, <params>]
Na początku gry powstaje jedna instanacja klasy Robot
. Oznacza to,
że właściwości klasy oraz globalne zmienne modułu są współdzielone między
wywołaniami. W każdej rundzie system wywołuje metodę act
tej instancji
dla każdego robota, aby określić jego działanie.
(Uwaga: na początku przeczytaj reguły.)
Metoda act
musi zwrócić jedną z następujących odpowiedzi:
['move', (x, y)]
['attack', (x, y)]
['guard']
['suicide']
Jeżeli metoda act
zwróci wyjątek lub błędne polecenie, robot pozostaje
w obronie, ale jeżeli powtórzy się to zbyt wiele razy, gracz zostanie zmuszony
do kapitulacji. Szczegóły omówiono w dziale Zabezbieczenia.
3.6.2.2. Odczytywanie właściwości robota¶
Każdy robot, przy użyciu wskaźnika self
, udostępnia następujące
właściwości:
location
– położenie robota w formie tupli (x, y);hp
– punkty zdrowia wyrażone liczbą całkowitąplayer_id
– identyfikator gracza, do którego należy robot (czyli oznaczenie “drużyny”)robot_id
– unikalny identyfikator robota, ale tylko w obrębie “drużyny”
Dla przykładu: kod self.hp
– zwróci aktualny stan zdrowia robota.
W każdej rundzie system wywołując metodę act
udostępnia jej stan gry
w następującej strukturze game
:
{
# słownik wszystkich robotów na polach wyznaczonych
# przez {location: robot}
'robots': {
(x1, y1): {
'location': (x1, y1),
'hp': hp,
'player_id': player_id,
# jeżeli robot jest w twojej drużynie
'robot_id': robot_id
},
# ...i pozostałe roboty
},
# ilość odbytych rund (wartość początkowa 0)
'turn': turn
}
Wszystkie roboty w strukturze game['robots']
są instancjami specjalnego
słownika udostępniającego ich właściwości, co przyśpiesza kodowanie.
Tak więc następujące konstrukcje są tożsame:
game['robots'][location]['hp']
game['robots'][location].hp
game.robots[location].hp
Poniżej zwięzły przykład drukujący położenie wszystkich robotów z danej drużyny:
class Robot:
def act(self, game):
for loc, robot in game.robots.items():
if robot.player_id == self.player_id:
print loc
3.6.2.3. Przykładowy robot¶
Poniżej mamy kod prostego robota, który można potraktować jako punkt wyjścia.
Robot, jeżeli znajdzie wokół siebie przeciwnka, atakuje go, w przeciwnym
razie przemieszcza się do środka planszy (rg.CENTER_POINT
).
import rg
class Robot:
def act(self, game):
# if we're in the center, stay put
if self.location == rg.CENTER_POINT:
return ['guard']
# if there are enemies around, attack them
for loc, bot in game.robots.iteritems():
if bot.player_id != self.player_id:
if rg.dist(loc, self.location) <= 1:
return ['attack', loc]
# move toward the center
return ['move', rg.toward(self.location, rg.CENTER_POINT)]
Użyliśmy, jak widać modułu rg
, który zostanie omówiony dalej.
Informacja
Podczas gry tworzona jest tylko jedna instancja robota, w której można zapisywać trwałe dane.
Informacja
Niniejsza dokumentacja jest nieautoryzowanym tłumaczeniem oficjalnej dokumentacji dostępnej na stonie RobotGame.
Materiały Python 101
udostępniane przez
Centrum Edukacji Obywatelskiej na licencji
Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.
Utworzony: | 2022-05-22 o 19:52 w Sphinx 1.5.3 |
---|---|
Autorzy: | Patrz plik “Autorzy” |