Anda di halaman 1dari 14

Departamento de Cincia da Computao IME-USP

MAC2166 Introduo Computao


Escola Politcnica Primeiro Semestre de 2016
Segundo Exerccio-Programa (EP2)
Data mxima para entrega: 7/5/2016
verso 1.0
20 de abril de 2016
If Pac-Man had affected us as kids, wed all be running
around in dark rooms, munching pills and listening to
repetitive electronic music.
Marcus Brigstocke
A ghost, as I trust that you are all aware by now, is the
imprint of a departed soul left upon the earth... and of
course, as Potter so wisely tells us, transparent.
Prof. Severus Snape

Introduo

O Pac-Man um dos jogos eletrnicos mais


conhecidos do mundo. Criado nos anos 80 por
Toru Iwatani, hoje professor na Tokyo Polytechnic University, esse jogo simples tornou-se
mundialmente conhecido por jogadores de arcades e consoles tradicionais. Numa poca em
que tirar proveito dos poucos recursos de hardware era desafiador para os programadores, a
ideia simples do Pac-Man conseguiu capturar
o interesse de muitas pessoas: movimentando
o personagem ttulo em 4 direes em um labirinto, o jogador precisava comer o maior nmero possvel de itens similares a moedas chamadas de pac-dots sem se chocar com fantasmas que tambm se movimentavam no labirinto. Para sorte do jogador, no tabuleiro havia alguns pac-dots especiais, maiores que os
demais que, caso comidos, davam ao Pac-Man o poder temporrio de matar os fantasmas
(Se que possvel matar um fantasma :-P) caso se chocasse com eles. Aqui tem um
vdeo com uma partida do jogo original do Pac-Man.
1

A tarefa neste EP implementar um jogo de Pac-Man mais simples do que o original.


A ideia exercitar a programao com listas e funes em Python. A cada iterao, o
usurio poder mover o Pac-Man, enquanto os fantasmas se movem de forma aleatria.
O EP tambm depender da leitura de arquivos. Apesar dessa parte j estar pronta
no esqueleto do EP que ser fornecido, entender o cdigo referente a isso um objetivo
secundrio do EP.
Por ltimo mas no menos importante, este EP tambm ajudar a exercitar mais a
implementao passo a passo de um problema maior (no caso, funo a funo) e a seguir
padres pr-definidos em um cdigo-fonte. Tanto a implementao passo a passo quanto
a implementao de cdigos sobre um cdigo j existente so importantes no apenas
para programao de computadores. Em qualquer projeto grande, importante testar as
partes desenvolvidas antes de junt-las e chegar no produto final. Alm disso, muito
comum entrar em projetos j existentes e nesse caso voc precisar aprender a concluir as
partes faltantes desses projetos aproveitando aquilo que j tiver sido feito e respeitando
os padres pr-definidos por aqueles que j estavam no projeto desde o seu incio.

Regras do jogo

importante observar que na implementao deste EP voc s poder usar


recursos do python apresentados em sala de aula pelo seu professor.
O mapa do jogo, o labirinto, ser lido de um arquivo que dever estar localizado na
mesma pasta do arquivo .py com o cdigo do EP. O mapa contm a posio inicial do
Pac-Man e as posies iniciais dos fantasmas.
A qualquer momento do jogo, cada fantasma ter uma direo de movimento que
indica para onde ele se move. As direes possveis so esquerda, direita, para cima e para
baixo. Uma direo de movimento D possvel se o fantasma pode ser movido uma casa
na direo D, ou seja, se no h uma parede na casa adjacente ao fantasma na direo D.
No incio do jogo, para cada fantasma sorteada uma direo ao acaso. Cada iterao
do jogo prossegue da seguinte forma:
1. Primeiro, movemos cada fantasma. Considere um fantasma com direo de movimento D. Se as nicas direes de movimento possveis para o fantasma so D e,
2

