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 libreria.ย Lโ€™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, cin eย string 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…


Scopri di piรน da CODEXSPRAWL

Abbonati per ricevere gli ultimi articoli inviati alla tua e-mail.

Lascia un commento

Il tuo indirizzo email non sarร  pubblicato. I campi obbligatori sono contrassegnati *