R1.01 – PROG#10 – Exercice 3 – Candy Crush

Le jeu

Placement d’un jeton au bon endroit

Ecrire la fonction makeAMove () de profil :

void makeAMove (mat & grid, const maPosition & pos, const char & direction)

Cette fonction permute, dans la grille, le nombre situé initialement à la position pos (aux coordonnées pos.abs, pos.ord)
avec la case de destination selon
la valeur du caractère direction.

Detection d’une suite de nombres identiques sur la même colonne

Ecrire le corps de la fonction  atLeastThreeInAColumn () de profil :

bool atLeastThreeInAColumn (const mat & grid, maPosition & pos, unsigned & howMany);

Cette fonction parcourt la grille afin de trouver une suite d’au moins 3 nombres identiques sur la même colonne. Elle renvoie vrai si une telle suite a été trouvée, faux sinon.
Si elle a renvoyée vrai, on a une suite de howMany tous égaux à partir des coordonnées pos.

Detection d’une suite de nombres identiques sur la même ligne

Ecrire le corps de la fonction atLeastThreeInARow () de profil :

bool atLeastThreeInARow (const mat & grid, maPosition & pos, unsigned & howMany);

Cette fonction parcours la grille afin de trouver une suite d’au moins 3 nombre identiques sur la même ligne. Elle renvoie vrai si une telle suite a été trouvée, faux sinon.
Si elle a renvoyée vrai, on a une suite de howMany tous égaux à partir des coordonnées pos.

Suppression dans une colonne

Ecrire le corps de la fonction removalInColumn () de profil :

	void removalInColumn (mat & grid, const maPosition & pos, unsigned  howMany);

Cette fonction supprime les howMany nombres identiques de la colonne pos.abs à partir de la ligne pos.ord, remonte ceux qui sont en dessous et complète la ligne avec la constante KImpossible.

Suppression dans une ligne

Ecrire le corps de la fonction removalInRow () de profil :

	void removalInRow (mat & grid, const maPosition & pos, unsigned  howMany);

Cette fonction supprime les howMany nombres identiques de la ligne pos.ord à partir de la colonne pos.abs, remonte ceux qui sont en dessous et complète la ligne avec la constante KImpossible. Pour écrire cette fonction, on doit s’appuyer sur la fonction removalInColumn ().

L’algorithme principal

Le but de cette partie est d’écrire la fonction main () .
Cette fonction :

  1. initialise la grille du jeu ainsi que le nombre de coup maximal;
  2. entre dans une boucle tant qu’on n’a pas atteint le nombre maximal de coups :
    1. affiche la grille;
    2. affiche un petit menu donnant les consignes de déplacement;
    3. saisit les coordonnées du nombre à deplacer ainsi que le déplacement souhaité;
    4. fait les tests de suppression en ligne / colonne;
    5. fait les suppression si besoin;
    6. met à jour le score si besoin;
  3. affiche le score final.

R1.01 – TP5 – Exercice 3

A partir de cet exercice :

  1. Il va falloir « Charger » le fichier qui est argument de commande dans un vecteur ;
  2. Puis il faudra d’appliquer des fonctions que vous allez devoir écrire à une partie ou à l’intégralité du vecteur en fonction de ce que rentre l’utilisateur.

Par exemple, si l’utilisateur rentre au clavier les chaines « min tout » c’est qu’il souhaite qu’on transforme l’intégralité du vecteur en minuscule. En revanche, s’il rentre « min 14 » c’est qu’il souhaite transformer uniquement la 14ème ligne du vecteur en minuscule.

Plusieurs solutions s’offrent à vous : soit vous ne lisez que des string et si besoin vous pouvez les convertir en entier long à l’aide de la fonction stoul () (String TO Unsigned Long), soit vous faite un extraction à l’aide d’une variable correctement typée. Dans tous les cas, la saisie clavier est supposée juste.

Ecrire le corps des deux fonctions suivantes :

vector <string> & ToLower (vector <string> & VString) ;
vector <string> & ToLower (vector <string> & VString, const unsigned & LineNumber) ;

