Criada: 2007-08-01 Modificada: 2007-09-29 Modificada: 2007-10-08
A linguagem escolhida para esta seção do curso é Lisp.
Usaremos a implementação CLISP ou CMUCL. Ambas são igualmente adequadas para os propósitos da disciplina. Para o jogo (veja abaixo detalhes sobre ele) daremos preferência a CLISP.
Manual online do padrão Common Lisp. Se estiver fora do ar, tente este.
Livro interessante: Practical Common Lisp, de Paul Seibel, Apress, 2005. Texto integral na Internet. Infelizmente, não tem exercícios.
Quase cem exercícios Lisp. Em construção.
O jogo a ser implementado neste semestre será o Bloxorz.
A codificação de um jogo em Lisp será através de uma lista
(T (X Y))
, onde T
é uma lista contendo as
posições existentes, cada uma delas sendo uma lista de dois números
inteiros, e X, Y
são as coordenadas do
buraco. A posição inicial do bloco é sempre (0,0). Tanto a casa
inicial quanto a final devem estar no tabuleiro, e devem ser
distintas. Não importa a ordem das casas em T
.
Por exemplo, ( ((0 1) (0 0) (0 2) (1 0) (1 1) (1 2)) (1
0))
é um jogo válido.
Uma solução é codificada como uma lista de átomos :N, :S, :L,
:O
, significando um movimento em direção ao norte, sul, leste
ou oeste, respectivamente. Observe que os movimentos são keywords,
para evitar problemas de igualdade entre átomos de pacotes distintos.
A convenção a ser seguida é: norte significa incremento na coordenada
Y; sul significa decremento em Y; leste é incremento em X; e oeste,
decremento em X. A solução deve conduzir da posição inicial ao
buraco, de acordo com os movimentos do bloco, que começa em pé na
posição inicial e deve chegar em pé ao buraco, sem cair para fora do
tabuleiro antes disso.
Por exemplo, (:N :L :S)
é uma solução válida para o jogo
acima.
Cada aluno deverá implementar um pacote (package) que
contenha as funções bolar
e resolver
. A
função bolar
não recebe nenhum argumento e retorna uma
lista com dois elementos: um jogo codificado como acima, e uma
solução, A função resolver
recebe um jogo e retorna uma
solução para ele.
Os jogos não poderão ter mais do que 1000 casas.
Para implementar um pacote, basta colocar logo no início do programa linhas da forma:
(cl:defpackage "RANNNNNN-VERSAO"(:use "COMMON-LISP"))
(in-package "RANNNNNN-VERSAO")
onde RANNNNNN
é o seu RA, e VERSAO
é a
versão, ou seja, um sufixo que permita a você ter vários jogadores
diferentes nas fases de aquecimento e treino. O nome do arquivo
contendo o jogador deve ser igual ao nome do pacote seguido da
extensão .lisp
, ignorando-se
diferenças entre maiúsculas e minúsculas. Por exemplo,
raNNNNNN-versao.lisp
, é um nome válido para o arquivo do
pacote acima.
Até o dia da prova é obrigatório entregar pelo menos um jogador que não cometa erros. Depois disso haverá mais tempo para aperfeicoá-lo.
Acesso à arena dos jogos.
© 2007 João Meidanis