Home






        © 2007 Paolo Lazzarini
       

Nuova versione StarLogo TNG Beta 1 (ottobre 2007)

Qui trovate una rapida introduzione a StarLogo TNG, un ambiente formidabile sul piano didattico. La versione utilizzata è la Beta 1, rilasciata nell'ottobre del 2007. Si tratta davvero del LOGO di "prossima generazione" (The Next Generation). Non aspettatevi un manuale d'uso: le indicazioni sull'interfaccia e sui comandi essenziali sono introdotte mentre si realizzano dei semplici progetti. E' il modo migliore e più concreto per avvicinarsi ad un ambiente di programmazione. Buon divertimento!

StarLogo TNG
Il primo progetto: un gioco interattivo
Secondo progetto: batteri
Terzo progetto: come si forma un banco di pesci?



Come è noto, negli ambienti LOGO è possibile programmare gli spostamenti di una piccola tartaruga che lascia una traccia sullo schermo. L'ultimo nato dei linguaggi Logo è StarLogo TNG, un vero e proprio gioiello didattico sviluppato presso il Massachusetts Institute of Technology nell'ambito del TEP (Teacher Education Program) e distribuito come software di pubblico dominio, liberamente scaricabile all'indirizzo http://education.mit.edu/projects/starlogo-tng (si tratta della versione Beta 1, rilasciata nell'ottobre 2007). StarLogo TNG presenta, rispetto alle versioni tradizionali del LOGO, delle caratteristiche realmente innovative:

  • Una grafica 3D di tipo virtual reality. Possiamo metterci al posto della tartaruga, vedere attraverso i suoi occhi ed esplorare l'ambiente; se preferiamo, possiamo scegliere una veduta "aerea" del terreno. L'ambiente, cioè il mondo della tartaruga, o meglio delle tartarughe, può essere facilmente strutturato con mura, costruzioni, colline, crateri, ecc. grazie ad un editor di "terreno".

  • La gestione parallela di una moltitudine di agenti (anziché di un'unica tartaruga).

  • La programmazione con i "blocchetti". Questo è l'aspetto più rilevante sul piano didattico che fa di StarLogo TNG un ambiente veramente straordinario: ad ogni comando corrisponde un blocchetto (trascinabile) e i blocchetti si possono connettere, come in un puzzle, solo se la sintassi lo consente. Ai comandi che richiedono uno o più dati in input corrispondono dei blocchetti che hanno delle "porte" per consentire l'entrata dei dati. Programmare diventa un gioco perché scompaiono le difficoltà di sintassi.

Va detto che mentre i LOGO tradizionali sono sostanzialmente linguaggi di programmazione orientati alla geometria, cioè si pilota la tartaruga per tracciare figure, StarLogo è invece progettato per simulare sistemi complessi in cui decine (o centinaia o migliaia) di tartarughe eseguono in parallelo dei comandi, interagiscono tra di loro e interagiscono con l'ambiente in cui si muovono. Naturalmente con StarLogo potrete anche semplicemente tracciare figure ma il suo scopo è un altro: ce ne renderemo conto tra poco.

Una volta lanciato StarLogo TNG si presentano due finestre. La prima è quella della figura seguente.



A sinistra troviamo l'area dei blocchetti cioè dei comandi che possiamo utilizzare; le linguette consentono di selezionare i vari tipi di comando. Il colore che caratterizza ciascuna famiglia di blocchetti indica il tipo di comando (ad esempio i comandi per il movimento sono tutti di colore rosso).
A destra si trova l'area di programmazione dove realizzeremo i nostri progetti, trascinando i blocchetti che ci occorrono. Per ora è stato trascinato un solo blocchetto.
Notate che la finestra è dotata, in alto, di due grandi pulsanti: Factory e My Blocks (potremmo tradurre "I blocchetti originali di fabbrica" e "I miei blocchetti"). Per il momento il pulsante evidenziato è Factory.

La seconda finestra è il mondo della tartaruga o SpaceLand. Lo vediamo nella figura seguente.



Si tratta di una veduta "aerea": per rendervene conto, fate clic ripetutamente sul segno "meno" che vedete in basso a destra e che serve ad allontanare il punto di osservazione (camera); potete cambiare ulteriormente il punto di vista portando il puntatore sulla zona verde, trascinandolo mentre tenete premuto il pulsante destro del mouse (vedi, ad esempio, la figura seguente).



Avvicinando il punto di osservazione, facendo clic ripetutamente sul segno "più", potete rendervi conto che al centro della zona verde, cioè del terreno (terrain), si trovano all'inizio due tartarughe, una rivolta verso nord e l'altra verso sud (vedi figura seguente). Per inquadrare esattamente le tartarughe, fate clic sulle frecce che trovate sempre in basso a destra e che vi permettono di spostare il punto di vista in su, in giù, a destra e a sinistra.






Realizzeremo un gioco interattivo che, per quanto semplice, darà ai ragazzi la sensazione di essere loro a dominare il computer (sono loro a programmarlo) anziché essere dei meri esecutori, inconsapevoli di ciò che avviene "dietro le quinte". Inutile dire come la costruzione di un programma abbia un enorme ricaduta in termini di sapere matematico: dovremo gestire il movimento, effettuare rotazioni, misurare il tempo, utilizzare condizioni logiche del tipo "se … allora …", usare variabili, definire e utilizzare espressioni letterali e così via. E tutto ciò avverrà in un contesto operativo, in cui si impara operando, in cui gli errori sono fonte di informazione. E soprattutto i ragazzi saranno motivati a capire quello che fanno.

L'idea del gioco è questa: Mario si muove, guidato da noi, in un ambiente in cui 10 mostri vagano a caso. Possiamo pilotare Mario mediante i tasti freccia della tastiera in modo che rincorra e possibilmente raggiunga ciascun mostro. Quando Mario collide con un mostro lo distrugge. Scopo del gioco è distruggere tutti i mostri nel minor tempo possibile.

Scelta degli agenti

Abbiamo bisogno di due tipi (breeds) di agenti: tipo Mario e tipo Mostri. Fate clic sul pulsante "Edit Breeds": si aprirà un finestra per scegliere gli agenti. Cambiate il testo "Turtles" in "Mario", poi selezionate l'icona della figura seguente.



In questo modo avete definito il tipo Mario. Ora fate clic sul pulsante "New" e, procedendo nello stesso modo, definite il tipo Mostri (vedi figura seguente). Fate clic infine sul pulsante "Ok".



Primo blocco: setup dell'ambiente

Ecco come creare un solo agente di tipo Mario e 10 agenti di tipo Mostri

I comandi Setup e Clear Everyone (elimina tutti gli agenti) li trovate nell'area dei comandi primitivi (Factory), linguetta Setup and Run. I comandi Create e Scatter li trovate nelle aree riservate agli oggetti di tipo Mario e di tipo Mostri; potrete accedere a tali aree semplicemente facendo clic sul pulsante My Blocks e poi sulle linguette relative a ciascun agente (nella figura seguente vedi ad esempio l'area dei blocchi riservati all'oggetto Mario). Mario sarà all'inizio al centro del terreno e avrà orientamento verso nord; invece i Mostri, a causa del comando Scatter Mostri, saranno disseminati a caso sul terreno, con orientamento altrettanto casuale.



Il comando Setup, come vedete, "abbraccia" tutti i comandi che ci consentono di definire i vari tipi di agenti e la loro disposizione iniziale. Per eseguire il comando basta fare doppio clic su di esso oppure potete utilizzare il pulsante Setup che viene creato automaticamente nell'area Runtime (che si trova alla base della finestra SpaceLand). Nella figura a fianco avete una veduta area dello SpaceLand dopo aver eseguito il setup: si vedono Mario e alcuni dei 10 Mostri (qui è stata fatta una zoomata, i Mostri visibili sono solo tre, gli altri sono disseminati sul terreno come ci si rende conto osservando la piccola finestra in basso a sinistra che funge da mappa).



Secondo blocco: i comandi per ciascun tipo di agente

Dopo aver definito i due tipi di agenti troverete, nell'area dei comandi primitivi (linguetta Setup and Run), il blocchetto Forever (esegui per sempre) con due "alloggiamenti" dinamici destinati ad accogliere rispettivamente i comandi per Mario e i comandi per tutti i Mostri.

Ecco i comandi da inserire

I comandi si commentano da sé: se viene premuto il tasto "freccia su", Mario avanzerà di un passo; se viene premuto il tasto "freccia a destra", Mario ruoterà alla sua destra di 10 gradi; se viene premuto il tasto "freccia a sinistra", Mario ruoterà alla sua sinistra di 10 gradi. Tutti i Mostri invece avanzano di 1/5 di passo. Poiché i comandi del blocco Forever sono eseguiti ripetutamente e ininterrottamente, Mario si muoverà solo quando agiremo sui tasti opportuni della tastiera mentre i Mostri continueranno ad avanzare in direzioni casuali (perché gli orientamenti iniziali sono casuali). Quando un agente raggiunge la ringhiera che delimita il terreno non fa altro che tornare indietro, "rimbalzando" come farebbe una palla da biliardo contro la sponda. Notate che la "velocità" dei Mostri è pari a 1/5 di quella di Mario: questo è un aspetto importante se vogliamo che Mario possa raggiungere rapidamente i Mostri (ma potremmo rendere variabile tale valore ...) Troverete i blocchetti che vi servono dove vi aspettate di trovarli; ad esempio il blocchetto keyboard up arrow? (la condizione: "è stato premuto il tasto freccia su?") lo trovate selezionando la linguetta Controls (Controlli). Tenete presente che molti blocchetti dispongono di una freccina bianca rivolta verso il basso che apre un menu di possibili scelte relative a quel tipo di blocchetto; ad esempio la condizione keyboard up arrow? può diventare, con una opportuna selezione, keyboard right arrow?

Sul piano didattico c'è da osservare come sia semplice, grazie ai blocchetti, gestire sia i costrutti if ... then ... (se ... allora ...), sia i comandi che richiedono un valore in input come, ad esempio, il comando forward (avanti) per il quale si deve specificare il numero di passi. Notate anche la raffinatezza del diverso tipo di incastro quando l'input è di tipo numerico o logico o stringa (ma non è una raffinatezza fine a se stessa: è anche un controllo implicito della sintassi).

Per mettere in esecuzione il programma basterà fare clic sulla freccina verde alla base del blocchetto Forever (che funge da interruttore on/off) oppure sul pulsante "Forever" che viene creato automaticamente nella finestra Runtime.

C'è ora un'ultima questione: i comandi per pilotare Mario tramite la tastiera costituiscono un unico blocco logico e quindi viene voglia di definire un unico blocchetto che li raccolga; insomma viene voglia di definire un nuovo comando (o, se volete, una procedura). Basterà utilizzare il blocchetto Procedure che troviamo tra i blocchetti sotto la linguetta Procedure (comandi "Factory"); lo trascineremo nell'area di programmazione relativa all'oggetto Mario e cambieremo la generica dicitura "Procedure" in "Muovi" (perché questa è la funzione del blocco di comandi). Ecco come modificheremo il nostro programma

Notate che una volta definita la procedura Muovi, troveremo il relativo blocchetto nell'area riservata all'oggetto Mario (My Blocks), come è logico aspettarsi visto che si tratta di un nuovo comando, definito da noi.

Terzo blocco: il gestore delle collisioni

Ora dobbiamo gestire la collisione di Mario con i Mostri (parleremo di collisione Mario-Mostri); ecco come faremo

Il blocco Collision gestisce le collisioni Mario-Mostri e lo troviamo nell'area riservata all'oggetto Mario; come sempre lo trascineremo nell'area di programmazione. Quando Mario collide con un mostro allora:

  • Mario dice (say) "Preso!";
  • il Mostro emette un suono (play sound) e muore (die) cioè viene eliminato (quindi il numero dei Mostri diminuisce di uno).

Notate che il blocco Collision è indipendente dal blocco Forever: lo stile di programmazione, come vedete, è orientato agli oggetti e agli eventi.

Ora potete già provare a giocare (benché il nostro progetto non sia ancora completo). Selezionate Agent View nella finestra SpaceLand e poi selezionate l'agente Mario mediante le frecce; in tal modo assumerete il punto di vista di Mario. Nella figura a fianco vedete Mario che sta per raggiungere un Mostro (punto di vista di Mario).

La gestione del tempo

Vogliamo ora gestire un cronometro che ci fornisca il tempo trascorso dall'avvio del gioco all'istante in cui Mario elimina l'ultimo dei 10 Mostri. Ecco come modificheremo il nostro programma

Alcune osservazioni. Prima di tutto abbiamo dichiarato tre variabili globali: la variabile tempo inizio e la variabile tempo fine di tipo numerico e la variabile gioco in corso di tipo logico (o booleano). Basterà trascinare i relativi blocchetti (linguetta Variables) nell'area di programmazione (possibilmente nel settore denominato "globals" ma non è tassativo, in figura sono nel settore denominato Mario) e cambiare i nomi generici global number e global bool in quelli suddetti. Tenete presente che una variabile di tipo logico può assumere solo i due valori VERO (true) o FALSO (false). La variabile gioco in corso è all'inizio posta uguale a true; ciò viene fatto, nell'ambito del blocco Setup, quando si crea l'oggetto Mario e, a questo scopo, utilizzeremo il blocchetto Create con l'opzione do (fai, esegui) che consente di eseguire dei comandi solo in fase iniziale. Sempre nell'ambito del blocco Setup la variabile tempo inizio viene posta uguale al valore numerico fornito in quell'istante dal cronometro (che conta i secondi trascorsi dall'avvio del programma). Per capire la logica della procedura Tempo tenete presente che il nostro scopo è quello di determinare il tempo trascorso dall'avvio del gioco all'esatto istante in cui il gioco termina cioè l'istante in cui viene eliminato l'ultimo mostro ancora in circolazione; sarà poi Mario, col solito fumetto (say), a comunicarci la durata del gioco (la differenza tra le variabili tempo fine e tempo inizio). Per assegnare un valore alle variabili utilizzerete il blocchetto set ... che si trova nell'area riservata all'oggetto Mario (o nell'area riservata "Globals" se avete dichiarato le variabili nel settore "Globals"); qui trovate anche il blocchetto che fornisce il valore delle variabili. Il blocchetto count Mostri, che riporta il numero dei Mostri attualmente in vita, lo trovate (come dovreste aspettarvi) nell'area riservata all'oggetto Mostri mentre il blocchetto clock, che riporta il valore attuale del cronometro, lo trovate sotto la linguetta Setup ad Run.

Modifica del terreno

Per il momento il terreno è assolutamente pianeggiante ed è facile per Mario raggiungere un mostro perché non ci sono ostacoli alla vista (assumendo il punto di vista di Mario naturalmente). Vogliamo ora modificare il terreno rendendolo collinoso e aggiungendo un certo numero di alberi. Cominciamo a creare delle colline. Fate clic sul pulsantino "Edit Terrain" che vedete nello SpaceLand: si presenterà una piccolo riquadro di comandi (vedi figura seguente).



Fate clic sul pulsante indicato in figura e poi, tenendo premuto il pulsante sinistro, trascinate il mouse nella regione verde in modo da tracciare l'area (viola) in cui sarà creata una collina. Per impostare l'altezza della collina utilizzate lo stesso pulsante facendo clic un certo numero di volte. Procedendo in questo modo potrete creare alcune colline e, se volete, anche dei crateri (utilizzando il pulsante sottostante).

Per creare gli alberi procederemo invece in modo diverso: gli alberi saranno un nuovo tipo di agente. Dovremo perciò definire un nuovo tipo Alberi, come abbiamo già fatto con il tipo Mario e il tipo Mostri (pulsante "Edit Breeds" e poi pulsante "New"). Dopodiché non dovremo far altro che aggiungere al blocco Setup i blocchetti che vedete qui a fianco.

Ecco fatto. Abbiamo arricchito il nostro terreno e possiamo cominciare a giocare. Qui di seguito vedete due immagini dello SpaceLand nella stessa situazione (cioè, se volete, nello stesso istante): la prima è il punto di vista di Mario, la seconda la veduta aerea. Osservando la prima vi rendete conto che Mario ha di fronte a sé un Mostro (il mostro numero 3) e appena a destra del Mostro c'è un albero (albero numero 16). Se ora guardate la veduta aerea vi rendete conto che le cose stanno proprio così (e si spiega il fatto che Mario vede solo il busto del Mostro: c'è infatti di mezzo una collina). Fantastico, no? Per individuare il numero di ciascun agente (e altre informazioni) basta, a gioco fermo, fare clic col pulsante sinistro sull'agente stesso: si aprirà una finestra come quella in figura.









