Skip to content

Guia de Colaboracao Criando um coach basico

Alexsandro Francisco edited this page Jul 7, 2021 · 1 revision

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}

Bonus: Nomeclatura de Coaches

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