Esercizio: una storia interattiva semplicata in C++ e Python

libriTempo fa avevamo visto come scrivere una semplice lettera in C++ qui ma non l’avevamo messa a confronto con Python per il semplice fatto che il secondo risultava fin troppo basilare. Inoltre, all’inizio di questa serie di lezioni avevamo visto come scrivere “Hello World!” su Python risultava di gran lunga più facile.

Così, cerca e cerca tra i miei file, ho trovato una vecchia storia interattiva che avevo scritto in inglese, molto semplice, con cui poter osservare le diversità tra i due linguaggi di programmazione in modo più evidente e, intanto, mettere a frutto le basi che abbiamo visto nelle diverse lezioni antecedenti e relative a C++ aggiungendo, già che ci siamo, la nozione della scelta random (vedremo tra poco cosa significa).

Iniziamo, quindi a dare un’occhiata alla storia interattiva scritta in C++ ricordandoci una delle regole principali e fondamentali della programmazione: cercare di essere ordinati e suddividere in capitoli le varie fasi, aiutandoci con i commenti (quelli in verde anticipati dalla doppia slash // per intenderci) così dal rendere la correzione e la lettura più immediate.

STORIA INTERATTIVA IN C++

Per i pigri o per coloro che non sono interessati alla parte di programmazione ma sono curiosi di vedere come questo programma funziona possono andare su questo link (dove ho messo il codice in C++): http://cpp.sh/9yner e cliccare in basso a destra Run. 

//Interactive story in C++ 
#include "iostream"
#include "string"
#include "cstdlib"
#include "ctime"
using namespace std;
int main()
{
 //Title
 cout << "Welcome to your story \n";
 cout << "--------------------------------------------- \n";
 cout <<"\n";

 //Presentation
 cout << "Hello there! What is your name? \n";
 string name;   //name è una variabile di type string
 cin >> name;
 cout << "Hello, " << name << "! \n";
 //Gender
 cout << "Enter 'f' if you are a female; enter 'm' if you are a male\n";
 char gender;
 string pronoun;
 cin >> gender;
 switch (gender){
 case 'f':
 cout << "You are a female \n";
 pronoun = "She";
 break;
 case 'm':
 cout << "You are a male \n";
 pronoun = "He";
 break;
 default:
 cout << "I don't know what you are, sorry! \n";
 pronoun = "It";
 break;
 }
 cout << "What day is it? \n";
 string date;
 cin >> date;
 cout << "Today is " << date << ". \n";
 //RANDOM OUTCOMES
 //Roles
 srand(time(0)); //Initialize random seed
 string word1[4] = { "warrior", "priest", "mage", "hunter" };
 //Names
 srand(time(0));
 string word2[4] = { "Olaf", "Antea", "Erin", "Guy" };
 //places
 srand(time(0));
 string word3[4] = { "IronyCity", "SadCity", "BoldCity", "YukkyCity" };
 //actions
 srand(time(0));
 string word4[6] = { "slay", "heal", "rescue", "eat", "kill", "lick" };
 //THE STORY BEGINS
 cout << "Once upon a time, there was a " << word1[rand() % 4] << " called " << word2[rand() % 4] << ". " << gender << " and some friends found themselves in the shitty land of " << word3[rand() % 4] << "." << " This land was ruled by " << word2[rand() % 4] << " the " << word1[rand() % 4] << ". All of a sudden a mysterious voice spoke to them from high in the sky and said you must " << word4[rand() % 6] << " " << word2[rand() % 4] << " the " << word1[rand() % 4] << " to lift the curse of not being able to use technology..." << endl;
 return 0;
}

Vediamo allora passo passo cosa abbiamo fatto in questo codice di programmazione per, poi, confrontarlo con quello su Python.

LIBRERIE, TITOLO, PRESENTAZIONE

Prima di tutto, trovandoci in C++ dobbiamo includere le librerie che ci interessano per essere in grado di far funzionare il nostro codice: #iostream e #string, ormai, abbiamo imparato che sono come il cacio sui maccheroni. Considerando, poi, che avremo bisogno più avanti di utilizzare delle scelte randomizzate dovremo includere anche #cstdlib (oppure #stdlib.h che funziona allo stesso identico modo) e #ctime. Non dimentichiamo, inoltre, di aggiungere using namespace std altrimenti dovremo diventare pazzi a cercare le parti in cui aggiungere std:: in giro nel codice.

Apriamo quindi la funzione principale int main () ed iniziamo a scrivere il titolo della storia con cout << “Welcome to your story \n; il che significa chiedere al programma di scrivere Welcome to your story. Come più volte è stato già detto \n oppure endl (che ho usato più avanti) si equivalgono ed entrambi servono semplicemente per dire al nostro programma che la frase è finita. Ricordiamoci, inoltre, sempre di aver messo in giro i giusti punti e virgola perché è un errore comunissimo dimenticarseli per strada.

Nella presentazione abbiamo lo stesso principio: ovvero chiediamo al nostro programma di salutare e sollecitiamo l’utente ad inserire il suo nome con quello che si chiama comunemente promt. Ovviamente, qui, l’utente è chiamato a rispondere ed ecco perché vengono aggiunti al codice string name; che, come è già annotato sul codice con un commento in verde, impone name come una variabile di type string, ovvero stiamo avvertendo il nostro programma che la stringa che ci interessa è denominata name mentre cin >> name suggerisce al programma di leggere i caratteri utilizzati da name, cin in particolare si riferisce allo standard input stream definito dalla libreriaL’operatore >> (get from, prendi da) specifica dove l’input dato deve leggere, nel nostro caso il name inserito dall’utente quando richiesto. Cosicché quando il programma scriverà il cout sottostante al posto di name inserirà il nome inserito dall’utente.

GENDER

Evitando di rispiegare ogni cout, cinstring che troviamo in giro passeremo direttamente alle parti nuove del programma. Quindi, char gender; è un tipo di variabile che permette di memorizzare una singola unità che nel nostro caso sarà m o f. Spesso, ma in questo caso non serve, è richiesto azzerare la variabile in questo modo: char gender = 0.

Dopodiché, una volta posta la variabile gender vogliamo anche una stringa, ovvero string pronoun per il semplice fatto che, successivamente vogliamo mettere nel nostro racconto un bel “she” (lei) o “he” (lui) riferendoci alla sessualità dell’utente: dopotutto, quella che il programma scriverà, è la “sua storia”.

Ovviamente, volendo far questo doppiamo usare o un if-statement oppure, come ho fatto io, uno switch statement. Come già sappiamo (ed avevamo visto qui) il valore dello switch può essere solamente un numero intero (integer), un char (carattere) o un tipo qualsiasi di enumerazione ma non può assolutamente essere una stringa. In questo caso, come ormai appare ovvio, il valore dello switch è un char, cioè f o m. Entrambi i due valori avranno una case label, ovvero un’etichetta: case ‘f’: e case ‘m’: poiché il valore della costante in essa contenuta non può variare né essere usuale ad una già presente in un’altra case label. Inoltre, e questo è importante perché il compiler non lo riconoscerà, dovremo sempre ricordarci di concludere ogni case con un bel break;. Inoltre, porremo all’interno di entrambi i case label la possibilità di sostituire, all’interno della nostra storia interattiva, il pronoun (ovvero il pronome) con She, nel caso l’utente inserisca che è una donna, o He se è un uomo.

Vi è un terzo caso, ovvero se l’utente simpaticamente o per errore utilizzi qualcosa che non sia m o f: in tal caso come default chiederemo al programma di rispondere che non sa cosa sia l’utente (“Sorrt I don’t know what you are”) e, ovviamente, nel caso di utilizzo di pronome nella storia, essendo questa in inglese, potremo usare il pronome neutro “It”.

Ricordiamoci anche che nello switch statement, per tutto ciò che gli concerne, verrà aperta e chiusa una parentesi graffa { }.

RANDOM OUTCOMES – Scelte randomizzate

Qui, abbiamo scelto di dividere questa parte in quattro sezioni: roles (ruoli), names (nomi), places (posti) ed actions (azioni). Ovviamente chiunque può scegliere di modificare la storia ed i nomi all’interno del codice molto facilmente. Qui, vedremo solo la sezione roles (ruoli) dato che le altre, a parte cambiare le parole all’interno delle parentesi graffe ed, eventualmente, nel caso di actions la loro quantità funzionano allo stesso modo.

Avevamo detto, inizialmente che ci servivano due specifiche librerie per far funzionare la randomizzazione, ovvero cstdlib oppure stdlib.h e ctime. La prima cosa che notiamo qui è srand(time(0)); che serve per dire al nostro programma di iniziare la scelta randomizzata. La string word1[4] funziona come una normale stringa: word1 può infatti essere modificato con qualsiasi altra parola; l’unica differenza che salta agli occhi è il numero tra le parentesi quadre il quale, semplicemente, indica quante parole troveremo all’interno delle graffe (e quindi lo spazio necessario): nel caso di roles sono infatti 4: warrior (guerriero), priest (prete), mage (mago), hunter (cacciatore). Se guardiamo, appunto, la sezione actions noteremo che tra le parentesi quadre vi è un 6 poiché le azioni suggerite sono 6 e non 4.

THE STORY BEGINS – La storia ha inizio

Infine, scriveremo usando il solito cout la storia utilizzando tutti quegli elementi che abbiamo inserito nei random outcomes ed il pronome “She” o “He” o “It” richiesto nella sezione gender.

Guardiamo allora la prima frase di questa parte del codice: cout << “Once upon a time, there was a ” << word1[rand() % 4] << ” called “ << word2[rand() % 4] << “. “ I due word1[rand()%4] indicano semplicemente al programma di andare a prendere quella parte dedicata a word1 (nel caso quindi del ruolo) e quella di word2 (nomi) e sceglierne uno a caso dalla lista che abbiamo creato nei random outcome: ovviamente, nel caso delle azioni al posto del numero 4 verrà sostituito il 6.

Un consiglio per tutti quando scriviamo storie molto lunghe: controlliamo più volte e per bene gli spazi che intercorrono tra le parole perché spesso e volentieri, per sbaglio, le ritroviamo attaccate l’una all’altra.

STORIA INTERATTIVA IN PYTHON

Ora, guardiamo, come in Python la stessa storia risulti essere molto più semplice a livello di linguaggio di programmazione nonché immediata:

# Interactive story in Python
# Title
print ("")
print ("Welcome to your story")
print ("--------------------------------------------")
print ("")
# Presentation
print ("Hello reader")
import random
name = input ('What is your name? ')
print ("Hello " + name)
# Gender
gender = input ('Are you male or female? ')
print ("You are a " + gender)
day = input ('What day is it? ')
print ("Today is " + day)
if gender == "female":
 pronoun = "she"
elif gender == "male":
 pronoun = "he"
# Roles, names and places 
roles = ["warrior", "hunter", "mage", "priest"]
names = ["Olaf", "Antea", "Erin", "Guy"]
actions = ["slay", "heal", "save", "rescue", "eat", "kill", "lick"]
places = ["IronyCity", "SadCity", "BoldCity", "YukkyCity"]
actor_name = random.choice (names)
actor_role = random.choice (roles)
quest = random.choice (actions)
magic_place = random.choice (places)
# The story begins
story = "Once upon a time, there was a " + actor_role + " called " + name + ". " + pronoun + " and some friends found themselves in the shitty land of " + magic_place + ". This land was ruled by " + actor_name + " the " + actor_role + ". All of a sudden a mysterious voice spoke to them from high in the sky and said you must " + quest + " " + actor_name + " the " + actor_role + " to lift the curse of not being able to use technology... "
print (story)

Eccoci quindi in Python ed ecco perché ho sempre pensato che chi impara C++, e ci sono anch’io in questa comunità di masochisti, si vuole del male.

In Python non abbiamo librerie da richiamare e, quindi, salutiamo la parte di introduzione. Non abbiamo, nemmeno il cout ma al suo posto c’è un bell’immediato print subito seguito dalle virgolette che suggeriscono l’inizio del dialogo: eh, sì, perché usare anche << qui non è proprio necessario ma abbiamo le parentesi tonde. 

Ricordiamo anche tutte i punti e virgola che eravamo abituati ad usare su C++? Beh, su Python sono solo un orrendo ricordo!

Nella parte dedicata al gender ho scelto di usare l’if-statement che più o meno funziona come in C++ solo che sopra avevo deciso di mostrare uno switch-statement tanto per variare leggermente il codice. La dicitura gender = input, come si sarà già capito, indica semplicemente al programma che ci sta facendo una domanda e che deve aspettarsi da noi una risposta.

Per randomizzare, inoltre, non ci serve nessuno strano srand o word1[rand() % 4]: ci basta le semplici paroline import random piazzate lì, insieme, ad inizio programma dopodiché nella sezione dedicata alle scelte random vi saranno due parti: una dedicata alla lista molto semplice, per esempio, roles = [“warrior”, “hunter”, “mage”, “priest”e sotto actor_role = random.choice (roles) che indica al programma di scegliere a caso dalla lista soprastante un ruolo quanto, nella storia, verrà segnalata la scritta actor_role.

Avremo quindi come prima frase nella nostra storia: story = “Once upon a time, there was a “ + actor_role + ” called “ + name + “. “ Notiamo quindi anche il fatto che le tipiche << di C++ si sono trasformate in addizioni +. 

Quindi, alla fine, giocando col programmino ci comparirà una storia simile a questa:

Welcome to your story

———————————————

Hello there! What is your name?

Anakuklosis

Hello, Anakuklosis!

Enter ‘f’ if you are a female; enter ‘m’ if you are a male f

You are a female

What day is it? 23.05.2016

Today is 23.05.2016.

Once upon a time, there was a hunter called Olaf. She and some friends found themselves in the shitty land of YukkyCity. This land was ruled by Erin the warrior. All of a sudden a mysterious voice spoke to them from high in the sky and said you must slay Antea the priest to lift the curse of not being able to use technology…

Share the love

Comincia la discussione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.