Vogliamo simulare la crescita di una colonia di batteri a partire dalla situazione iniziale (semplificata) di un solo batterio. Sul piano biologico diremo ai ragazzi che i batteri sono microrganismi unicellulari che si riproducono per scissione binaria cioè dividendosi in due; sul piano matematico avremo modo di "visualizzare" la crescita esponenziale. Dopo questa attività con StarLogo tutti i ragazzi avranno capito (e non dimenticheranno più!) cosa debba intendersi per crescita esponenziale (nel nostro caso del tipo f(n)=2n).

Avendo già introdotto molti aspetti della programmazione con StarLogo potremo procedere più speditamente tralasciando i dettagli.
Cominceremo col definire un nuovo tipo di agenti: il tipo Batteri (sceglieremo come batteri delle sferette, vedi figura a fianco).

Ecco il setup



I comandi set size e set color (linguetta Traits) servono per impostare rispettivamemte la dimensione e il colore degli agenti; tenete presente che quando la dimensione (size) è uguale a 1 gli oggetti sono a grandezza normale mentre se si pone questo valore, diciamo, uguale a 2, gli oggetti avranno dimensioni raddoppiate (conservando la forma). Il nostro scopo è far crescere gradualmente i batteri fino a che le loro dimensioni siano una volta e mezzo quelle iniziali, poi li faremo riprodurre per scissione. Ecco il programma



