Locations of visitors to this page
Mille e Una AvventuraHome   AVVENTURE   DOWNLOADS   GIOCHI ON-LINE   
INFONotizie   Tutorials   Links   Chiedi aiuto
|   Giochi: "Aladino e le Perle di Saggezza" e altri giochi on-line su 3owl (2 aprile 2013)   ||   Tutorials: Sequenza DEMO (27 marzo 2013)   ||   Tutorials: Il Dr Home (25 marzo 2013)   ||   Tutorials: Il forziere sepolto (17 marzo 2013)   ||   Sorgenti: I sorgenti di Aladino e le Perle di Saggezza (20 novembre 2009)   ||   Avventure: Primi screenshots di Testudo! (3 novembre 2009)   ||   Notizie stagionate  |

Mille e Una
Avventura

Home

AVVENTURE

DOWNLOADS

GIOCHI ON-LINE

 
INFO

Notizie

Tutorials

Links

Chiedi aiuto
 

Inform7

La fisica delle palle (di cannone) - Fuoco alle polveri!

Questo tutorial descrive il supporto alle equazioni di fisica fornito da Inform7.


  1. Introduzione

    Equazioni di fisica nelle avventure testuali? Ma a che servono?
    Molti di voi si saranno posti sicuramente queste domanda. Molti si saranno anche risposti: A nulla!
    In realtà, se qualcosa non è stato molto usato nel passato, non è detto che non possa tornare utile nel futuro (a questo proposito, si narra di un funzionario delle poste di fine '800 che, di fronte ad un prototipo del telefono, disse: "Non lo userà mai nessuno, i nostri postini sono già così veloci!"). Sta di fatto, comunque, che l'uso delle equazioni di fisica in un'avventura testuale sia piuttosto inusuale.
    Dopo aver giocato un po' con il sistema, devo però ridimensionare le attese dei lettori. I calcoli di fisica che possono essere fatti con Inform7 sono accettabili se la precisione richiesta è molto limitata. In pratica, come suggerisce la stessa documentazione, i risultati sono indistinguibili da quelli esatti... per i sensi umani, nel senso che un uomo non può apprezzare differenze al di sotto del millimetro, del decimo di secondo ecc.
    Non è un limite di Inform7, ma delle piattaforme su cui girano le avventure compilate. Bisogna tenere conto che la z-machine gestisce solo numeri interi a 16 bits (quindi fino a +/-32767) e perciò il sistema è inutilizzabile in questo caso, mentre la glulx-machine arriva a 32 bits (coprendo numeri interi fino a 2 miliardi - in questo caso qualcosa si può calcolare). Anche reinterpretando gli interi come numeri a virgola fissa, con un numero così limitato di bits a disposizione, gli errori di arrotondamento si fanno sentire dopo pochi calcoli. A parte questo limite, un po' di fisica "ad occhio" si può fare e, con uno sforzo non eccessivo, si ottiene un tocco di realismo in più.
    Gli esempi della documentazione si concentrano sulla caduta dei gravi. Anch'io in questo tutorial non vado molto più lontano, ma almeno aggiungo una dimensione in più considerando il moto dei proiettili e così, in questa avventura, ti ritroverai a sparare cannonate.

  2. L'avventura

    Anche in questo tutorial, l'avventura è molto semplice:

    Il nostro eroe, sempre il pirata Jack, dopo aver scoperto il forziere (v. Il forziere sepolto), viene stordito dal compagno, il pirata Silver. Quest'ultimo si impossessa del forziere e fugge sulla scialuppa, abbandonando Jack sull'isola deserta. Jack però rinviene e, facendo uso di un provvidenziale cannone, si vendica del tradimento cannoneggiando la scialuppa. I colpi però sono pochi e la balistica non è il suo forte: riuscirà il nostro eroe... ecc.

  3. Un possibile sviluppo

    E' successo tutto in un attimo. Dopo aver scavato per ore, avevi appena estratto il forziere dalla buca quando il tuo complice, il pirata Silver, ti ha colpito con la sua pala sulla testa.

    C'è voluto parecchio tempo perché ti riprendessi, ma ora ti ritrovi solo e non c'è traccia né di Silver, né del forziere, né della scialuppa... No! Ecco la scialuppa! Oltre la barriera corallina vedi quel rinnegato di Silver che si allontana. Ti ha abbandonato su un'isola deserta!

    Sulla spiaggia c'è un cannone: lo guardi e pensi che ormai ti rimane una sola cosa da tentare...

    Fuoco alle polveri!
    An Interactive Fiction by Leonardo Boselli
    Release 1 / Serial number 090426 / Inform 7 build 5Z71 (I6/v6.31 lib 6/12N)

    spiaggia
    L'isola è un sottile atollo di sabbia circondato dall'oceano.

    Vedi una scialuppa in cui il pirata Silver sta remando affannosamente. Si trova oltre la barriera corallina a 75m di distanza.

    Qui puoi anche vedere un cannone (vuoto), un manuale di istruzioni, cinque palle di ferro e quindici cariche di polvere.

    >x manuale
    Manuale del perfetto artigliere:
    il cannone è lungo 1.5m
    1) metti alcune cariche di polvere nera da 100g nel cannone
    2) metti una palla di ferro da 2kg nel cannone
    3) regola l'alzo con il comando "ALZO 10cm" da 5cm a 90cm
    4) spara il proiettile con il comando "FUOCO"

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi palla. metti palla nel cannone
    Hai preso la palla di ferro.
    Hai messo la palla di ferro dentro il cannone.

    >fuoco
    La polvere nera nel cannone prende fuoco e sviluppa un'energia di 20kJ lanciando la palla di ferro alla velocità di 44.72 m/s. Il proiettile percorre una traiettoria parabolica, raggiunge un'altezza massima di 4.026m e, trascorsi 1.82s dallo sparo, ricade a 79.734m di distanza.
    Il proiettile solleva una colonna d'acqua. Il lancio risulta troppo lungo di 4.734m.
    Il pirata Silver rema con foga per sottrarsi alle tue cannonate. Ora la scialuppa si trova a 85m di distanza.

    >alzo 40cm
    L'alzo del cannone è stato regolato a 40cm.

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi palla. metti palla nel cannone
    Hai preso la palla di ferro.
    Hai messo la palla di ferro dentro il cannone.

    >fuoco
    La polvere nera nel cannone prende fuoco e sviluppa un'energia di 20kJ lanciando la palla di ferro alla velocità di 44.72 m/s. Il proiettile percorre una traiettoria parabolica, raggiunge un'altezza massima di 7.237m e, trascorsi 2.42s dallo sparo, ricade a 104.277m di distanza.
    Il proiettile solleva una colonna d'acqua. Il lancio risulta troppo lungo di 19.277m.
    Il pirata Silver rema con foga per sottrarsi alle tue cannonate. Ora la scialuppa si trova a 95m di distanza.

    >z
    Attendi il momento propizio per fare fuoco ed il tempo passa. Nel frattempo il pirata Silver rema disperatamente per sottrarsi alle tue cannonate. Ora la scialuppa si trova a 105m di distanza.

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi carica. metti carica nel cannone
    Hai preso la carica di polvere.
    Hai messo la carica di polvere dentro il cannone.

    >prendi palla. metti palla nel cannone
    Hai preso la palla di ferro.
    Hai messo la palla di ferro dentro il cannone.

    >fuoco
    La polvere nera nel cannone prende fuoco e sviluppa un'energia di 20kJ lanciando la palla di ferro alla velocità di 44.72 m/s. Il proiettile percorre una traiettoria parabolica, raggiunge un'altezza massima di 7.237m e, trascorsi 2.42s dallo sparo, ricade a 104.277m di distanza.
    Il proiettile colpisce in pieno la scialuppa frantumandola in mille pezzi, mentre il forziere ed il pirata Silver vanno a far compagnia ai pesci.

        *** Hai vinto! ***

  4. Il sorgente commentato

    "Fuoco alle polveri!" by Leonardo Boselli

    [Estensione per la lingua intaliana]

    Include Italian by Leonardo Boselli.

    [Estensione per la gestione della fisica]

    Include Metric Units by Graham Nelson.

    [Con la frase che segue, quando l'avventura viene rilasciata definitivamente, viene generata anche la corrispondente pagina HTML e viene incluso il sorgente]

    Release along with a "Standard" website and source text.

    [Questa frase viene scritta quando il gioco inizia, prima che sia stampato il titolo. E' una sorta di prologo che introduce il giocatore nella vicenda dell'avventura in "medias res"]

    When play begins:

    say "E['] successo tutto in un attimo. Dopo aver scavato per ore, avevi appena estratto il forziere dalla buca quando il tuo complice, il pirata Silver, ti ha colpito con la sua pala sulla testa.[paragraph break]C[']è voluto parecchio tempo perché ti riprendessi, ma ora ti ritrovi solo e non c[']è traccia né di Silver, né del forziere, né della scialuppa... No! Ecco la scialuppa! Oltre la barriera corallina vedi quel rinnegato di Silver che si allontana. Ti ha abbandonato su un[']isola deserta![paragraph break]Sulla spiaggia c[']è un cannone: lo guardi e pensi che ormai ti rimane una sola cosa da tentare..."

    [La spiaggia è l'unica stanza di questa avventura. Tutta la vicenda si svolge qui]

    The spiaggia is a female room. "L[']isola è un sottile atollo di sabbia circondato dall[']oceano."

    [Il cannone è una parte importante dello scenario. E' definito come contenitore perché dovrà contenere le palle di cannone e le cariche di polvere da sparo. Viene ridefinita anche l'azione 'taking', affinché il giocatore non possa prendere o sollevare il cannone]

    The cannone is a container in the spiaggia. The description is "Un potente cannone di bronzo. Il suo alzo è di [the alzo del cannone]."

    Instead of taking the cannone, say "E['] insabbiato. Non si sposta."

    [Consultando il manuale è possibile capire come far funzionare il cannone]

    The manuale di istruzioni is a thing in the spiaggia. The description is "[italic type]Manuale del perfetto artigliere:[line break]il cannone è lungo 1.5m[line break]1) metti alcune cariche di polvere nera da 100g nel cannone[line break]2) metti una palla di ferro da 2kg nel cannone[line break]3) regola l'alzo con il comando 'ALZO 10cm' da 5cm a 90cm[line break]4) spara il proiettile con il comando 'FUOCO'"

    [La scialuppa con sopra il pirata Silver è l'antagonista del personaggio. La sua unica azione è quella di allontanarsi sempre di più aumentando la distanza]

    The scialuppa is a thing in the spiaggia. The scialuppa has a length called distanza. The distanza of the scialuppa is 75m. "Vedi una scialuppa in cui il pirata Silver sta remando affannosamente. Si trova oltre la barriera corallina a [distanza of the scialuppa] di distanza." The description is "La scialuppa si trova a [distanza of the scialuppa] di distanza."

    [Le palle di ferro servono per caricare il cannone. Inizialmente ce ne sono cinque a disposizione. Hanno una massa di cui si tiene conto nelle formule di fisica. Le frasi finali servono per gestire il plurale]

    The palla di ferro is a kind of thing. The palla di ferro is female. There are five palla di ferro in the spiaggia. The description of a palla di ferro is "Palle di ferro da [massa delle palle]." The printed plural name of the palla di ferro is "palle di ferro".

    Understand "palle" as palla di ferro.

    [Le cariche di polvere nera servono per caricare il cannone e per fornire l'energia per lo sparo. Inizialmente ce ne sono 15 a disposizione. Hanno una massa di cui si tiene conto nelle formule di fisica per calcolare l'energia acquistata dalle palle. Le frasi finali servono per gestire il plurale]

    The carica di polvere is a kind of thing. The carica di polvere is female. There are 15 carica di polvere in the spiaggia. The description of a carica di polvere is "Cariche di polvere nera da [massa delle cariche]." The printed plural name of the carica di polvere is "cariche di polvere".

    Understand "cariche" as carica di polvere.

    [Quando qualcosa viene messo nel cannone si verifica se ci sono già troppe cariche o se c'è già una palla. In caso contrario si consente l'inserimento]

    Instead of inserting something (called the object) into the cannone:

    if the object is a carica di polvere and the number of the carica di polvere in the cannone is four:

    say "Ci sono già quattro cariche nel cannone. Se ne aggiungi altre potrebbe esplodere.";

    otherwise if the object is a palla di ferro and the number of the palla di ferro in the cannone is one:

    say "C[']è già una palla di ferro nel cannone.";

    otherwise:

    continue the action.

    [Questa nuova azione permette di modificare l'alzo del cannone. Si verifica se l'alzo richiesto è compreso nell'intervallo stabilito e, in caso contrario, si nega la richiesta]

    Adjusting is an action applying to one length.

    Understand "alzo [length]" as adjusting.

    Check adjusting:

    let x be the length understood;

    if x is less than 5cm or x is greater than 90cm, say "Alzo fuori corsa." instead.

    Carry out adjusting:

    now the alzo del cannone is the length understood.

    Report adjusting:

    say "L[']alzo del cannone è stato regolato a [the length understood]."

    [Qui si impostano alcuni valori delle masse e delle lunghezze]

    The massa delle palle is a mass that varies. The massa delle palle is 2kg.

    The massa delle cariche is a mass that varies. The massa delle cariche is 100g.

    The alzo del cannone is a length that varies. The alzo del cannone is 30cm.

    The lunghezza del cannone is a length that varies. The lunghezza del cannone is 1.5m.

    [L'azione che si occupa dello sparo vero e proprio]

    Firing is an action applying to nothing.

    Understand "fuoco" as firing.

    Instead of firing:

    [Se non c'è polvere, non può sparare]

    if the cannone does not contain a carica di polvere:

    say "Non ci sono cariche di polvere nel cannone.";

    [Se non ci sono palle, non può sparare]

    otherwise if the cannone does not contain a palla di ferro:

    say "Non ci sono palle di ferro nel cannone.";

    otherwise:

    [Ora si calcola la velocità iniziale della palla - v. Energia cinetica allo scoppio]

    let n be the number of the carica di polvere in the cannone;

    let v be given by Energia cinetica allo scoppio where m is the massa delle palle, p is the massa delle cariche, E is the E_polvere;

    let E_totale be massa delle palle times E_polvere;

    [w è la componente verticale della velocità - v. formula più sotto]

    let w be given by Componente verticale where k is the alzo del cannone, l is the lunghezza del cannone;

    [u è la componente orizzontale della velocità - v. formula più sotto]

    let u be given by Componente orizzontale;

    [h è l'altezza massima raggiunta - v. formula più sotto]

    let h be given by Altezza massima where m is the massa delle palle;

    [t è il tempo di volo - v. formula più sotto]

    let t be given by Tempo di salita;

    let t be 2 times t;

    [d è la gittata - v. formula più sotto]

    let d be given by Gittata;

    say "La polvere nera nel cannone prende fuoco e sviluppa un[']energia di [E_totale] lanciando la palla di ferro alla velocità di [v]. Il proiettile percorre una traiettoria parabolica, raggiunge un[']altezza massima di [h] e, trascorsi [t] dallo sparo, ricade a [d] di distanza.";

    [Una volta sparato, vengono rimosse le cariche e la palla]

    repeat with item running through the things in the cannone:

    remove item from play;

    let k be the distanza of the scialuppa;

    [Se la caduta avviene troppo vicino]

    if d is less than 10m:

    say "Il proiettile ha sollevato una nuvola di sabbia che ti investe. Non spararti sui piedi!";

    [Se il proiettile cade oltre i 3m dalla scialuppa]

    otherwise if d is less than k minus 3m or d is greater than k plus 3m:

    let k be k minus d;

    say "Il proiettile solleva una colonna d[']acqua. Il lancio risulta troppo [if k is greater than 0m]corto di [k][otherwise]lungo di [0m minus k][end if].";

    otherwise:

    say "Il proiettile colpisce in pieno la scialuppa frantumandola in mille pezzi, mentre il forziere ed il pirata Silver vanno a far compagnia ai pesci.";

    [Scialuppa affondata. Termina con una vittoria]

    end the game in victory;

    [La scialuppa si allontana di 10m]

    change the distanza of the scialuppa to the distanza of the scialuppa plus 10m;

    [Verifica se non ci sono più palle e, nel caso, termina con una sconfitta]

    if the number of the palla di ferro in the spiaggia is zero:

    end the game in death;

    say "[line break]Il pirata Silver rema con foga per sottrarsi alle tue cannonate. Ora la scialuppa si trova a [distanza of the scialuppa] di distanza."

    [In certi casi l'attesa può servire, ma nel frattempo la scialuppa si allontana]

    Instead of waiting:

    change the distanza of the scialuppa to the distanza of the scialuppa plus 10m;

    say "Attendi il momento propizio per fare fuoco ed il tempo passa. Nel frattempo il pirata Silver rema disperatamente per sottrarsi alle tue cannonate. Ora la scialuppa si trova a [distanza of the scialuppa] di distanza."

    [Finalmente inizia la parte fisica vera e propria]

    [Qui si definisce l'energia che sviluppa la polvere nera per unità di massa]

    The energy-density is a kind of value. 10J/kg specifies an energy-density.

    Energy-density times mass specifies energy.

    The E_polvere is an energy-density that varies. E_polvere is 10000J/kg.

    [Seguono tutte le equazioni necessarie ai calcoli della traiettoria delle palle di cannone.

    Invece di determinare sulla carta un'unica formula che risolva il problema, passiamo ad Inform7 tutte le formule e passo dopo passo calcoliamo ogni grandezza utile: il massimo della pigrizia]

    [Legge di conservazione dell'energia:

    l'energia posseduta dalle n cariche di massa p è uguale

    all'energia cinetica che acquista la palla di massa m]

    Equation - Energia cinetica allo scoppio

    n p E = m v^2 / 2

    where n is a number, p is a mass, E is an energy-density, m is a mass, v is a velocity.

    [La componente verticale w della velocità ricavata dall'alzo k e dalla lunghezza l del cannone]

    Equation - Componente verticale

    w l = k v

    where w is a velocity, v is a velocity, k is a length, l is a length.

    [La componente orizzontale u ricavata con il teorema di Pitagora]

    Equation - Componente orizzontale

    u^2 = v^2 - w^2

    where u is a velocity, v is a velocity, w is a velocity.

    [L'accelerazione di gravità]

    The accelerazione di gravità is an acceleration that varies. The accelerazione di gravità is 9.81 m/ss.

    [Legge di conservazione dell'energia:

    l'energia cinetica posseduta dalla palla si trasforma

    in energia potenziale gravitazionale.

    Notare la massa che poteva essere semplificata: la pigrizia colpisce ancora]

    Equation - Altezza massima

    m g h = m w^2 / 2

    where m is a mass, g is the accelerazione di gravità, h is a length, w is a velocity.

    [Definizione di accelerazione nel moto uniformemente accelerato.

    Da qui si determina la metà del tempo di volo]

    Equation - Tempo di salita

    w = g t

    where w is a velocity, g is the accelerazione di gravità, t is an elapsed time.

    [Definizione di velocità nel moto rettilineo uniforme.

    Da qui si determina la gittata]

    Equation - Gittata

    d = u t

    where d is a length, u is a velocity, t is an elapsed time.


Torna all'indice dei Tutorials
Per maggiori informazioni
manda un'email a
Mille e Una
Avventura
Inform7SourceForge LogoCopyright © 2009 Leonardo Boselli
All rights reserved. Legal Terms.