-
Notifications
You must be signed in to change notification settings - Fork 7
Guia de Colaboracao Criando um coach basico
Para criarmos um coach precisamos antes entender os metodos necessarios para sua implementacao. Esses metodos podem ser facilmente observados atraves do codigo:
from abc import ABC, abstractmethod
class BaseCoach(ABC):
NAME = "BASE_COACH"
def __init__(self, match): # 1 construtor
self.match = match
@abstractmethod
def decide (self): # 2 decide
raise NotImplementedError("Coach needs decide implementation!")
def get_positions(self, foul, team_color): # 3 get_positions
return None
1 - Construtor: Como metodo construtor da classe coach, e interessante adicionar a ela todos os objetos relevantes que voce usara na implementacao do seu coach, No nosso exemplo iremos adicionar tres objetos que sera as nossas estrategias de atacante, goleiro e meio campista, deixaremos a implementacao para o futuro.
Crie um arquivo chamada my_coach.py
dentro da pasta entities/coach
. Vamos comecar dessa forma:
from entities.coach.coach import BaseCoach
import strategy
class Coach(BaseCoach): # heranca da classe abstrata
NAME = "MY-COACH"
def __init__(self, match):
super().__init__(match) # chamada do metodo da classe mae
self.attacker_strategy = strategy.tests.Idle(self.match)
self.midfielder_strategy = strategy.tests.Idle(self.match)
self.goalkeeper_strategy = strategy.tests.Idle(self.match)
Nesse segmento de codigo criamos uma classe chamada Coach, e demos a ela o NAME = "MY-COACH"
. Fizemos isso chamando o __init__
da classe mae. Caso nao esteja familiriazado com isso recomendamos ler alguns textos sobre heranca e classes abstratas em python.
2 - Decide: O Decide e quem realmente define qual robo vai performar qual estrategia, cada robo devera receber uma estrategia. Uma estrategia nao pode ser atribuida a mais de um robo. O objeto que representa o robo em nosso codigo e a classe Robot e temos a instancia dos robos que controlamos no jogo na lista robots
dentro do objeto match
. Dessa forma podemos acessa-los e atribuir a estrategia. Nesse caso faremos uma regra bem simples: robo 0 = atacante, robo 1 = meio campista, robo 2 = goleiro.
from entities.coach.coach import BaseCoach
import strategy
class Coach(BaseCoach): # heranca da classe abstrata
NAME = "MY-COACH"
def __init__(self, match):
super().__init__(match) # chamada do metodo da classe mae
# vamos usar strategies de teste por enquanto, essa deixa o robo parado
self.attacker_strategy = strategy.tests.Idle(self.match)
self.midfielder_strategy = strategy.tests.Idle(self.match)
self.goalkeeper_strategy = strategy.tests.Idle(self.match)
def decide(self):
# esta lista eh ordenada em [robot_0, ..., robot_n]
robots = [r.robot_id for r in self.match.robots]
strategies = [
self.attacker_strategy, self.midfielder_strategy,
self.goalkeeper_strategy
]
for robot, strategy in zip(robots, strategies)
if robot.strategy is not None:
# vamos evitar chamar o start todo frame
# pode ser que essa strategia seja pesada de carregar
continue
robot.strategy = strategy
robot.start()
Okay! agora temos um Coach funcional! nele iremos adicionar as estrategias aos robos de forma deterministica!
3 - get_positions: SOON ...
Agora com o seu coach pronto, podemos adicionar ele a lista de coaches disponiveis para uso. Para isso, va no modulo __init__.py
do coach. la voce vera algo assim:
from entities.coach.coach import BaseCoach
from entities.coach.larc2020 import Coach as LarcCoach
from entities.coach.iron2021 import Coach as IronCoach
from entities.coach.experiment_astar import Coach as AstarCoach
# Importe aqui seu coach!
_coach_list = [
LarcCoach,
IronCoach,
AstarCoach
# Adicione aqui seu coach!
]
COACHES = {c.NAME: c for c in _coach_list}
Voce devera importa-lo nesse arquivo e depois referencia-lo na lista _coach_list
. Apos isso voce ja podera escolher o seu coach adicionando o NAME dele ao campo coach_name
ao arquivo config.json
da inicializacao do NeonFC!
Com o caso do nosso exemplo devera ficar assim:
from entities.coach.coach import BaseCoach
from entities.coach.larc2020 import Coach as LarcCoach
from entities.coach.iron2021 import Coach as IronCoach
from entities.coach.experiment_astar import Coach as AstarCoach
from entities.coach.my_coach import Coach as MyCoach
_coach_list = [
LarcCoach,
IronCoach,
AstarCoach,
MyCoach
]
COACHES = {c.NAME: c for c in _coach_list}
funcao | template | exemplo |
---|---|---|
coach de competicao | {COMP}_{ANO} | LARC_2020, IRON_2021 |
coach de estrategia pessoal (testes) | TEST_{NAME} | TEST_ALEX, TEST_GABRIEL |
coach experimental, para visualizar algum algoritmo ou implementacao | EXPERIMENTAL_{NAME} | EXPERIMENTAL_ASTAR, EXPERIMENTAL_PENALTY |