Il blocco movimento e crescita introduce un elemento casuale nel movimento dei batteri; ad ogni esecuzione del blocco ogni batterio avanzerà di 1 e ruoterà prima a sinistra poi a destra di un angolo a caso tra 1 e 45 gradi (random 45). Inoltre ad ogni esecuzione del blocco la dimensione (size) del batterio sarà incrementata del 2%. Il blocchetto size, che restituisce la dimensione attuale di ciascun batterio, lo trovate sotto la linguetta Traits. Possiamo interpretare il blocco riproduzione così: se la dimensione del batterio è maggiore di 1.5 poniamo la sua dimensione uguale 1 e generiamo un nuovo batterio (anch'esso di dimensione 1). Il blocchetto hatch (letteralmente: cova) fa sì che l'agente generi una copia identica a se stesso. Notate che l'opzione do del bloccheto hatch contiene il comando forward 0.5: in tal modo il nuovo batterio si stacca, se pur di poco, dal genitore. Riflettete sul fatto che all'inizio abbiamo un solo batterio ma, col passar del tempo, il numero dei batteri andrà aumentando e ciascuno di essi eseguirà gli stessi comandi del nostro programma. Qui dovreste rendervi conto della potenza e, nello stesso tempo, della semplicità della programmazione parallela con StarLogo.

Possiamo infine completare il nostro progetto aggiungendo un "monitor" per il numero dei batteri e un grafico che fornisca il numero dei batteri in funzione del tempo. Niente di più facile: basterà trascinare nell'area di programmazione questi blocchetti



Qui di seguito vedete le schermate relative a due situazioni: dopo circa 160 unità di tempo dall'avvio del programma e dopo circa 200 unità di tempo. I ragazzi avranno un'idea visiva di cosa sia una crescita esponeziale e osservando come varia il numero di batteri (1, 2, 4, 8, 16 ...) capiranno che si tratta della funzione f(n)=2n.



Un'ultima osservazione. Se create all'inizio 2, 3, 4, ... batteri anziché uno solo, i ragazzi potranno facilmente rendersi conto che le funzioni di crescita che si ottengono sono rispettivamente 2·2n, 3·2n, 4·2n, ...



Avete mai osservato un banco di pesci? O uno stormo d'uccelli? Una moltitudine di individui si muove in una stessa direzione; e se la direzione cambia, tutti gli individui (o gran parte di essi) cambiano direzione. Pesci e uccelli ci mostrano delle incantevoli evoluzioni nell'acqua o nell'aria. Ma come si spiegano questi sistemi organizzati? Come si forma, ad esempio, un banco di pesci? Come è possibile che il movimento dei pesci sia così ordinato e sincronizzato?

La maggior parte delle persone spiega questi fenomeni ricorrendo al modello dell'organizzazione gerarchica, centralizzata; ovvero: i pesci seguono un leader che li guida. Ma le cose non stanno così, non esiste alcun leader e ogni individuo segue una semplice regola "locale": assumi la direzione dell'individuo che si trova più vicino. Non c'è, in sostanza, un organizzatore, un leader: il sistema si autorganizza e il comportamento globale del sistema emerge come risultato di una molteplicità di comportamenti locali. StarLogo è un ambiente informatico particolarmente adatto allo studio e alla simulazione di sistemi complessi che si autorganizzano sulla base di semplici regole.

Mitchel Resnick, ricercatore del MIT Media Laboratory e ideatore della prima versione di StarLogo, nel suo libro Turtles, Termites and Traffic Jams, ci mostra in modo illuminante molti esempi di sistemi in cui l'organizzazione si determina senza che ci sia una pianificazione centralizzata. Ecco un passo tratto dal libro:

A flock of birds sweeps across the sky. Like a well-choreographed dance troupe, the birds veer to the left in unison. Then, suddenly, they all dart to the right and swoop down toward the ground. Each movement seems perfectly coordinated. The flock as a whole is as graceful - maybe more graceful - than any of the birds within it. How do birds keep their movements so orderly, so synchronized? Most people assume that birds play a game of follow-the-leader: the bird at the front of the flock leads, and the others follow. But that's not so. In fact, most bird flocks don't have leaders at all. There is no special "leader bird". Rather, the flock is an example of what some people call "self-organization". Each bird in the flock follows a set of simple rules, reacting to the movements of the birds nearby it. Orderly flock patterns arise from these simple, local interactions. None of the birds has a sense of the overall flock pattern. The bird in front is not a leader in any meaningful sense - it just happens to end up there. The flock is organized without an organizer, coordinated without a coordinator.

Il nostro intento è dunque quello di simulare la formazione di banchi di pesci. Vediamo prima di tutto come simulare il movimento caotico, casuale di una moltitudine di pesci. Ecco il programma



Ed ecco una veduta aerea a perpendicolo (Overhead) dello SpaceLand dopo aver lanciato il programma.



Pur non potendo osservare i pesci in movimento, vi rendete conto che la loro disposizione è del tutto casuale, non c'è alcun principio di organizzazione.

Implementiamo ora la semplice regola che determinerà la formazione di banchi. La formuleremo così: se c'è una collisione, i pesci procederanno nella stessa direzione. Più precisamente: se si verifica una collisione tra due pesci, il primo assegna il proprio orientamento (blocchetto heading) alla variabile globale orientamento, il secondo indietreggia di 1 e assume lo stesso orientamento del primo. Ecco il blocco per gestire la collisione



Il comando set heading serve ad impostare l'orientamento degli agenti; nel nostro caso l'orientamento del secondo pesce viene impostato al valore della variabile orientamento quindi sarà lo stesso del primo pesce.

Dopo aver lanciato il programma, aspettate qualche secondo e vedrete che cominciano a formarsi dei banchi. Vedrete che alcuni si formano ed altri si dissolvono. Ecco una veduta "overhead" dello SpaceLand (abbiamo evidenziato alcuni banchi)



E questa è una veduta aerea ravvicinata












Home


© 2007 Paolo Lazzarini
www.paololazzarini.it