O gerenciador de campeonato funciona perfeitamente em UNIX, conforme as instruções abaixo. Infelizmente, ainda não conseguimos fazê-lo funcionar no XLISP de PC (veja nota sobre portabilidade no final deste documento). Parece que há alguma diferença em como as packages funcionam. Quem descobrir como fazê-lo funcionar nos PCs, por favor me avise, mas não percam seu tempo com isso, pois pode ser uma tarefa sem fim.
O gerenciador de campeonato é um programa em LISP contido
num arquivo chamado camp.lsp
. Para usá-lo,
você tem que ter pelo menos dois módulos que implementam
a funcionalidade de Branco e Preto. Cada módulo deve estar num
arquivo e deve ter um nome. O nome será usado para duas
coisas: dar nome ao arquivo e dar nome ao pacote. Os módulos
devem ser "empacotados" para evitar conflitos de variáveis e
funções entre módulos diferentes. O nome
escolhido para entregar o seu projeto deve ser igual ao seu login, mas
para testar você pode usar qualquer nome.
Você deverá ter no mínimo dois módulos para poder jogar um contra o outro. Nao dá pra fazer campeonato com apenas um jogador. Contudo, mesmo se você tiver apenas uma implementação, poderá fabricar dois módulos iguaizinhos, mas com nomes diferentes, e colocá-los para enfrentar-se. Veja abaixo como preparar módulos e como colocá-los para jogar entre si.
Para exemplificar, suponha que você queira escrever um
módulo de nome "ra999999". Então este módulo deve
necessariamente ser colocado todo num arquivo chamado
ra999999.lsp
, para ser usado pelo gerenciador, e as
primeiras três linhas deste arquivo devem especificar as
características do empacotamento, como segue:
(make-package 'ra999999) (in-package ra999999) (lisp::use-package 'lisp)
Vamos explicar linha por linha o que significam estas operações. (Maiores explicações podem ser obtidas consultando o manual on line.)
(make-package 'ra999999)
Cria novo pacote, chamado "ra999999". Esta operação
dá erro quando já existe um pacote chamado "ra999999". O
pacote pode posteriormente ser removido pela chamada
(delete-package 'ra999999)
.
(in-package ra999999)
Esta operação informa ao interpretador que a partir deste momento todas as variáveis e funções que forem definidas deverão ser colocadas dentro do pacote "ra999999". Note que o nome "ra999999" aqui vai sem apóstrofe.
(lisp::use-package 'lisp)
Esta operação informa o interpretador que a partir
deste momento vamos usar todos os símbolos do pacote "lisp",
já existente no sistema, sem qualificação. O
pacote "lisp" é onde estão todas as
funções pré-definidas do sistema, por exemplo,
car e cdr, então é bom a gente poder usá-las sem
qualificação. "Usar sem qualificação"
significa poder escrever car
ao invés de
lisp::car
, que é o jeito que teria que ser usado
se a gente não faz use-package
. Observe que nesta
própria operação a função
use-package
tem que ser chamada usando
qualificação, já que o pacote "lisp" não
está ainda em uso no pacote "ra999999".
No resto do arquivo ra999999.lsp
você deve
implementar as quatro funções
branco-inicia branco-responde preto-inicia preto-respondedigitando seu código e o código de qualquer função auxiliar usada por estas que não seja pré-definida. Lembre-se de definí-las com o número de parâmetros correto (veja na especificação do projeto).
Se você já tem vários (no mínimo dois) módulos, cada um preparado como acima, poderá usar o gerenciador para promover um campeonato entre eles, da seguinte forma.
/n/lang/bin/xlisp
)
% xlisp XLISP-PLUS version 2.1g Portions Copyright (c) 1988, by David Betz. Modified by Thomas Almy and others. UNIX version >
> (load "camp") ; loading "camp.lsp" T >
campeonato
, passando
como parâmetro uma lista com os nomes de todos os módulos
que vão participar. A função promove os jogos de
todos contra todos, imprime os lances de cada jogo e o resultado, e
quando o campeonato terminar retorna o placar final. Este placar
é uma lista contendo os nomes dos módulos e quantas
vitórias, derrotas, e desclassificações cada
módulo teve. Uma desclassificação ocorre quando
um módulo faz uma jogada inválida em uma partida
(neste caso o oponente é considerado vencedor).
> (campeonato '(ra999999 ra474747 ra987654 ...)) ; loading "ra999999.lsp" ; loading "ra474747.lsp" RA999999 versus RA474747 1. BRANCO (7 1) 2. PRETO (2 7) ... (VITORIA BRANCO) ((RA999999 20 10 0) (RA474747 3 27 0) ... )
> (load "c:/joao/lisp/mc600/camps/camp") T
xx-
na frente de todos os nomes.
> (load "modulo1") T > (load "modulo2") TOutra coisa importante: apenas um dos módulos deverá ter as funcoes "branco-inicia" e "branco-responde", e o outro deverá ter "preto-inicia" e "preto-responde" (sem
xx-
na frente).
partida
com as
funções
jogadoras como argumentos como segue:
> (partida #'branco-inicia #'branco-responde #'preto-inicia #'preto-responde)Isto promoverá uma partida entre o módulo que implementa o branco e o que implementa o preto.