opcionalmente, a direo oposta a D, ento movemos o fantasma uma casa na direo D. Caso contrrio, sorteamos uma nova direo de movimento para o fantasma
dentre as direes possveis e movemos o fantasma uma casa na direo sorteada.
Note que a direo sorteada passa a ser a nova direo de movimento do fantasma.
Note tambm que dois fantasmas podem ocupar a mesma posio ao mesmo tempo.
2. Verifica-se se houve coliso entre o Pac-Man e algum dos fantasmas, caso em que o
jogo termina.
3. O usurio escolhe uma direo de movimento para o Pac-Man e ele movido uma
casa na direo escolhida, se possvel. Se a nova casa ocupada pelo Pac-Man contm um pac-dot, ento o total de pac-dots comido aumentado e aquele pac-dot
removido. Se a nova casa ocupada pelo Pac-Man contm um fantasma, ento o jogo
acaba.
4. Se todos os pac-dots foram comidos, ento o jogo acaba.
Ateno: No Pac-Man o tabuleiro cclico. Ou seja, se o tabuleiro tem tamanho 5 7 e
o Pac-Man ou um fantasma na posio (3, 6) se move para a direita, ento ele reaparece
na posio (3, 0), por exemplo. Idem na direo vertical. Desde que no haja uma parede
impedindo tal movimento, claro.

Preparando os feixes de prtons


O objetivo deste EP implementar funes que sigam
as regras do jogo e os passos explicados na seo anterior.
Assim como no EP1b, voc dever implementar e utilizar
as funes que sero especificadas daqui para frente sem
modificar os prottipos e os comentrios. Assim como
explicado no EP1b, altamente recomendvel que voc implemente uma funo de cada vez e teste antes de passar
para a prxima. Recomendamos fortemente que os passos
descritos abaixo sejam seguidos risca. Comece pelo Passo
1 e, com exceo deste passo, no comece a realizar a tarefa
do Passo n sem ter terminado a tarefa do Passo n 1 pois
para que a tarefa do Passo n funcione corretamente voc
precisar ter feito a tarefa do passo anterior.

Passo 1: Leitura da configurao inicial


Acesse a pgina do EP2, faa download dos arquivos ep2.py, pacman.py, extras.py
e dos vrios arquivos de labirintos fornecidos l. Esses arquivos de labirinto sero teis
para voc testar o seu programa sem necessidade de criar labirintos novos. Caso voc crie
arquivos de labirintos novos, no deixe de compartilhar no frum do EP para que outros
3

alunos (e os professores) possam usar nos testes dos seus programas. Coloque todos os
arquivos na mesma pasta e abra o ep2.py, o pacman.py e o extras.py no editor de sua
preferncia1 .
O arquivo ep2.py o arquivo que contm o main do EP2. O arquivo pacman.py o
arquivo que contm as diversas funes para controle do jogo. Voc precisar editar ambos
e entregar ambos na grana. O arquivo extras.py um arquivo opcional onde voc pode
colocar funes ou variveis que voc ache necessrias no seu EP. Se voc no adicionar
nenhuma funo ou varivel neste arquivo, voc no precisa entreg-lo na grana. Caso
contrrio, sim, voc deve entreg-lo.
Rode o ep2.py da forma como voc baixou da pgina do EP2. Voc ver que ele j
capaz de pedir para o usurio o nome de um arquivo de labirinto, ler esse arquivo, carregar
o labirinto em uma matriz, e imprimir o contedo dessa matriz, bem bagunada, na tela.
Ok, j alguma coisa :-) . Comente ou apague a linha que imprime a matriz e pronto. Se
voc conseguiu chegar at aqui, voc terminou o Passo 1!

Passo 2: Criao do Pac-Man e dos fantasmas


O arquivo de labirinto lido no Passo 1 representa explicitamente o labirinto do jogo
do Pac-Man. Cada linha do arquivo representa uma linha do labirinto, que termina com
uma linha em branco. Todas as linhas do labirinto devem ter o mesmo tamanho.
Os caracteres usados para representar o labirinto so os seguintes:
+ representa uma parede;
. representa um pac-dot;
C representa o Pac-Man;
F representa um fantasma;
Esses so os nicos caracteres permitidos no arquivo. Fantasmas so opcionais, mas
sempre necessrio especificar uma nica posio inicial para o Pac-Man.
O seu EP deve ser capaz de funcionar com labirintos com qualquer quantidade de
linhas, colunas, paredes (+), pac-dots (.) e fantasmas (F).
Se voc quiser ver o contedo do arquivo do labirinto basta abri-lo em algum editor
de textos no seu computador. Abaixo est o contedo de um arquivo de labirinto com 31
linhas e 27 colunas. H 5 fantasmas. O Pac-Man est na linha 15 e coluna 13.
+++++++++++++++++++++++++++
+F.....................F..+
+.++++++++++.++.+++++++++.+
1

