At My Fingertips

In questa attività ti eserciterai nella definizione di funzioni, nell'uso di liste e nelle ripetizioni, allo scopo di implementare la funzione pacman_animato e ricreare l'animazione seguente:

pacman animation

Pac-Man

La funzione pacman dovrebbe generare un Pac-Man in base a un determinato raggio, la cui bocca sia aperta a un determinato angolo_bocca.

Se non lo hai ancora fatto, dovresti risolvere l'attività PyTamaro iconPac-Man e salvare la funzione pacman nella tua toolbox cliccando sull'icona

SaveToToolboxButtonSurrounded.png

sulla cella che contiene la definizione della funzione.

Dopo aver fatto questo lavoro, importa la funzione pacman dalla tua toolbox eseguendo la prossima casella di codice.

Loading...

Animazioni

PyTamaro offre una funzione visualizza_animazione: sposta il cursore sul nome della funzione e leggi la documentazione. Come puoi vedere, la funzione visualizza_animazione riceve un parametro del tipo list[Grafica]: ciò significa che devi fornire alla funzione una lista di grafiche in modo che essa possa mostrartele rapidamente in sequenza, producendo l'effetto di un'animazione.

Ogni elemento nella lista di grafiche sarà rappresentato come un frame nell'animazione. Dato che le dimensioni dell'animazione sono fisse (non si possono cambiare tra un frame e l'altro), tutti gli elementi della lista dovrebbero avere le stesse dimensioni.

La tessera Pac-Man

Pensi che queste due grafiche siano delle stesse dimensioni?

two pacmans

E queste due?

two pacmans background

I primi due Pac-Man occupano una larghezza diversa, ma le dimensioni dello sfondo quadrato sono sempre le stesse.

Di conseguenza, possiamo risolvere il problema delle dimensioni diverse dei Pac-Man utilizzando uno sfondo di dimensioni fisse.

Dobbiamo ora porci una ulteriore domanda: come dovremmo piazzare Pac-Man sullo sfondo?

L'animazione seguente è stata ottenuta combinando il Pac-Man con il centro dello sfondo usando la funzione sovrapponi.

pacman overlay animation

Questo avviene perché la funzione sovrapponi combina due grafiche al loro centro piazzandole una sopra l'altra. Dato che i due Pac-Man, come abbiamo detto, hanno dimensioni diverse, usare sovrapponi dà l'impressione che Pac-Man si stia muovendo in orizzontale.

Per ottenere un risultato più naturale, le grafiche di Pac-Man non dovrebbero soltanto avere tutte le stesse dimensioni (ciò che possiamo ottenere usando uno sfondo), ma i Pac-Man dovrebbero essere tutti nella stessa posizione.

Una soluzione per questo problema potrebbe essere utilizzare le funzioni fissa e componi per fissare la posizione di Pac-Man al lato sinistro dello sfondo, come nell'animazione seguente.

pacman animaiton

Se hai svolto l'attività PyTamaro iconTessere per il labirinto di Pac-Man, hai già implementato una funzione che crea un Pac-Man fissato alla sinistra di uno sfondo nero quadrato: la funzione tessera_pacman.

Se hai già una implementazione, dunque, ti suggeriamo di andare a salvarla nella tua toolbox. In effetti potrebbe servirti anche per un'altra attività (il labirinto di Pac-Man).

Se non hai ancora svolto quell'attività, implementa qui una funzione tessera_pacman: dovrebbe ricevere in input il lato del quadrato (quindi il diametro di Pac-Man) e l' angolo_bocca di Pac-Man e ritornare Pac-Man combinato al centro_sinistra di uno sfondo nero quadrato.

Loading...

Liste di grafiche

COme abbiamo notato in precedenza, la funzione visualizza_animazione riceve un parametro del tipo list[Grafica]. Dobbiamo dunque trovare un modo per creare una lista di grafiche in cui l'apertura della bocca di ciascun Pac-Man sia un po' più ampia di quella del precedente.

A questo scopo, implementiamo una funzione lista_pacman che ritorni la lista di Grafiche della quale abbiamo bisogno.

Una lista di Pac-Man

Descrizione della funzione

Concentriamoci ora sulla funzione lista_pacman. Vogliamo che questa funzione produca una list[Grafica] (una lista di grafiche), contenente un numero a scelta di grafiche che rappresentino Pac-Man, dove il primo Pac-Man cominci con un angolo minimo di apertura della bocca a scelta e ognuno dei Pac-Man successivi apra la bocca un po' di più, fino a raggiungere un angolo massimo di apertura della bocca a scelta, per poi diminuire nuovamente fino a ritornare all'angolo di apertura della bocca iniziale.

Anche il raggio dei Pac-Man può essere a scelta, ma tutti i Pac-Man nella stessa lista dovrebbero avere lo stesso.

Ecco due esempi delle liste di grafiche che dovresti ottenere con la tua funzione lista_pacman.

five pacmans

three pacmans

Scegliere i parametri

La scelta dei parametri dipende da ciò che vogliamo che la funzione sia in grado di fare. Se vogliamo poter scegliere il colore dei Pac-Man, parametrizzare il colore sarebbe una buona idea. Nel nostro caso vogliamo che il colore sia fisso (giallo), per cui il colore dei Pac-Man non dovrebbe essere un parametro della funzione.

D'altra parte, vogliamo poter scegliere il numero di Pac-Man nella nostra lista, per cui uno dei parametri della funzione dovrebbe essere il numero di Pac-Man.

Data la descrizione della funzione, dovrebbe ricevere i parametri seguenti:

  • lato: il lato di ogni tessera Pac-Man (che corrisponde al diametro di Pac-Man);
  • angolo_min: l'angolo minimo di apertura della bocca di Pac-Man, espresso in gradi;
  • angolo_max: l'angolo massimo di apertura della bocca di Pac-man, espresso in gradi;
  • numero_pacman: il numero desiderato di Pac-Man nella lista.

E per quanto riguarda i tipi di dato?

Il lato dovrebbe essere di tipo float, dato che potrebbe accettare anche numeri con la virgola (come 120.5). Anche il tipo di angolo_min e angolo_max dovrebbe essere float, poiché un angolo di apertura della bocca come 60.2° sarebbe valido. Il tipo di numero_pacman (e questo vale in generale per i numeri che vengono usati per contare) dovrebbe essere int, dato che possiamo avere solo un numero intero di Pac-Man.

Di conseguenza, i parametri della nostra funzione saranno i seguenti:

def pacman_list(lato: float, angolo_min: float, angolo_max: float, numero_pacman: int)

Implementare la funzione

Ora, come abbiamo discusso, implementa la funzione lista_pacman in modo che crei una lista di grafiche che rappresentino Pac-Man.

Ricordati di utilizzare la funzione tessera_pacman in modo da avere uno sfondo per Pac-Man.

Nota bene: per aggiungere un elemento a una lista si può utilizzare il metodo append, con la sintassi nomelista.append(elemento). Per esempio, per aggiungere l'elemento 3 a una lista chiamata numeri dovresti digitare numeri.append(3). Dopo aver generato una nuova grafica di Pac-Man puoi dunque usare questo metodo per aggiungerla alla lista.

Loading...

Comprensione di lista

Hai scritto qualcosa di simile a questo?

def lista_pacman(...) -> list[Grafica]:
    centro = numero_pacman // 2
    differenza_angolo = (angolo_max - angolo_min) / centro

    risultato = []
    for i in range(centro):
        # aggiungi Pac-Man crescenti alla lista risultante
        risultato.append(tessera_pacman(lato, angolo_min + i * differenza_angolo))

    for i in range(numero_pacman - centro):
        # add decreasing Pac-Mans to resulting list
        risultato.append(tessera_pacman(lato, angolo_max - i * differenza_angolo))
    return risultato

Ben fatto!

Sapevi che Python offre la possibilità di ottimizzare questo codice usando una comprensione di lista, che permette di riempire una lista basandosi su valori di un'altra lista (come un intervallo di valori)?

Il codice seguente fa la stessa cosa di quello sopra!

def lista_pacman(...) -> list[Grafica]:
    centro = numero_pacman // 2
    differenza_angolo = (angolo_max - angolo_min) / centro
    
    pacman_crescenti = [
        tessera_pacman(lato, angolo_min + i * differenza_angolo) 
        for i in range(centro)
    ]
    pacman_decrescenti = [
        tessera_pacman(lato, angolo_max - i * differenza_angolo) 
        for i in range(numero_pacman - centro)
    ]
    return pacman_crescenti + pacman_decrescenti  # unisci le due liste

Il codice tra parentesi quadre [] può essere scritto su una linea sola, ma abbiamo preferito suddividerlo in linee più brevi.

Capisci questo codice? Sei d'accordo nel dire che le due implementazioni si equivalgono?

Il Pac-Man animato

Come avrai notato, ora disponiamo di un modo per produrre una lista di grafiche che rappresentano Pac-Man, e PyTamaro offre la funzione visualizza_animazione che ci permette di ottenere in output una lista di grafiche interpretate come un'animazione.

Usa la funzione visualizza_animazione e la tua funzione lista_pacman per creare un'animazione.

Fai attenzione ai parametri della funzione lista_pacman! Prova a creare un'animazione di Pac-Man con un lato pari a 160, cominciando con un agolo di apertura della bocca pari a 20 per raggiungere un angolo massimo pari a 120. Usa 10 come numero di frame (vale a dire il numero di Pac-Man nella lista).

Inoltre, la funzione visualizza_animazione può prendere la durata di ciascun frame come secondo parametro se il valore di defalut (40ms) è troppo breve. Nel nostro caso effettivamente lo è: chiama dunque visualizza_animazione utilizzando 100 come secondo parametro.

Loading...

Cos'hai imparato

In questa attività hai imparato come produrre animazioni con la funzione visualizza_animazione, fornendole una lista di grafiche e una durata di visualizzazione di ciascun frame. Abbiamo anche discusso alcuni aspetti specifici, come il fatto che tutti i frame dovrebbero essere costituiti da grafiche delle stesse dimensioni.

Hai esercitato l'uso e la creazione di liste usando cicli e sei stato introdotto al concetto di comprensione di lista.

FOrse hai notato che puoi unire due liste usando +.

Hai anche avuto la possibilità di esercitarti nella scelta dei parametri nel definire la funzione lista_pacman e hai anche scelto i tipi dei parametri.

Hai importato la funzione pacman dalla tua toolbox e forse anche la funzione tessera_pacman.


This activity has been created by Lardelli and is licensed under CC BY-SA 4.0.

It is derived from this activity.

Pac-Man Animato

Logo of PyTamaro

PyTamaro is a project created by the Lugano Computing Education Research Lab at the Software Institute of USI

Privacy PolicyPlatform Version c3a8286 (Mon, 14 Oct 2024 13:30:28 GMT)