La première transforme toutes les lignes du vecteur en leur minuscule correspondante, la seconde ne s’applique à la ligne LineNumber.

Modifier le main () pour prendre en compte ces deux fonctions.

R1.01 – TP5 – Exercice 4

Dans cet exercice, on souhaite transformer une string en sa majuscule.

Ecrire la fonction ToUpper () de signature :

string & ToUpper (string & Str);

Ecrire le corps des deux fonctions suivantes :

vector <string> & ToUpper (vector <string> & VString) ;
vector <string> & ToUpper (vector <string> & VString, const unsigned & LineNumber) ;

La première transforme toutes les lignes du vecteur en leur majuscule correspondante, la seconde ne s’applique à la ligne LineNumber.

Modifier le main () pour prendre en compte ces deux fonctions. L’appel de ces fonctions se fait en saisissant la chaine « maj » suivie de « tout » ou d’un numéro de ligne.

R1.01 – TP5 – Exercice 5

Dans cet exercice on souhaite permuter les deux chaines du vecteur VString, qui sont aux positions PosBeg et PosEnd.
Ecrire la fonction Swap () correspondante.
La signature de la fonction est :

vector <string> & Swap (vector <string> & VString, const unsigned & PosBeg, const unsigned & PosEnd);

Modifier le main () pour prendre en compte cette fonction. L’appel de cette fonction se fait en saisissant la chaine « swa» suivie de deux numéros de ligne.

R1.01 – TP5 – Exercice 6

Dans cet exercice, on souhaite supprimer une ligne (une case du vecteur) à l’aide de la fonction Delete () de signature :

vector <string> & Delete (vector <string> & VString, const unsigned & PosBeg);

Pour se faire, on doit tasser (décaler vers la gauche) l’ensemble des cases du vecteur qui suivent PosBeg.

Modifier le main () pour prendre en compte ces deux fonctions. L’appel de ces fonctions se fait en saisissant la chaine « del» suivie d’un numéro de ligne.

R1.01 – TP5 – Exercice 7

Dans cet exercice, on souhaite insérer une chaine de caractères à une position donnée dans le vecteur à l’aide de la fonction Insert () de signature :

vector <string> & Insert (vector <string> & VString, const unsigned & PosBeg, const string & Line);

Pour se faire, on doit agrandir le vecteur d’une case, et de décaler vers la droite le contenu de toutes les cases ayant un indice supérieur ou égal à PosBeg.

Modifier le main () pour prendre en compte cette fonction. L’appel de ces fonctions se fait en saisissant la chaine « ins » suivie d’un numéro de ligne et de la chaine à insérer.

NB: pour saisir une chaine de caractère contenant des espaces, utiliser l’instruction getline (cin, XXX); à la place de cin >> XXX; (XXX étant votre variable de type string).

R1.01 – TP5 – Exercice 8

Dans cet exercice, on souhaite déplacer une chaine de caractères d’une position initiale vers une position finale Move () de signature :

 

vector <string>& Move (vector <string> & VString, const unsigned & PosBeg, const unsigned & PosEnd);

Modifier le main () pour prendre en compte cette fonction. L’appel de cette fonction se fait en saisissant la chaine « mov» suivie de deux numéros de ligne.

R1.01 – TP5 – Exercice 9

Dans cet exercice, on souhaite cadrer à gauche une chaine de caractères, cad supprimer tous les caractères d’espacement en début de cette chaine. Pour cela écrire le corps de la fonction TrimLeft () de signature :

string & TrimLeft (string & Str);

Ecrire le corps des deux fonctions suivantes :

vector <string> & TrimLeft (vector <string> & VString) ;
vector <string> & TrimLeft (vector <string> & VString, const unsigned & LineNumber) ;

La première cadre à gauche toutes les lignes du vecteur, la seconde ne s’applique à la ligne LineNumber.

Modifier le main () pour prendre en compte ces deux fonctions. L’appel de ces fonctions se fait en saisissant la chaine « tl» suivie de « tout » ou d’un numéro de ligne.