Informaes sobre 3 opes de editores encontram-se no apndice deste documento

+.++++++++++.++.+++++++++.+
+......++....++...++......+
+++.++.++.+++++++.++.++.+++
+++.++.++.+++++++.++.++.+++
+...++...............++...+
+.++++.+++++.++.++++.++++.+
+.++++.+++++.++.++++.++++.+
+............++...........+
++++++.++.+++++++.++.++++++
++++++.++.+++++++.++.++++++
++++++.++.........++.++++++
++++++.++.+++++++.++.++++++
++++++.++.+..C..+.++.++++++
..........+.....+.......F..
++++++.++.+.....+.++.++++++
++++++.++.+++..++.++.++++++
++++++.++.........++.++++++
++++++.+++++.++.++++.++++++
++++++.+++++.++.++++.++++++
+......++....++...++......+
+.++++.++.+++++++.++.++++.+
+.++++.++.+++++++.++.++++.+
+.........F...............+
+.++++.+++++.++.++++.++++.+
+.++++.+++++.++.++++.++++.+
+.++++.+++++.++.++++.++++.+
+............++.......F...+
+++++++++++++++++++++++++++
Neste passo voc precisar escrever duas funes. Uma que cria o Pac-Man e outra
que cria os fantasmas. O Pac-Man vai ser representado por uma lista, dentro do main()
do seu programa, com contedo:
[linha, coluna, direo, pontos]
na qual linha e coluna so a posio atual do Pac-Man, direo representa a ltima
direo escolhida pelo usurio para movimentar o Pac-Man e pontos conta quantos pacdots o Pac-Man j comeu. Considere que inicialmente a direo PARADO2 . Essa lista
representando o Pac-Man ter que ser constantemente atualizada durante o jogo medida
que o Pac-Man se movimenta.
A funo criaPacMan, que j possui o prottipo escrito no arquivo pacman.py deve
receber como parmetro a matriz do labirinto e retornar como sada a lista representando
2

No incio do pacman.py h 5 variveis chamadas ESQUERDA, DIREITA, CIMA, BAIXO e PARADO que
podem ser usadas no seu cdigo para facilitar a legibilidade

o Pac-Man. Voc precisa escrever esta funo e cham-la logo depois que o
labirinto for lido do arquivo dentro do main(). Note que a funo deve encontrar o
Pac-Man no labirinto, armazenar as informaes sobre ele na lista destinada a isso e, no
lugar onde o Pac-Man estava no labirinto, colocar uma posio vazia, que ser representada
na matriz por um espao em branco ( ). A ideia ter o labirinto apenas com paredes,
pac-dots e espaos vazios. O Pac-Man e os fantasmas ficaro armazenados em listas fora
do labirinto e sero colocados nas posies corretas apenas na impresso do labirinto.
A outra funo que deve ser escrita neste passo a funo que cria os fantasmas. Os
fantasmas sero representados como uma lista, dentro do main() do seu programa, com
contedo:
[[linha, coluna, direo], [linha, coluna, direo], ...]
Ou seja, cada posio da lista, que tambm uma lista, representa um fantasma com
sua posio (linha e coluna) e direo do movimento escolhido aleatoriamente (direo)
que pode ser ESQUERDA, DIREITA, CIMA e BAIXO. A lista que representa os fantasmas
ter que ser constantemente atualizada durante o jogo medida que os fantasmas se
movimentam.
A funo criaFantasmas, que j possui o prottipo escrito no arquivo pacman.py,
deve receber como parmetro a matriz do labirinto e retornar como sada a lista de listas
representando os fantasmas. Voc precisa escrever esta funo e cham-la logo depois da funo que criou o Pac-Man. Note que a funo deve encontrar os fantasmas
no labirinto, armazenar as informaes sobre eles na lista destinada a isso e, nos lugares onde os fantasmas estavam no labirinto, colocar pac-dots (Os fantasmas no comem
pac-dots).
Neste ponto do EP voc j tem o contedo do labirinto carregado na memria bem
como o status do Pac-Man e dos fantasmas. Agora necessrio colocar tudo para se
movimentar!

