A criação e execução do jogador em Java é um pouco mais complexa do que foi em Lisp e em Prolog. Nestas últimas, era necessário apenas enviar ao campeonato um arquivo contendo o código fonte, que precisava apenas conter as funções (ou predicados) previamente especificadas. No campeonato de Java você deverá criar um jogador que obedeça a algumas regras simples de orientação a objetos. Além disso, será permitida a criação de um número ilimitado de classes para que uma boa estratégia seja implementada. Dessa forma, você terá permissão de enviar vários arquivos “.java” ao servidor, compactados no formato “.zip”
O presente documento visa instruir os alunos a criar um jogador que seja considerado válido para o campeonato. Para tanto, pressupõe-se que você já tenha algumas noções de orientação a objetos em Java.
Para acompanhar as intruções é necessário que você tenha em seu computador:
A biblioteca breaklib é composta de um conjunto de interfaces necessárias para que o seu código seja compilado. Além disso, a biblioteca fornece um modo de execução para que você possa testar o seu jogador localmente. A figura abaixo mostra as interfaces presentes na biblioteca.
Recomenda-se fortemente utilizar o javadoc para obter informações detalhadas sobre cada classe antes de continuar.
Para criar o seu jogador, o ponto de partida será o jogador vazio. Para tanto, utilize o editor de texto de sua preferência.
Observe no jogador vazio a declaração da classe pública:
public class raxxxxxx implements PlayerInterface {
Indica que a classe pública satisfaz o comportamento especificado pela interface PlayerInterface, cuja definição está na biblioteca breaklib.jar vista na seção anterior. O fato de implementar esta interface indica que esta classe possui os métodos start, myMove e lastMove, essenciais para que o campeonato possa se comunicar com o jogador:
O método start recebe como parâmetro um objeto que implementa a interface BoardInterface. Dessa forma, é possível acessar os métodos deste objeto usando a definição da própria interface. O método myMove, por outro lado, deverá enviar ao campeonato uma instância de uma classe que implementa a interface MoveInterface e, por conseguinte, a classe que implementa MoveInterface lhe obriga a criar uma classe que implemente PositionInterface.
Resumindo, para que o seu jogador seja válido, você deverá obrigatoriamente criar classes que implementem PlayerInterface, MoveInterface e PositionInterface. Opcionalmente você poderá criar classes que implementem BoardInterface (leia o arquivo EmptyBoard.java para maiores detalhes) ou quantas classes de suporte achar necessário. Recomenda-se que você escreva cada classe em um arquivo separado, uma prática comum entre os programadores de Java.
Para compilar o seu jogador localmente (recomendamos que faça isso antes de enviar ao servidor), você deverá utilizar a biblioteca breaklib.jar.
O comando para compilar o código é o javac, que deverá receber a localização do arquivo jar através da opção classpath. Dessa forma, procure no seu computador pelo executável javac, que por padrão, está na pasta bin do diretório onde você instalou o JDK.
No Windows, supondo que você instalou o JDK no diretório “C:\Arquivos de Programas\Java\jdk1.6.0_05” e colocou o arquivo breaklib.jar no diretório C:\java, a linha de comando para compilar o seu arquivo raxxxxxx.java é:
C:\Arquiv~1\Java\jdk1.6.0_05\bin\javac -classpath .;C:\java\breaklib.jar raxxxxxx.java
No Linux, supondo que você instalou o JDK no diretório /usr/lib/jvm/java-6-sun/ e colocou o arquivo breaklib.jar no diretório /java/, a linha de comando para compilar o seu arquivo raxxxxxx.java é:
/usr/lib/jvm/java-6-sun/bin/javac -classpath .:/java/breaklib.jar raxxxxxx.java
Observe que você deverá executar esse comando no mesmo diretório do arquivo raxxxxxx.java. Caso o arquivo raxxxxxx.java utilize outras classes que não foram compiladas, o comando javac as compilará automaticamente.
Agora que você já está com o jogador compilado, é possível testá-lo.
Execute a biblioteca breaklib.jar passando como parâmetro o nome do seu jogador sem a extensão .java.
No Windows, considerando os diretórios do exemplo de compilação da seção anterior, use a seguinte linha de comando:
C:\Arquiv~1\Java\jdk1.6.0_05\bin\java -classpath .;C:\java\breaklib.jar GameViewer raxxxxxx
No Linux, também considerando os diretórios do exemplo de compilação da seção anterior, use a seguinte linha de comando:
/usr/lib/jvm/java-6-sun/bin/java -classpath .:/java/breaklib.jar GameViewer raxxxxxx
Será aberta a seguinte interface gráfica:
A interface gráfica é dividida em duas áreas. A primeira área, identificada como “Results”, mostrará o histórico de interações entre você e seu jogador. Uma informação importante nesse histórico é o tempo que o seu jogador demorou para realizar as jogadas. Não esqueça que o campeonato não esperará mais de um segundo para receber a jogada.
A segunda área é composta das caixas de texto e botões necessários para que você acesse os métodos start, myMove e lastMove de seu jogador. O formato de entrada segue o padrão:
**Start:Lines:**Columns **:WhitePositions:**BlackPositions
**WhitePositions:**Position1;Position2;Position3
**BlackPositions:**Position1;Position2;Position3
Position: Line,Column
**lastMove:**Position1-Position2
Por exemplo, um jogo pode ser iniciado com o seguinte comando inserido no campo de texto “start” e clicando no botão “»” ao lado do campo de texto.
4:4:1,1;1,2;1,3;1,4:4,1;4,2;4,3;4,4
Em seguida, o jogo pode continuar fornecendo-se a seguinte jogada:
4,3-3,3
Por fim, pede-se uma jogada ao jogador java que fornece:
1,4-2,3
A figura abaixo ilustra a inserção das jogadas acima:
Na interface gráfica não há uma verificação para saber se o jogo acabou e, muito menos, para saber se alguma das jogadas foi inválida. Espera-se que, localmente, você seja capaz de identificar ambos os eventos. Entretanto, durante o campeonato, assim como ocorreu nos campeonatos anteriores, a sua jogada será validada e o sistema identificará o término da partida.
Antes de enviar o seu jogador, você deverá compactar todas as suas classes em um arquivo com a extensão “.zip” (mesmo que tenha criado o jogador em um arquivo só). Preste muita atenção no modo como você está compactando os arquivos, pois é uma exigência que a classe raxxxxxx (onde xxxxxx é o seu ra), que implementa a interface PlayerInterface, esteja na raiz do arquivo compactado e não dentro de uma pasta qualquer.