Programmazione a blocchi
Per preparare il gioco della classe, Giulia ha trascinato alcuni blocchi nell'area degli script: lo sprite si muove, parla, cambia costume. Nessuna riga di codice scritta a mano: i blocchi si incastrano come i pezzi di un puzzle. Ma perché il suo personaggio non parte quando clicca la bandiera? E perché quello di Marco conta sempre lo stesso numero? In questa pagina impari a leggere e costruire i programmi a blocchi, e a trovare gli errori. Alla fine ritroveremo il caso di Giulia.
Le tre strutture di base
Ogni programma, anche il più complicato, nasce combinando queste tre strutture.
Puoi vedere la corrispondenza tra blocchi e testo (pseudocodice), cioè tra il «codice sorgente» e il risultato visibile:
| Blocco di Scratch | Pseudocodice |
|---|---|
| ripeti 10 volte | per 10 volte: … |
| per sempre | ripeti all'infinito: … |
| se |
se condizione allora … altrimenti … |
| imposta punti a 0 | punti ← 0 |
| cambia punti di 1 | punti ← punti + 1 |
Spiega con parole tue che cosa fanno le tre strutture di base di un programma —sequenza, ciclo e condizionale— e fai un esempio di vita quotidiana per ciascuna che non…
Spiega con parole tue che cosa fanno le tre strutture di base di un programma —sequenza, ciclo e condizionale— e fai un esempio di vita quotidiana per ciascuna che non abbia a che fare con i computer.
Un programma ha questi blocchi sparsi: «dì Ciao!», «quando si clicca la bandiera», «aspetta un attimo», «dì Salve!». Ordinali nella pila corretta e descrivi che cosa…
Un programma ha questi blocchi sparsi: «dì Ciao!», «quando si clicca la bandiera», «aspetta un attimo», «dì Salve!». Ordinali nella pila corretta e descrivi che cosa accadrà esattamente quando il programma viene eseguito.
Questi blocchi di aspetto sono sparsi: «passa al costume da pirata», «dì Ciao, mi chiamo Marco! per 2 secondi», «quando si clicca la bandiera», «aspetta 1 secondo».…
Questi blocchi di aspetto sono sparsi: «passa al costume da pirata», «dì Ciao, mi chiamo Marco! per 2 secondi», «quando si clicca la bandiera», «aspetta 1 secondo». Ordinali per presentare un personaggio che prima saluta e poi si traveste, e descrivi ciò che vedrà lo spettatore.
Un programma ha questa pila: «quando si clicca la bandiera», «dì 3», «aspetta un attimo», «dì 2», «aspetta un attimo», «dì 1», «dì Via!». Descrivi in dettaglio che cosa…
Un programma ha questa pila: «quando si clicca la bandiera», «dì 3», «aspetta un attimo», «dì 2», «aspetta un attimo», «dì 1», «dì Via!». Descrivi in dettaglio che cosa vedrà e sentirà l'utente da quando clicca la bandiera fino alla fine e spiega a che cosa servono le attese.
Eventi, movimento e palco
Un progetto può avere più pile, ognuna con il suo evento: funzionano in parallelo e in modo indipendente.
Il palco è un piano cartesiano: la $x$ indica la posizione orizzontale, la $y$ quella verticale, e il centro è $(0; 0)$.
Il programma della figura, formato da blocchi incastrati, dovrebbe far percorrere a un personaggio il quadrato tratteggiato e avvisare al termine, ma all'interno del…
Il programma della figura, formato da blocchi incastrati, dovrebbe far percorrere a un personaggio il quadrato tratteggiato e avvisare al termine, ma all'interno del ciclo manca un blocco.
Indica quale blocco manca all'interno del ciclo affinché il personaggio completi il percorso del quadrato e spiega che cosa fa ciascuna parte del programma.
I blocchi evento decidono quando una pila di blocchi inizia a funzionare. Spiega che cosa fa partire ciascuno di questi tre eventi: «quando si clicca la bandiera»,…
I blocchi evento decidono quando una pila di blocchi inizia a funzionare. Spiega che cosa fa partire ciascuno di questi tre eventi: «quando si clicca la bandiera», «quando si preme il tasto spazio» e «quando si clicca il personaggio», e descrivi che cosa accadrebbe se un progetto avesse due pile diverse con due eventi diversi.
Lo sfondo di un programma a blocchi funziona come una mappa di coordinate: la «x» indica la posizione orizzontale e la «y» quella verticale, e il centro è il punto…
Lo sfondo di un programma a blocchi funziona come una mappa di coordinate: la «x» indica la posizione orizzontale e la «y» quella verticale, e il centro è il punto $(0, 0)$. Spiega dove apparirà il personaggio con il blocco «vai a x: 0, y: 0» e in quale direzione si sposterà se la «x» aumenta o se la «y» diminuisce.
Variabili e cicli controllati
Regola pratica: il valore iniziale si imposta prima del ciclo, mai dentro. Per contare da 1 a 10 serve inoltre un blocco «cambia numero di 1» dentro il ciclo, dopo aver detto il numero.
Un ciclo può anche servire per animare: «ripeti 4 volte: costume successivo; aspetta 0,5 s» dura $4 \cdot 0{,}5 = 2$ s.
Un programma vuole contare da uno a dieci con questi blocchi: «ripeti 10 volte: dì il numero; aggiungi 1 al numero». Quando viene eseguito, il conteggio non parte da uno…
Un programma vuole contare da uno a dieci con questi blocchi: «ripeti 10 volte: dì il numero; aggiungi 1 al numero». Quando viene eseguito, il conteggio non parte da uno e, ogni volta che viene rieseguito, parte da un numero diverso. Spiega quale blocco manca e dove dovrebbe essere collocato, e in quale posizione della pila bisogna mettere il valore iniziale del numero.
La figura mostra due programmi che muovono un personaggio con due tipi di ciclo diversi. Spiega che differenza c'è tra i due cicli, fai un esempio di situazione in cui…
La figura mostra due programmi che muovono un personaggio con due tipi di ciclo diversi.
Spiega che differenza c'è tra i due cicli, fai un esempio di situazione in cui conviene usare ciascuno e ragiona su che cosa può succedere con il ciclo di destra se il traguardo non esistesse.
La figura mostra un programma con una variabile chiamata «punti» che controlla un ciclo. Esegui la traccia del programma: indica quante volte viene eseguito il ciclo e…
La figura mostra un programma con una variabile chiamata «punti» che controlla un ciclo.
Esegui la traccia del programma: indica quante volte viene eseguito il ciclo e quanti passi compie in totale il personaggio. Poi ragiona su che cosa accadrebbe se il blocco «imposta punti a 0» fosse dentro il ciclo invece che prima.
Per animare un personaggio si usa «ripeti 4 volte: costume successivo; aspetta mezzo secondo». Spiega che cosa ottiene quel ciclo e calcola quanto dura l'animazione…
Per animare un personaggio si usa «ripeti 4 volte: costume successivo; aspetta mezzo secondo». Spiega che cosa ottiene quel ciclo e calcola quanto dura l'animazione completa se ogni attesa è di $0,5\ \text{s}$ e il cambio di costume è istantaneo.
In un gioco a cronometro si vuole registrare il record del tempo minore impiegato per completare un circuito. Un alunno scrive questo codice all'arrivo al traguardo: «se…
In un gioco a cronometro si vuole registrare il record del tempo minore impiegato per completare un circuito. Un alunno scrive questo codice all'arrivo al traguardo:
«se <Tempo_Partita < Record> allora [imposta Record a Tempo_Partita]»
Tuttavia, giocando per la prima volta dopo aver creato la variabile Record (che Scratch inizializza per default a 0), il record non si aggiorna mai, per quanto veloce vada l'auto.
- a) Giustifica perché questa verifica fallisce e spiega la differenza di inizializzazione tra la ricerca di un record di punteggio massimo e quella di un record di tempo minimo.
- b) Progetta la struttura di blocchi che risolva questo problema per la prima partita e per le successive, senza dover scrivere manualmente un valore iniziale fittizio prima di cliccare la bandiera verde.
Per misurare la durata di una partita si crea questo cronometro: «quando si clicca la bandiera verde: imposta Secondi a 0 per sempre: aspetta 1 s cambia Secondi di 1»…
Per misurare la durata di una partita si crea questo cronometro:
«quando si clicca la bandiera verde:
imposta Secondi a 0
per sempre:
aspetta 1 s
cambia Secondi di 1»
Confrontando questo contatore con un orologio reale dopo 10 minuti di gioco intenso, il cronometro di Scratch segna solo 9 minuti e 35 secondi (uno scarto di 25 secondi).
- a) Giustifica perché un ciclo con il blocco «aspetta 1 s» accumula ritardo quando il gioco elabora molti personaggi e movimenti simultanei.
- b) Progetta un cronometro alternativo con i blocchi utilizzando il sensore «cronometro» e variabili che non dipenda dalla velocità di aggiornamento del gioco e mostri il tempo trascorso in secondi con un decimale (per esempio: 14,2 s).
- c) Giustifica perché la tua proposta mantiene la precisione esatta anche in caso di rallentamenti dello schermo.
Condizioni annidate e operatori logici
Descrivi con parole tue i blocchi di un programma che chiede l'età all'utente e risponde «puoi entrare» se ha 14 anni o più, e «mi dispiace» in caso contrario. Indica…
Descrivi con parole tue i blocchi di un programma che chiede l'età all'utente e risponde «puoi entrare» se ha 14 anni o più, e «mi dispiace» in caso contrario. Indica quale tipo di blocco di decisione useresti e quale verifica farebbe esattamente.
Un bar del quartiere regala un caffè solo ai soci e solo prima delle 10 del mattino. Descrivi i blocchi di decisione annidati del programma che lo verifica e spiega la…
Un bar del quartiere regala un caffè solo ai soci e solo prima delle 10 del mattino. Descrivi i blocchi di decisione annidati del programma che lo verifica e spiega la differenza tra mettere due «se» uno dentro l'altro e mettere due «se» in sequenza, usando questo esempio.
I blocchi operatore «e», «o» e «non» combinano le verifiche. Spiega che cosa fa ciascuno e descrivi le condizioni complete di questi due sistemi: una porta che si apre…
I blocchi operatore «e», «o» e «non» combinano le verifiche. Spiega che cosa fa ciascuno e descrivi le condizioni complete di questi due sistemi: una porta che si apre se la tessera è valida e inoltre l'impronta coincide, e un allarme che suona se si apre la finestra o si rompe il vetro.
Un compagno ha programmato il ciclo di un semaforo per le auto (verde: 10 s; giallo: 3 s; rosso: 12 s) e un semaforo pedonale sincronizzato. Per farlo, ha creato due…
Un compagno ha programmato il ciclo di un semaforo per le auto (verde: 10 s; giallo: 3 s; rosso: 12 s) e un semaforo pedonale sincronizzato. Per farlo, ha creato due programmi indipendenti con «quando si clicca la bandiera verde» e cicli «per sempre» con blocchi di attesa in ciascun oggetto. Dopo un minuto di simulazione, auto e pedoni hanno la luce verde contemporaneamente.
- a) Giustifica perché si verifica questa pericolosa desincronizzazione usando cicli con tempi di attesa indipendenti.
- b) Progetta una soluzione con i blocchi che garantisca che non coincidano mai sul verde, spiegando se utilizzi variabili di stato o messaggi («invia messaggio e aspetta») e dettagliando l'ordine esatto dei cambi di luce.
Uno studente programma il movimento di una palla con questo codice: «per sempre: fai 10 passi se tocca il bordo, rimbalza» Eseguendo il programma con una palla il cui…
Uno studente programma il movimento di una palla con questo codice:
«per sempre:
fai 10 passi
se tocca il bordo, rimbalza»
Eseguendo il programma con una palla il cui costume non è perfettamente centrato, osserva che in certi angoli la palla trema e resta bloccata sul bordo dello schermo senza riuscire a uscirne.
- a) Spiega passo dopo passo perché si verifica questo blocco in base a come Scratch calcola la collisione con il bordo e la posizione del centro del costume.
- b) Il problema si risolverebbe semplicemente invertendo l'ordine dei due blocchi all'interno del ciclo? Giustifica la tua risposta prevedendo che cosa accadrebbe a ogni iterazione.
- c) Progetta una modifica dei blocchi che garantisca che la palla si stacchi dal bordo e prosegua la sua traiettoria normalmente.
Un gioco di piattaforme ha questo script sul personaggio: «quando si clicca la bandiera verde: imposta Vite a 3 se <Vite = 0> allora [ferma tutto] per sempre: se <tocca…
Un gioco di piattaforme ha questo script sul personaggio:
«quando si clicca la bandiera verde:
imposta Vite a 3
se allora [ferma tutto]
per sempre:
se <tocca Trappola?> allora:
cambia Vite di -2
aspetta 0,5 s»
Il gioco presenta due errori: la partita non finisce mai anche se il giocatore tocca ripetutamente la trappola, e se un giocatore cade nella trappola avendo 1 vita, il contatore passa a -1 vite senza fermare il gioco.
- a) Giustifica perché la verifica di fine partita, così com'è collocata, non ferma il gioco in nessun momento.
- b) Spiega perché utilizzare la condizione stretta è un errore di progettazione quando il danno sottrae più di 1 vita.
- c) Progetta la soluzione ricollocando e modificando i blocchi condizionali per assicurare che la partita termini esattamente quando le vite si esauriscono o scendono sotto zero.
Messaggi e cloni
Ogni sprite ha le sue pile e non può eseguire direttamente quelle di un altro: per questo non basta mettere i blocchi del mago dentro il pulsante. Il messaggio è il «ponte». E più sprite possono reagire allo stesso messaggio senza cambiare nulla nel mittente.
Cloni e velocità di esecuzione
I blocchi in un ciclo «per sempre» vengono eseguiti decine di volte al secondo. Per questo:
-
una moneta toccata fa salire i punti di 15-20 in un attimo: dopo «cambia punti di 1» serve far sparire la moneta, oppure un'attesa, in modo che il tocco conti una volta sola;
-
un nemico toccato toglie tutte le vite subito: dopo «cambia vite di −1» serve una pausa (per esempio «aspetta 1 secondo») o un segnale di «invulnerabilità» temporanea;
-
«aspetta 1 s» in un ciclo non dura esattamente 1 s di orologio: il tempo di esecuzione si somma e si accumula ritardo. Per un cronometro preciso conviene il sensore «cronometro» di Scratch, azzerato all'inizio;
-
un clone che esce dallo schermo va eliminato con «elimina questo clone» (non con «nascondi», che lo lascia vivo e rallenta il gioco);
-
nei giochi tipo Pong, dopo un gol conviene usare una variabile di stato («in gioco» = 0) o un messaggio, per non contare punti falsi mentre la palla torna al centro.
In un progetto ci sono due personaggi: un pulsante e un mago. Quando si clicca il pulsante, il mago deve apparire. Spiega a che cosa servono i blocchi «invia messaggio»…
In un progetto ci sono due personaggi: un pulsante e un mago. Quando si clicca il pulsante, il mago deve apparire. Spiega a che cosa servono i blocchi «invia messaggio» e «quando ricevi messaggio», descrivi le pile di blocchi che avrebbe ciascun personaggio e ragiona sul perché non basta mettere i blocchi del mago dentro il pulsante.
In un videogioco, questo blocco è stato inserito dentro il ciclo «per sempre» del personaggio principale: «se <tocca Moneta?> allora [cambia Punti di 1]» «se <tocca…
In un videogioco, questo blocco è stato inserito dentro il ciclo «per sempre» del personaggio principale:
-
«se allora [cambia Punti di 1]»
-
«se allora [cambia Vite di -1]»
-
«se allora [ferma tutto]»
Durante la prova si rilevano due errori gravi: toccando una sola moneta il contatore sale di colpo di 15-20 punti, e sfiorando un nemico le 3 vite si perdono all'istante.
- a) Giustifica tecnicamente perché accade questo, tenendo conto della velocità di esecuzione dei cicli al secondo.
- b) Progetta la modifica necessaria nei blocchi della moneta e del personaggio per correggere entrambi i comportamenti senza interrompere il movimento generale del gioco (considera nascondere/distruggere oggetti e periodi di invulnerabilità).
In un gioco spaziale, l'oggetto 'Asteroide' ha programmate queste tre pile: Pila 1: «quando si clicca la bandiera verde: per sempre [aspetta 2 s; crea clone di me…
In un gioco spaziale, l'oggetto 'Asteroide' ha programmate queste tre pile:
Pila 1: «quando si clicca la bandiera verde: per sempre [aspetta 2 s; crea clone di me stesso]»
Pila 2: «quando ricevi Allerta_Meteoriti: crea clone di me stesso»
Pila 3: «quando vieni clonato: mostra; per sempre [cambia y di -5; se <posizione y < -170> allora [nascondi]]»
Dopo un paio di minuti di gioco, il gioco rallenta gravemente, smettono di crearsi asteroidi e ogni volta che arriva il messaggio Allerta_Meteoriti il numero di cloni si moltiplica in modo incontrollato.
- a) Giustifica perché il blocco «nascondi» fa sì che il gioco smetta di rispondere e raggiunga il limite di cloni di Scratch.
- b) Spiega l'errore della Pila 2: perché gli stessi cloni esistenti raddoppiano la quantità di asteroidi quando ricevono un messaggio?
- c) Progetta la soluzione corretta con i blocchi per la creazione, il movimento e l'eliminazione definitiva dei cloni.
In un gioco di Pong per due giocatori (racchette sinistra e destra), si rilevano questi errori di interazione: 1. Quando supera la racchetta, la palla rimbalza sul bordo…
In un gioco di Pong per due giocatori (racchette sinistra e destra), si rilevano questi errori di interazione:
-
Quando supera la racchetta, la palla rimbalza sul bordo posteriore e somma più punti consecutivi prima che il punto venga azzerato.
-
Mentre la palla torna al centro dopo un punto, i giocatori possono continuare a colpirla sommando punti falsi.
-
Se la palla sfiora la parte posteriore della racchetta quando questa sale rapidamente, la palla parte a razzo verso l'interno della propria porta.
- a) Progetta la struttura di blocchi della palla per gestire il punto: rilevamento del gol, arresto momentaneo del gioco e comunicazione con i tabelloni tramite messaggi.
- b) Progetta la condizione di rimbalzo della racchetta in modo che rimandi la palla verso il campo avversario solo se l'impatto avviene sulla faccia frontale, cioè quando la palla si sta dirigendo verso la racchetta.
- c) Spiega come devono reagire le racchette e la palla al messaggio di 'nuovo punto' per riprendere il gioco in modo equo e sincronizzato.
Torniamo a Giulia: il suo personaggio non partiva perché in cima alla pila mancava un blocco evento, mentre quello di Marco contava sempre lo stesso numero perché il valore iniziale era impostato dentro il ciclo.