Passo 3: Impresso correta do labirinto


Antes de colocar todo mundo para se movimentar importante mostrar para o usurio
uma viso do labirinto para que ele decida para onde ele vai mover o Pac-Man, por isso
esse passo tem que ser feito antes do passo que vai movimentar os personagens.
A impresso correta do labirinto, ao invs daquele print que voc comentou ou apagou
no Passo 1, tem que ser feita com a implementao da funo imprimeLabirinto definida
no arquivo pacman.py. A funo recebe como parmetro uma matriz representando o
labirinto, uma lista, representando o Pac-Man, e uma outra lista, representando os fantasmas. Voc precisa escrever esta funo e cham-la logo depois da funo que
criou os fantasmas. Note que a funo no deve ler o labirinto de novo do arquivo. O
que ela precisa fazer consultar o contedo do labirinto que j est salvo em uma matriz e,
baseado nesse labirinto, posicionar corretamente o Pac-Man e os fantasmas na impresso.
6

Nesse ponto do EP, o usurio j consegue comear a jogar pois ele j ser capaz de ver
o labirinto e tomar uma deciso sobre para qual direo mover o Pac-Man.

Passo 4: Definio da direo do Pac-Man


No fim do passo 3 voc se preparou para colocar todos os personagens para se movimentar. Mas calma! Falta definir para onde o Pac-Man ir. Para isso escreva no main do
seu EP um trecho de cdigo que imprima na tela para o usurio:
Direo (a - esquerda, s - direita, w - cima, z - baixo):
e que leia do teclado algum dos 4 caracteres para definir a direo de movimentao do
Pac-Man. Uma vez lido o caractere, essa direo tem que ser atualizada na lista que
representa o Pac-Man (lembre-se que ele estava PARADO at ento).
Criada essa interao com o usurio para pedir a direo de movimentao do PacMan, est finalizado o Passo 4! Agora sim possvel colocar todos os personagens para
se moverem.

Passo 5: Movimentao dos fantasmas


Antes do usurio ter outra chance de mover o Pac-Man, todos os fantasmas devem
andar 1 casa para alguma direo. Essa direo j foi definida anteriormente no Passo 2.
A movimentao dos fantasmas tem que ser feita por meio da implementao da funo
movimentaFantasmas que est com prottipo escrito no arquivo pacman.py. Essa funo
recebe como parmetro uma matriz com o contedo do labirinto e a lista que representa
os fantasmas. A funo precisa, para cada fantasma, mudar caso necessrio a direo
de movimentao do fantasma de acordo com a explicao feita na Seo 2, e atualizar
suas posies. Note que o contedo do labirinto no precisa ser modificado nessa funo.
O labirinto s precisa ser passado para que a nova direo de movimentao de cada
fantasma seja definida corretamente.
A funo deve tambm imprimir, para cada fantasma, a posio que ele ocupava e a
nova posio para onde ele se moveu. Imprimir essas informaes ser til tambm para
verificar se a sua funo est funcionando corretamente.

Passo 6: Verificao de fim de jogo e impresso do labirinto


Como os fantasmas se movimentaram no passo anterior, nesse ponto do jogo pode ser
que o jogo j tenha terminado porque algum fantasma chocou-se com o Pac-Man. Por isso,
voc precisa implementar e chamar a funo verificaColisao. Essa funo deve receber
como parmetros a lista do Pac-Man e a lista dos fantasmas e caso algum fantasma esteja
na mesma posio que o Pac-Man, deve retornar True. Caso contrrio, ela deve retornar
False.
7

No main do cdigo deve ser verificado o retorno da funo e, caso tenha havido algum
choque, o programa deve imprimir o labirinto e terminar com a mensagem abaixo:
Game over! Pontos = %d
onde o %d representa quantos pac-dots foram comidos pelo Pac-Man.
Se no houve choque, o programa deve continuar.
Para imprimir o labirinto, voc deve usar a funo imprimeLabirinto que implementou no Passo 3. Porm, dever fazer uma alterao nessa funo para que ela imprima o
caractere X na posio em que houve a coliso entre o Pac-man e algum dos fantasmas
(note que essa alterao no deve afetar a impresso de uma situao em que no h
coliso).

