Inform e Glulx/Le basi di Inform/Le stringhe numeriche

Indice del libro

Le stringhe numeriche

modifica

In Inform, una stringa può anche essere costituita da soli numeri (ad esempio "10456798"), che sono però visti da Inform come dei caratteri. Se una stringa contiene quindi 5, Inform interpreta questo dato come il carattere 5 (e non il numero 5 come invece avviene se assegniamo questo valore a una variabile).

In molte avventure testuali viene spesso richiesta l’introduzione di un codice da parte del giocatore per poter proseguire nel gioco. Dopo quanto detto, ecco quindi come fare in Inform una cosa del genere:

! Esempio sull'utilizzo dei vettori con le stringhe - versione 6

Include "Parser"; Include "VerbLib"; Include "Replace";
Constant LUNGH_MAX 15;
Array codice_gioco->LUNGH_MAX; Array codice_player->LUNGH_MAX;
[ Funz_princip; ClearScreen(); ! pulisce lo schermo print "^Inserisci il codice: "; ReadArray(codice_player, LUNGH_MAX); PrintToBuffer(codice_gioco, LUNGH_MAX, "3123456789"); print "Il codice da te inserito "; if((CmpStr(codice_player, codice_gioco)) == 1) print "@`e corretto e la porta si apre.^^"; else print "@`e errato. Quello esatto @`e: ", (PrintStringArray) codice_gioco, "^^"; print "Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "Io"; Include "ItalianG";

Ricordatevi anche che due o più stringhe numeriche non possono essere sommate fra di loro: capite ora la differenza che intercorre tra un numero contenuto in una variabile e un numero contenuto in una stringa?

Dal momento che l’inserimento di una stringa più lunga del vettore che la deve contenere può generare errori piuttosto gravi, Nelson ha pensato bene di definire, di default, due vettori di libreria chiamati buffer e parse (usati, tra l’altro, da Inform stesso per i comandi inseriti dal giocatore). Se vengono utilizzati per l’inserimento in input di una stringa, non ci si deve più preoccupare della larghezza massima del vettore che la deve contenere (a meno che l’utente non vada a inserire una stringa più lunga di 160 caratteri – cosa alquanto improbabile). Ecco allora come si potrebbe effettuare una prima semplificazione dell’esempio visto poco fa:

Include "Parser";
Include "VerbLib";
Include "Replace";

Array codice_gioco buffer "3123456789";
[ Funz_princip; ClearScreen(); ! pulisce lo schermo print "^Inserisci il codice: "; KeyboardPrimitive(buffer, parse); print "Il codice da te inserito "; if((CmpStr(buffer, codice_gioco)) == 1) print "@`e corretto e la porta si apre.^^"; . . .

Stando così le cose, non è più necessario usare l’istruzione ReadArray (che rimane comunque sempre utile nel caso in cui si debbano utilizzare dei vettori diversi da buffer e parse). Volendo poi semplificare ulteriormente l’esempio:

Include "Parser";
Include "VerbLib";
Include "Replace";

[ Funz_princip; ClearScreen(); ! pulisce lo schermo print "^Inserisci il codice: "; KeyboardPrimitive(buffer, parse); print "Il codice da te inserito "; if (parse-->1 == '3123456789') print "@`e corretto e la porta si apre.^^"; else print "@`e errato. Quello esatto @`e: 3123456789^"; print "Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "ItalianG";

possiamo anche fare a meno di utilizzare l’istruzione CmpStr (che rimane però sempre utile nel caso in cui si debbano confrontare i contenuti di due o più vettori tra di loro)[1].

  1. Cliccate qui per scaricare i listati degli esercizi (i file 3.16_1.inf, 3.16_2.inf e 3.16_3.inf).