Pràctica de Python de l'assignatura de Llenguatges de Programació (LP) de la Facultat d'Informàtica de Barcelona. En aquesta pràctica he realitzat un Bot de Telegram capaç de generar Skylines de ciutats.
En aquest fitxer, és troben totes les llibreries necessàries per a poder executar el bot. Per a instalar totes les llibreries del fitxer només cal executar la següent instrucció en el terminal.
pip install -r requirements.txt
Com executar el programa
python3 bot.py
El programa principal és el bot.py. Aquest fitxer, genera un objecte del tipus Bot i l'inicialitza. Un cop executat el programa, el bot passa a estar a disposició de l'usuari.
L'usuari te dues opcions per a interactuar amb el bot.
-
/start: Inicia la conversa amb el Bot.
-
/help: Llista de totes les possibles comandes i una breu documentació sobre el seu propòsit i ús.
-
/author: Autor del projecte
-
/lst: Mostra els identificadors definits i la seva corresponent àrea.
-
/clean: Esborra tots els identificadors definits.
-
/save id: Guarda un Skyline per a que puguis fer-lo servir quan vulguis.
-
/load id: Carrega un Skyline que tinguis guardat.
-
Crear Skyline Simple:
Crea un Skyline amb només un edifici
(1,2,3)
-
Crear Skyline Compost:
Crea un Skyline amb diversos edificis
[(1,2,3),(4,5,6)]
-
Crear Skyline aleatori:
Crea un Skyline amb
n
edificis, cadascun d’ells amb una alçada aleatòria entre0
ih
, amb una amplada aleatòria entre1
iw
, i una posició d’inici i de final aleatòria entrexmin
ixmax
{200,50,10,1,200}
-
Assignació:
Guarda un Skyline en una variable temporal.
a := (1,2,3)
-
Unió:
Uneix dos Skylines, quedant-se amb les parts comunes i no comunes dels dos.
a := (1,2,3) + (2,4,6)
-
Intersecció:
Uneix dos Skylines, quedant-se només amb les parts comunes dels dos.
a := (1,2,3) * (2,4,6)
-
Repetir:
Replica
n
cops el Skylinea := (1,2,3) * 5
-
Desplaçar a la dreta:
Desplaça cap a la dreta
n
posicionsa := (1,2,3) + 2
-
Desplaçar a l'esquerra:
Desplaça cap a l'esquerra
n
posicions. Els Skylines mai començaran en posicions negatives.a := (1,2,3) - 2
-
Mirall:
Reflecteix el Skyline
a := -(1,2,3)
Cal destacar, la diferencia entre enviar el missatge a := (1,2,3)
i el missatge (1,2,3)
. En el primer cas el Skyline es guarda a la variable a
, en el segon cas, el bot només mostra com quedaria un Skyline amb aquesta forma, en cap cas el guarda.
En aquest projecte intervenen principalment 3 Classes importants:
Aquesta és la classe que s'encarrega de gestionar els Skylines. Hi trobem mètodes per operar amb ells a més de poder-los guardar en imatges i en format .sky.
Respecte a la implementació, he optat per a implementar un mètode per cada operador. Aquests mètodes apliquen l'operació agafant els Skylines del paràmetre implícit i del paràmetre explícit.
Un cop implementats els mètodes he optat per sobrecarregar els operadors de la classe (+, *, -, ...).
En aquest apartat comentaré breument, certs atributs interessants de la classe Skyline per a poder entendre el funcionament del bot. Prendrem com exemple aquest Skyline:
a := [(1,2,3),(3,2,5),(5,5,10)]
-
self.llistaAccions: Llista en la que guardem el llistat de accions que han fet possible generar el Skyline. En el Skyline de la figura tindriem:
self.llistaAccions = [(1,2,3),(3,2,5),(5,5,10)]
-
self.llistaParts: Si agafem el mateix Skyline de adalt, el llistat de parts seria un llista amb les accions compactades. En aquest cas la llista de parts quedaria de la següent forma:
self.llistaParts = [(1,2,5),(5,5,10)]
Veiem com en aquest cas les accions (1,2,3) i (3,2,5) és poden unificar en una sola part.
Aquesta és la classe que s'encarrega d'analitzar sintàcticament les expressions escrites per l'usuari en el xat de telegram. Un cop fet l'anàlisis, fa ús de la classe Skyline per calcular el Skyline corresponent.
Conté un mètode per executar una instrucció i diversos mètodes per a comunicar el Bot de Telegram amb els Skylines del usuari.
Aquesta és la classe que implementa el Bot. En aquesta classe es defineixen les funcions Handler que enllaçant amb les comandes del Bot. Aquesta classe fa ús de la classe interpret.py per a poder tractar amb la gramàtica i els Skylines.
S'emmagatzema per cada usuari el llistat dels seus Skylines de manera que es manté la privacitat de les dades en aquest sentit.
De cara a implementar les operacions de unió i intersecció, m'ha semblat interessant que cada Skyline tingues un atribut "llistaParts". Per a poder calcular aquesta llista només ha calgut, recorrer la llista d'accions ordenada i compactar al maxim les accions, formant parts.
Donat que el temps per a fer aquesta pràctica ha estat limitat, no he pogut implementar totes les funcionalitats que m'agradaria haver-hi implementat si hi hagués tingut més temps. M'hauria agradat afegir més funcionalitats al programa, com per exemple poder introduir expressions aritmètiques dins de la construcció de Skylines compostos. També m'hauria agradat donar més informació sobre quin error està cometent l'usuari a l'hora d'introduir alguna comanda, per així facilitar la interacció amb l'usuari.
- Marc Domènech i Vila - Initial work - MarcDV1999
This project is licensed under the MIT License - see the LICENSE.md file for details
- Gràcies al meu germà per dedicar-se a testejar que el bot funcioni correctament.