Passo 7: Movimentao do Pac-Man


Agora que os fantasmas j so capazes de se movimentar, a vez do Pac-Man andar e tentar comer alguma pac-dot. Para isso voc deve implementar e chamar a funo
movimentaPacMan que tem prottipo no arquivo pacman.py. A funo recebe como parmetro a matriz com o contedo do labirinto e a lista que representa o Pac-Man. Caso a
direo definida pelo usurio para o Pac-Man seja invlida porque h uma parede, nada
muda na matriz e nem na lista do Pac-Man. Se ela uma direo vlida, necessrio
atualizar a posio do Pac-Man.
Se houver algum fantasma na posio para onde o Pac-Man foi movido, o jogo tem
que terminar. Para isso, deve-se verificar se houve um choque com algum fantasma (basta
chamar a funo que voc implementou no Passo 6 e realizar a verificao feita l tambm).
Se o Pac-Man no se chocou com nenhum fantasma e tinha uma pac-dot na posio para
onde ele se moveu, remove-se a pac-dot do labirinto, colocando uma posio vazia no
lugar, e aumenta-se a pontuao do Pac-Man de 1 unidade. Caso o Pac-Man tenha se
chocado com algum fantasma, ento deve ser impresso o labirinto e a mesma mensagem
do Passo 6.
A funo deve tambm imprimir a posio que o Pac-Man ocupava e a nova posio
para onde ele se moveu. Caso ele no tenha se movido, imprima a informao de que o
movimento do Pac-Man no possvel. Imprimir essas informaes ser til tambm
para verificar se a sua funo est funcionando corretamente.

Passo 8: Verificao de fim de jogo


Se o jogo no terminou no passo anterior por choque do Pac-Man com algum fantasma,
pode ser que o Pac-Man tenha comido a ltima pac-dot. Essa verificao deve ser feita com
a implementao e chamada da funo aindaTemPacDots definida no arquivo pacman.py.
Esta funo recebe como parmetro a matriz do labirinto. Se ainda houver alguma pac-dot

no labirinto, essa funo retorna True. Caso contrrio, ela retorna False. No caso de
retornar False, o programa deve imprimir o labirinto e terminar com a mensagem:
Congratulations! Pontos = %d

Passo 9: Loop principal do jogo


Parte do que voc escreveu at o Passo 8 precisa ser repetido at que o jogo termine.
O objetivo do Passo 9 justamente bolar como essa repetio tem que ser feita. Sinta-se
livre para criar novas funes que no estejam definidas no arquivo pacman.py caso voc
ache necessrio. O mesmo vale para variveis. Porm, faa isso no extras.py.

Entrega do EP

Os arquivos ep2.py e pacman.py devero ser submetidos na rea especificada na


Grana. Os nomes desses arquivos no devem ser alterados. Se voc criou alguma nova
funo ou varivel para o seu programa no extras.py, voc deve submeter este arquivo
tambm.
Lembre que na implementao deste EP voc s poder usar recursos do
python apresentados em sala de aula pelo seu professor.

Apndice Opes de ambiente de desenvolvimento para


implementar o EP2
Neste EP recomenda-se que o processo de escrita e execuo do cdigo seja realizado
por meio de alguma das 3 alternativas explicadas a seguir: utilizao do ambiente de
desenvolvimento Spyder, utilizao do ambiente de desenvolvimento idle ou edio dos
arquivos .py em qualquer editor de texto de sua preferncia e execuo direta na linha de
comando.
Independente de qual opo voc escolha, certifique-se de que voc faa o
download do interpretador do python verso 3. No utilize outra verso.

4.1

Spyder

