G00004_ca
PacMan
Omer Giménez Mario G. Munzón Jordi Petit Salvador Roura |
1 Regles del joc
Aquesta és una versió multi-jugador del PacMan, el clàssic joc
d’arcade.
Resumint, cada jugador controla un pacman i diversos fantasmes que
es mouen en un tauler rectangular que conté un laberint. A cada
casella del tauler poden haver-hi cocos (dots) que aporten
punts, cocos energètics (pills) que aporten punts i donen
poder als pacmans, i bonus que aporten encara més punts i efectes
especials. En mode normal, els pacmans no poden tocar els fantasmes
perquè sinó moren. Però quan un pacman és poderós,
aleshores córre al doble de velocitat i pot menjar els fantasmes
enemics, els quals moren. De fet, els pacmans i els fantasmes
no morrn permanentment, sinó que després d’un cert temps,
es regeneren. Quan el joc acaba, el jugador amb més punts
guanya la partida.
A continuació es donen les regles del joc amb més detall:
2 Programació
En el web https://pacman.jutge.org trobareu el material
necessari per programar el joc en C++. En concret, hi teniu tots els
fitxer de suport, exemples de jugadors, i un visor de partides amb
els quals podreu desenvolupar i provar els vostres jugadors.
Necessitareu g++, make i un navegador recent. El
codi del joc és portable a qualsevol sistema Linux, Mac o Windows,
suposant que hi instal·leu les eines adequades.
Els ordinadors de la FIB i de la FME tenen aquest software instal·lat.
Amb Debian o Ubuntu, amb una instrucció del tipus
sudo apt-get install build-essential chromium-browser
tindreu tot el que us cal.
Amb Mac, tindreu tot el que us cal si instal·leu XCode des de l’App Store.
Amb Windows, hauria de ser fàcil. Si algú fa el favor de dir-m’ho, ho publicaré.
2.1 Com fer un jugador
Per fer un jugador, copieu primer el fitxer PlayerNull.cc o
PlayerDemo.cc a un fitxer XXX.cc, on XXX
és un identificador de la vostra elecció. Trieu un identificador no
ofensiu, que no hagi estat triat ja per un altre estudiant, i
compost per, com a molt, 12 lletres, dígits i caràcters de
subratllat; per exemple, PacLady.
A continuació, al fitxer PacLady.cc (o com l’hagueu
anomenat) que acabeu de crear, heu de canviar la línia 15 per posar-hi
el nom del vostre jugador (a l’exemple, #define PLAYER_NAME PacLady.
Finalment, heu d’implementar el vostre jugador tot completant la
classe PLAYER_NAME que hereda les operacions de consulta del tauler
(classe Board) i de creació d’accions (classe Action) a través
de la classe base Player. El mètode play() es crida a cada ronda
per transmetre-us l’estat actual del tauler i recollir les accions
del vostre jugador. A la vostre classe, podeu afegir camps (variables)
per recordar l’estat d’una ronda a l’altra, podeu afegir mètodes (o funcions)
per descompondre el vostre programa, ètc.
Fixeu-vos que la vostra classe ha de continir una funció anomenada
factory() que no heu de modificar, i que després de la classe també
hi ha una crida per registrar el vostre jugador que tampoc heu de
modificar.
2.2 Com executar i veure partides localment
- Editant el Makefile podeu incorporar el fitxer AIDummy-SISTEMA.o
(segons el sistema que tingeu) a la compilació per a poder usar el Dummy a les vostres partide. Podeu fer el mateix amb els fitxers .o d’altres jugadors.
- Executeu make all per compilar tots els fitxers que
calguin i crear l’executable PacMan.
- Disputeu la partida amb una comanda com ara
./Game Demo PacLady -i demo.cnf -o partida.pac.
Aquí, el primer jugador serà Demo, el segon PacLady i la partida
començarà amb la descripció demo.cnf i el resultat quedarà a
partida.pac.
- Visualitzeu la partida executant ./viewer.sh partida.pac, que
buscarà un navegador i l’obrirà.
Podeu obtenir la llista de paràmetres del programa PacMan amb
./Game --help. En particular ./Game --list us llistarà
els noms dels jugadors inclosos.
Si us cal, podeu netejar el vostre directori de fitxers executables i
fitxers objectes amb la comanda make clean.
2.3 Restriccions
Els codis del jugadors que volgueu enviar al web del joc han de complir certes
limitacions:
- Tot el codi del vostre jugador s’ha de trobar en un sol fitxer i seguir
les convencions donades.
- No podeu fer servir variables globals (utilitzeu camps).
- Només podeu usar les llibreries estàndard de C++, com ara
vector, map, ètc.
- No podeu obrir fitxers, ni fer altres crides al sistema operatiu
(threads, forks, etcètera).
- Si us cal, podeu utilitzar cout i cerr, però usar cin no té
sentit. Però compte, escriure missatges consumeix temps.
- En execució local, el sistema no controla jugadors que
abortin, que triguin massa, o que interfereixin amb els
contraris. En l’execució al servidor, sí.
2.4 Estructures de dades
Per saber com consultar el tauler, doneu un cop d’ull a les
operacions públiques de la class Board del fitxer Board.hh.
Per saber com donar les accions, doneu un cop d’ull a les
operacions públiques de la class Action del fitxer Action.hh.
Fixeu-vos que només podeu utilitzar les operacions públiques
d’aquestes classes.
3 Consells
Us recomanem seguir els consells següents:
- Estudieu la part pública de les classes lliurades. No us preocupeu
per les parts privades ni la implmentació.
- Sembla que el visor funciona millor amb Chrome que amb
Firefox. Però, compte, per raons de seguretat, per veure partides
locals, cal obrir Chrome amb la opció --allow-file-access-from-files, que permet llegir fitxers del
vostre disc.
- Comenceu amb estratègies molt senzilles, que siguin fàcils de
programar i de depurar, que és exactament allò que necessiteu al
principi.
- Programeu procediments senzills i útils, i assegureu-vos
que funcionin correctament.
- No us arrisqueu a ser eliminats abans de començar. Aconseguiu
que el web us accepti un jugador tan ràpidament com us sigui
possible. Un jugador acceptat representa tenir assegurada part de
la nota de la pràctica!
- Conserveu diverses versions antigues (però que funcionin
correctament) dels vostres jugadors, i no les toqueu per res.
- Compileu sovint, testejeu sovint. És molt més fàcil
trobar i corregir els errors quan s’han canviat unes poques línies
de codi que quan s’acumulen molts canvis de cop.
- Feu servir cerrs per posar xivatos, i asserts
per comprovar que el codi fa el que toca. Però comenteu els
cerrs abans d’enviar el jugador al web, ja que alenteixen
els programes.
- Per testejar un jugador nou, enfronteu-lo contra uns altres
jugadors que no treguin cap missatge. Així només apareixeran per
pantalla els missatges del nou jugador.
- Un error de segmentació en el vostre codi aturarà el simulador,
i no podreu veure què ha provocat l’error del jugador. Apreneu a
usar el valgrind si no sou capaços de corregir els errors
amb cerrs.
- Poseu les opcions de debug al Makefile per ajudar-vos
a trobar possibles errors.
- No us arrisqueu a quedar eliminats per culpa d’un jugador massa
lent. Doneu-vos un bon marge de seguretat. En particular, eviteu
tant com pugueu l’escriptura de missatges.
- Feu competir els vostres jugadors contra rivals diferents, i
estudieu les partides. Encara que no podreu veure els codis dels
altres estudiants, si sou capaços de deduir les seves tàctiques i us
semblen útils, podeu mirar d’imitar-les, defensar-vos-en o
millorar-les.
- No deixeu el vostre codi a ningú, ni tan sols d’una versió
antiga. Un cop feta la competició s’analitzaran els programes de
cada ronda amb programes detectors de plagi (JPlag, per exemple).
També es comparan els jugadors d’aquest curs amb els jugadors de
cursos anteriors. Passar-vos els fitxers .so té menys risc,
però es poden fer servir per endevinar la vostra estratègia.
- Per evitar disgustos, feu servir el web del joc per jugar
partides amb els vostres amics. Però no confieu massa en els
vostres amics...
- Tingueu en compte que podeu lliurar nous jugadors en qualsevol
moment (excepte durant la fase final).
- No espereu fins al darrer moment per enviar les vostres solucions.
Els demés també ho fan i la cua del Jutge no dóna l’abast.
- Insistim: Feu codis senzills. Compileu sovint, testejeu sovint.
O afronteu-ne les conseqüències.