Mini Aventure Textuelle

L'exemple précédent nous a permis de commencer à mettre en place une interaction avec l'utilisateur. Que diriez-vous d'aller plus loin et d'en faire un petit jeu d'aventure textuel tout simple ?

Ecran de txtAdventure

L'extrait de code ci-dessous illustre comment récupérer les différents messages depuis un fichier texte.

Une aventure est ici composées de questions à choix multiples : Chaque question à un code unique, et il en va de même pour chaque réponse.

/* txtAdventure.cpp */struct Question
{
	string question;			// Texte de laquestion
	vector<string> answers;		// Liste des textes des réponses possibles
	vector<string> answersDest;	// Label de la question de destination
	int selected;				// Indique quel choix a été fait par le joueur
	string label;				// Label de la question
};

vector<Question> questions; // Liste des questions

// Lecture du fichier contenant le texte de l'aventure	
bool initQuestions(string file_path)
{
	Question *q = NULL;
	ifstream f;
	
	f.open(file_path.c_str(),  std::ifstream::in);
	
	if(f.is_open())
	{
		string header;
		string text;
		
		// Lecture du header de la première ligne du fichier
		getline(f, header,'\t');
		
		// On boucle sur les lignes du fichier pour lire les questions et les réponses possibles associées
		// Et ainsi remplir le tableau de structure "questions"
		while(!f.eof())
		{
			if(header=="")
			{
				// Answer
				if(q!=NULL)
				{
					string destLabel;
					getline(f, destLabel,'\t');
					q->answersDest.push_back(destLabel);
					
					getline(f, text,'\n');
					q->answers.push_back(text);
					
				}
				else
				{
					cerr << "Le fichier " << file_path << "est incorrect" << endl;
					return false;
				}
				
			}
			else
			{
				// Question
				if(q != NULL)
				{
					questions.push_back(*q);
					delete q;
					q = NULL;
				}
				
				q = new Question(); // on réinitialise la structure de question
				q->label = header;
				
				getline(f, text,'\n');
				q->question = text;				
			}
			
			// On lit le header de la ligne suivante
			getline(f, header,'\t');
		}
		
		// A la sortie de la boucle, il faut ajouter la dernière question dans la liste
		if(q!=NULL)
		{
			questions.push_back(*q);
			delete q;
			q = NULL;
		}
	
		f.close();
	}
	else
	{
		cerr << "Can't open " << file_path << endl;
		return false;
	}
	
	return true;
}

// Passer à la question suivante en fonction de la réponse sélectionnée par le joueur
int nextQuestion(int currentQuestion)
{
	string dest = questions[currentQuestion].answersDest[questions[currentQuestion].selected];
	
	for(int i = 0; i < questions.size(); i++)
	{
		if(questions[i].label == dest)
		{
			return i;
		}
	}
	
	return -1; // destination not found, Quit game
}

Télécharger le code source complet

Libre à vous d'expérimenter en étoffant l'aventure (fichier data/txtAdventure.txt).

D'autres idées pourraient être intéressantes à expérimenter comme la possibilité de ramasser des objets et de gérer un inventaire.

Compilation sous Linux :

g++ txtAdventure.cpp -o txtAdventure

Compilation sous Windows avec Mingw :

g++ txtAdventure.cpp -lmingw32 -static-libgcc -static-libstdc++ -o txtAdventure.exe