O Spyder um ambiente de desenvolvimento com suporte linguagem Python. Diferente de um editor de textos convencional, um ambiente de desenvolvimento j possui
diversas ferramentas que auxiliam o programador nas tarefas de desenvolvimento.
Para instalar o Spyder, instale primeiro o Anaconda no seu computador. Provavelmente voc j ter feito isso no incio do semestre. Se no fez ainda, siga as instrues
deste vdeo. Embora o vdeo descreva a instalao do Anaconda no Windows, o processo
similar para outros sistemas operacionais.
Tendo instalado o Anaconda, abra o Launcher, que deve ter sido colocado no menu
de programas do seu sistema operacional aps a instalao, e na lista de aplicativos que
aparecer escolha Instalar (Install ) ou atualizar (Update) o Spyder. A opo de Update
vai aparecer caso voc j tenha o Spyder instalado. A Figura 1 mostra essa tela.

Aguarde o processo de atualizao ou instalao terminar. A tela do Launcher ser


atualizada e na lista de aplicaes, o Spyder aparecer apenas com o boto Launch habilitado. Clique nesse boto e espere o aplicativo abrir.
Uma vez iniciado o programa, abra os arquivos ep2.py e pacman.py que voc baixou
da grana indo no menu File -> Open. Aps abrir os dois arquivos, expanda a rea
do "Console"no canto inferior direito da janela do Spyder com o mouse para facilitar a
visualizao da execuo do EP2. Neste ponto a tela do Spyder deve estar semelhante
quela apresentada na Figura 2.

Certifique-se de que est com a janela do ep2.py selecionada no Spyder e clique no


boto de Play verde localizado no menu de atalhos. Ao fazer isso o seu programa entrar

10

Figura 1: Tela do Launcher para instalar o Spyder


em execuo e toda a interao dever ser feita pelo console que est no canto inferior
direito do Spyder.
Neste ponto voc j pode editar os arquivos. No se esquea de salv-los com frequncia
a cada mudana realizada.
Mais informaes sobre o Spyder podem ser encontradas aqui.

4.2

idle

O idle outra opo de ambiente de desenvolvimento para programao em python.


Para instalar o idle, siga as instrues contidas aqui na seo Instalando usando
python.org no fim da pgina. No momento em que voc estiver lendo este documento
provvel que haja verses mais novas dos softwares que devem ser baixados em relao s
verses mostradas no processo de instalao do vdeo. Certifique-se de baixar as verses
mais recentes e ditas como estveis, tomando cuidado para baixar o python verso
3.
Uma vez iniciado o programa, abra os arquivos ep2.py e pacman.py que voc baixou
da grana indo no menu File -> Open. Aps abrir os dois arquivos, a tela do seu
computador deve estar semelhante quela apresentada na Figura 3.

11

Figura 2: Tela do Spyder


Certifique-se de que est com a janela do ep2.py selecionada no idle e clique no
menu em Run -> Run Module. Ao fazer isso o seu programa entrar em execuo e toda
a interao dever ser feita pelo console do python que ser trazido para frente pelo idle.
Neste ponto voc j pode editar os arquivos. No se esquea de salv-los com frequncia
a cada mudana realizada.
Mais informaes sobre o idle podem ser encontradas aqui.

4.3

Linha de comando

Voc no obrigado a utilizar o Spyder e nem o idle para escrever o seu EP2.
Qualquer editor de textos ou ambiente de desenvolvimento com suporte a python pode
ser utilizado. Basta voc certificar-se de enviar na grana os arquivos ep2.py e pacman.py
para que possam ser corrigidos.
Caso voc utilize outro editor de textos ou ambiente de desenvolvimento que no tenha
integrao com o python, e considerando que voc tem o python verso 3 instalado no seu
computador, voc pode executar o seu programa por meio do prompt de comandos. Cada
sistema operacional tem um nome diferente para o prompt de comandos. No OSX por
exemplo, o nome Terminal. Executando este programa voc ser apresentado janela
da Figura 4.

Uma vez naquela janela voc deve executar o comando cd para ir at a pasta onde
12

Figura 3: Tela do idle


est o seu EP2 e uma vez l, rodar o cdigo com o comando python ep2.py. A Figura 5
mostra a execuo do EP2 no terminal do OSX.

Neste ponto voc j pode editar os arquivos. No se esquea de salv-los com frequncia
a cada mudana realizada no seu editor de textos ou ambiente de desenvolvimento de
preferncia.

13

Figura 4: Tela do Terminal

Figura 5: Execuo do EP2 no Terminal

14