Jeu Vidéo 2

Techniques d'intégration multimédia, prof(s):

Boucle for

Qu'est-ce que c'est?

Une boucle for permet d'exécuter plusieurs fois la même série d'instructions jusqu'à ce qu'une condition donnée devienne fausse, permettant ainsi de sortir de la boucle.

En C#, la syntaxe de cette structure est la suivante:

for( déclaration_du_compteur ; condition_de_répétition; modification_du_compteur )
{
   une_ou_plusieurs_instructions_à_exécuter;
}


Exemple simple:

string message="Les nombres de 1 a 10 sont ";
for(int i = 1; i <= 10; i++)
{
	message += i + " ";
}
Debug.Log(message);

// Affiche: Les nombres de 1 a 10 sont 1 2 3 4 5 6 7 8 9 10 

Remarque:

Une convention en programmation veut qu'une variable de compteur de boucle soit désignée par une seule lettre de l'alphabet:
i, j, k, l, m, etc.

Cela permet de reconnaître au premier coup d'oeil l'utilisation d'un compteur dans les instructions de la boucle elle-même.

Cela permet aussi de rédiger des conditions de boucles plus courtes.


Utilisations variées!

Il est possible de faire compter des boucles de toutes sortes de façon:

string message;

// boucle qui n'affiche que des chiffres pairs
message="";
for(int i = 2; i <= 20; i += 2)
{
	message += i + " ";
}
Debug.Log(message);

// boucle qui n'affiche que des chiffres impairs
message="";
for(int i = 1; i <= 20; i += 2)
{
	message += i + " ";
}
Debug.Log(message);

// boucle qui affiche les multiples de 2
message="";
for(int i = 1; i <= 1024; i *= 2)
{
	message += i + " ";
}
Debug.Log(message);

// boucle qui affiche des chiffres en ordre décroissant
message="";
for(int i = 20; i >= 0; i--)
{
	message += i + " ";
}
Debug.Log(message);

// ATTENTION! Boucle infinie (à éviter!) qui compte sans arrêt!!!
// Testez cette boucle à vos risques et périls...
message="";
for(int i = 1; i > 0; i++)
{
	message += i + " ";
}
Debug.Log(message);
	

Condition de sortie

Il est important de vous assurer que votre boucle comporte une condition de sortie pouvant être évaluée comme fausse éventuellement, sinon elle sera infinie et s'exécutera jusqu'à ce que votre ordinateur demande grâce. Par ailleurs, si la condition est fausse dès le départ, elle ne s'exécutera pas du tout...

Étudiez les exemples suivants:

for(var i=0;i<10;i++) // s'exécute 10 fois (i de 0 à 9) 
for(var i=0;i<=10;i++) // s'exécute 11 fois (i de 0 à 10) 
for(var i=1;i<10;i++) // s'exécute 9 fois (i de 1 à 9) 
for(var i=1;i<=10;i++) // s'exécute 10 fois (i de 1 à 10)
for(var i=1;i>=10;i++) // ne s'exécute pas (la condition est fausse dès le départ!)
for(var i=1;i<0;i++) // exécution infinie car i n'est jamais plus petit que 0 (condition toujours vraie)

Attention!

A moins d'y trouver un avantage réel, évitez de modifier le compteur d'une boucle for à partir des instructions que l'on retrouve dans cette boucle.

Il est difficile alors de prévoir les résultats sans faire la trace complète du programme...

Par exemple, le code suivant affiche les nombres 3, 6, 9, 12 (pas facile à voir sans y réfléchir un peu...):

string message="";

// Boucle qui à prime abord devrait se répéter 10 fois...
for(int i = 1; i <=10; i++ ){
	// Le compteur de la boucle est modifié DANS la boucle: 
	// C'est légal mais l'effet n'est pas clair...
	i+=2;
	message += i + " ";
}
Debug.Log(message); // Affiche 3 6 9 12

L'instruction break dans une boucle

On peut vouloir arrêter prématurément l'exécution d'une boucle. L'instruction break permet d'arrêter une boucle au moment désiré, sans lui laisser compléter toutes les répétitions qu'elle devrait normallement effectuer.

Exemple avec break: Dans l'exemple suivant, si la valeur de i est égale à 5, la boucle va se terminer automatiquement.

// Dans ce code si nb vaut 5, le programme sort de la boucle...

for(int i = 1; i <= 10; i++ )
{
	if ( i==5 )
	{
		Debug.Log("STOP! On arrête à tout de suite!");
		break; // on sort de la boucle ici...
	}
	else
	{
		Debug.Log($"Valeur de i: {i}"); // on affiche la valeur de i
	}
} 

Parcourir un tableau (ou une liste) avec une boucle

Parcourir un tableau, ça veut dire d'utiliser une boucle de façon à ce que son compteur permette d'accéder à chacune des valeurs d'un tableau.

Exemple 1: Dans l'exemple suivant, on affiche toutes les valeurs d'un tableau grâce à une boucle.

string[] mots = {"pomme","raisin","banane"};

for(int i = 0; i < mots.Length; i++ )
{
	Debug.Log(mots[i]); // affiche pomme, raisin et banane
} 

Exemple 2: Dans l'exemple suivant, fait la somme des valeurs d'un tableau grâce à une boucle.

int[] nombres = {4,8,2,7};
int somme = 0;
for(int i = 0; i < nombres.Length; i++ )
{
	somme += nombres[i];
}
Debug.Log(somme); // Affiche 21

Exemple 3: L'exemple suivant indique combien de valeurs dans le tableau sont supérieures à 5.

int[] nombres = {4,8,2,7};
int superieur5 = 0;
for(int i = 0; i < nombres.Length; i++ )
{
	if( nombres[i] > 5 )
	{
		++superieur5;
	}
}
Debug.Log(superieur5); // Affiche 2

Exemple 4: Ici, on rends inactifs tous les GameObjects qui sont dans un tableau et dont la position x est inférieure à 2f.

// En haut de la classe, un tableau exposé dans l'inspecteur
// fait rérérence à des GameObjets sur la scène...
[SerializedField] private GameObject[] _mesGameObjects;

// Dans une autre fonction de ce script, on utilise une boucle ainsi:
for(int i = 0; i < _mesGameObjects.Length; i++ )
{
	if( _mesGameObjects[i].transform.position.x < 2f )
	{
		_mesGameObjects[i].SetActive(false);
	}
}