Escreve um simulador de robôs.
O centro de testes de uma fábrica de robôs precisa de um programa para verificar os movimentos dos robôs.
Os robôs têm três movimentos possíveis:
Os robôs são colocados numa grelha infinita hipotética, virados para uma direção específica (north, east, south ou west), num conjunto de coordenadas {x,y}, por exemplo, {3,8}, com as coordenadas a aumentar para north e east.
Depois, o robô recebe várias instruções e, nesse momento, o centro de testes verifica a nova posição do robô e a direção para a qual está virado.
Os testes estão divididos em 3 passos.
Corre todos os testes com go test ou corre testes específicos com a opção -tags.
Exemplos:
go test # run all tests
go test -tags step1 # run just step 1 tests.
go test -tags 'step1 step2' # run step1 and step2 tests
É-te fornecido o ficheiro de código defs.go, que define várias coisas de que o programa de teste precisa. Está organizado em três secções, uma por passo.
Para completar o passo 1, vais definir Right, Left, Advance, N, S, E, W e Dir. Completa o passo 1 antes de avançares para o passo 2.
No passo 1 implementaste os movimentos do robô, mas não é grande simulação. Por exemplo, onde está "o robô" no código-fonte? Onde está "a grelha"? Onde estão os cálculos que transformam as ações do robô em posições na grelha, no robô ou na grelha? O mundo físico é diferente.
O passo 2 introduz uma "sala". Parece uma pequena adição, mas vamos fazer grandes alterações para clarificar os papéis de "sala", "robô" e "programa de teste", e começar a clarificar a física da simulação. Vais definir Room e Robot como funções que o programa de teste "traz à existência" ao lançá-las como goroutines. A informação circula entre o programa de teste, o robô e a sala através de canais Go.
Pensa na Room como um "motor de física", algo que modela e simula uma sala física com paredes e um robô. Deve, de alguma forma, modelar o espaço de coordenadas da sala, a localização do robô e das paredes e garantir, por exemplo, que o robô não atravessa paredes. Queremos que o Robot seja um agente que executa ações, mas queremos que a Room mantenha uma verdade coerente.
O programa de teste cria os canais e arranca tanto a Room como o Robot. O programa de teste envia depois comandos ao Robot. Quando termina de enviar comandos, fecha o canal de comandos. O Robot tem de aceitar comandos e informar a Room das ações que está a tentar executar. Quando deteta que o canal de comandos está a fechar, tem de se desligar. A sala tem de interpretar as consequências físicas das ações do robô. Quando deteta que o robô se está a desligar, envia um relatório final ao programa de teste, indicando a posição e a direção finais do robô.
O passo 3 tem três grandes alterações:
Para o relatório de posição final enviado pela Room3, podes devolver a mesma slice recebida do canal dos robôs, apenas com as posições e direções atualizadas. Têm de ser enviadas mensagens para o canal de registo nos seguintes casos:
Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos165 exercícios, e mentoria humana real, tudo grátis.