Criada: 2014-07-26 Modificada: 2014-08-29
O jogo será Corrida de Vetores. Como este jogo apresenta inúmeras variações de regras, vamos aqui estabelecer claramente as que serão usadas em nossa disciplina.
Posições, velocidades e acelerações são sempre indicadas como listas [X, Y], com as componentes dos vetores nos eixos x e y, respectivamente. As componentes são sempre números inteiros (positivos ou negativos). A pista sempre circula em torno da origem [0, 0], mas este ponto nunca pertencerá a nenhuma pista.
Os alunos deverão escrever todo o seu jogador dentro de um módulo, cujo nome é formado por seu RA mais uma string à sua escolha. Desta forma, você pode ter vários jogadores diferentes na fase de treinos, variando a string escolhida. Ao término da fase de treinos, apenas um deles deve ser escolhido para ser o seu jogador oficial.
As corridas serão gerenciadas por um gerenciador, que está preparado para coordenar o andamento da corrida, determinar a ocorrência de eventos como colisões e término da prova, e atribuir pontos aos jogadores. Cada pista usada no jogo será implementada também como um módulo, sendo que o nome deste módulo será passado aos jogadores nos predicados de inicialização conforme detalhado mais adiante neste documento.
A interface será composta pelos seguintes predicados. Um módulo de pista exporta predicados para informar sua linha de largada/chegada (que é uma lista de posições), para saber se um ponto está ou não dentro da pista, e para saber o limite de jogadas da pista. Um módulo jogador deverá exportar predicados para escolha do ponto incial e para a execução de jogadas. Convenciona-se que as jogadas serão indicadas pela aceleração, que é a diferença entre o vetor de velocidade desejado para esta jogada e o vetor de velocidade anterior. Assim, acelerações válidas são vetores nos quais cada componente é igual a -1, 0 ou 1.
A especificação exata das interfaces segue. Todos os predicados a seguir devem ser programados para falhar na ressatisfação.
Da parte da pista:
Da parte do jogador:
Cada corrida é iniciada com uma chamada ao predicado inic1 do módulo do Carro 1, para o qual se passa a Pista, e espera-se como resposta a escolha da posição de partida do Carro 1. A seguir, é chamado o predicado inic2 do módulo do Carro 2, passando-se a Pista e a posição já escolhida na Linha pelo Carro 1 para sua largada. O Carro 2 então escolhe uma posição diferente, ainda dentro da Linha, para sua largada, e também sua primeira jogada, em forma de aceleração aplicada à sua velocidade anterior, que é zero.
Neste momento é chamado o precidado acel1 do Carro 1, passando-se como parâmetros a posição de partida escolhida pelo Carro 2 e a aceleração inicial do Carro 2. O Carro 1 retorna com a sua primeira aceleração.
A partir dai, os predicados acel2 de cada módulo são chamados alternadamente, até que um dos jogadores cruze a linha de chegada, ou ambos abandonem, ou o limite de jogadas se esgote. O argumento AcelA corresponde à última aceleração feita pelo adversário, e AcelB é a jogada que está sendo retornada pelo predicado acel2.
Haverá um limite de tempo de 5 segundos para os predicados inic1 e inic2 e 1 segundo de tempo para os predicados acel1 e acel2. Caso o limite de tempo seja excedido, considera-se que foi feita uma jogada inválida e o carro abandona a prova.
Haverá também um limite de tamanho de 1 MB para o código fonte de cada jogador. O sistema de submissão não aceitará arquivos acima deste limite.
A figura ao lado mostra um diagrama de sequência com as chamadas que o gerenciador fará durante a corrida.
A interface em LISP será diferente da interface Prolog. A experiência adquirida nos treinos Prolog nos permitiu identificar oportunidades de melhoria, que esperamos venham a diminuir a dificuldade de programar gerenciadores e corredores. Com a nova interface, os gerenciadores deverão ficar mais livres de erro, e os alunos poderão concentrar seus esforços nas estratégias de jogo, ao invés de gastar tempo em atualizações de estado.
O estado de um carro é uma lista ( T D (X Y) (VX VY) ) de quatro elementos: o número de quadrantes cobertos, o dano, a posição e a velocidade atuais do carro. Vamos à explicação detalhada de cada um destes elementos:
A ideia básica é que haverá apenas uma função a implementar, que receberá os estados de ambos os jogadores, e deverá retornar uma posição no grid de largada (apenas na primeira chamada) ou uma aceleração (nas demais jogadas). A interface LISP completa e suas diferenças em relação à interface Prolog são dadas a seguir:
O número de quadrantes cobertos, T, que inicialmente é igual a zero, se modifica de uma em uma unidade, para mais ou para menos, cada vez que um carro passa de um quadrante para outro. Existem quatro quadrantes, Q1, Q2, Q3 e Q4. Um ponto (X Y) está num quadrante Qi quando:
Observe que a origem (0 0) não está em nenhum quadrante. As pistas são sempre desenhadas de forma a origem não esteja nelas, e que seja impossível passar diretamente de Q1 para Q3 ou vice-versa, ou passar diretamente de Q2 para Q4 ou vice-versa. Desta forma, o contador de quadrantes sempre se modificará no máximo uma unidade, para mais ou para menos, em cada jogada. Quando T chega a 4, o carro conseguiu completar uma volta.
A nota será de 0 a 10, dependendo da colocação do jogador no campeonato. Na fase de treinos (entre o início do período de submissão para uma certa linguagem e o término deste período para a mesma linguagem), cada aluno ou aluna pode submeter vários jogadores, para exercitar diversas estratégias. Porém, ao final do período de submissão, cada aluno ou aluna deve indicar apenas um de seus jogadores para ser o seu jogador oficial, que participará do camponato oficial.
A nota dependerá do desempenho do jogador no campeonato oficial. A nota será proporcional à pontuação no campeonato, da seguinte forma. A nota de um jogador será igual a 10*P/PM, onde P é sua pontuação no campeonato e PM é maior pontuação obtida no campeonato.
Datas importantes:
Data | Atividade |
---|---|
25/09/2014 | começam submissões Prolog |
10/11/2014 | terminam submissões Prolog |
11/11/2014 | começam submissões Lisp |
17-20/11/2014 | campeonato oficial Prolog |
15/12/2014 | terminam submissões Lisp |
20-23/12/2014 | campeonato oficial Lisp |
Os códigos dos alunos serão analisados para ver se contém comandos maliciosos, como tentatva de subverter código do gerenciador ou de colegas, tentativa indevida de acesso ao sistema de arquivos local, tentativa indevida de acesso à rede, etc. Quaisquer arquivos fonte que contiverem comandos considerados maliciosos serão descartados e o aluno que os tiver submetido receberá zero na disicplina como punição, sem prejuízo de outras sanções.
© 2014 João Meidanis