Salut, alors le problème est relativement simple...
Pourquoi relativement simple ?
Parce que si tu regardes bien ton losange, tu as juste besoin que d'un quart du losange car le reste peut se construire par symétrie horizontale et verticale donc si un losange de 5 te donnes :
----5----
---545---
--54345--
-5432345-
543212345
-5432345-
--54345--
---545---
----5----
Alors tu as juste à coder cette partie là :
----5
---54
--543
-5432
54321
et recopier le reste par symétrie.
Commençons donc :
Il te faut d'abord une méthode qui te construit un losange et qui prend en paramètre le nombre de "cotés" du losange :
static private string BuildLosange(int number)
Ensuite nous avons donc notre nombre de "cotés" du losange, il nous faut connaitre la longueur du losange : cela équivant à 2 fois le nombre passé en paramètre - 1.
Puis nous avons besoin d'un stringbuilder pour nos recréer le beau losange :
StringBuilder builder = new StringBuilder();
int i = 2 * number - 1;
Nous savons que le losange est symétrique donc nous allons créer des variables pour ne calculer qu'un quart du losange :
int numCol = (i / 2) + 1;
int numLignes = (i / 2) + 1;
Maintenant un jagged array nous sera utile pour conserver nos valeurs. Ce type de tableau auront exactement le même nombres de cases que i.
Ensuite pour avoir les valeurs correcte au bon endroit une variable temporaire contiendra notre chiffre de départ.
string[][] losange = new string[i][];
int start = number;
Maintenant on instantie le reste du tableau :
for (int j = 0; j < i; ++j)
losange[j] = new string[i];
Maintenant deux choix s'offrent à nous :
soit on a mis 1 en paramètre de méthode, soit un autre chiffre. Si on a mis 1, alors il nous suffit de remplir la première case du tableau à 1 :
if (i == 1)
losange[0][0] = "1";
else
{
Sinon ben le remplissage est assez simple;
il suffit de partir de 0 jusqu'à numLignes.
Dans cette boucle on initialise notre valeur de départ à number. Puis nous comptons le nombre de "-" à insérer dans le tableau avant le chiffre. Puis avec une boucle imbriquée à l'interieure de la précédente, nous mettons à jour notre tableau avec des "-" puis à partir du nombre de "-" jusqu'au nombre de colonnes, nous mettons à jour le chiffre à insérer en décrémentant le nombre de départ.
Le gros pavé du dessus se réduit à ces lignes de code :
for (int y = 0; y < numLignes; ++y)
{
start = number;
int numMinus = numLignes - y - 1;
for (int x = 0; x < numMinus; ++x)
losange[y][x] = "-";
for (int x = numMinus; x < numCol; ++x)
losange[y][x] = (start--).ToString();
}
Ensuite il ne nous reste qu'à appliquer la symétrique horizontale. L'idée est si on a un losange à 5 cases, alors la case 4 vaut la case 2 et la case 5 vaut la case 1.
Cela se traduit par ce code :
// Symétrie horizontale
for (int y = 0; y < numLignes; ++y)
{
for (int x = numCol; x < i; ++x)
{
losange[y][x] = losange[y][i - 1 - x];
}
}
la symétrie verticale repose sur le même principe :
// Symétrie verticale
for (int y = numLignes; y < i; ++y)
{
for (int x = 0; x < i; ++x)
{
losange[y][x] = losange[i - 1 - y][x];
}
}
}
Maintenant la dernière étape est de créer le string de rendu :
for (int y = 0; y < i; ++y)
{
for (int x = 0; x < i; ++x)
{
builder.Append(losange[y][x]);
}
builder.AppendLine();
}
return builder.ToString();
}
}
Il existe certainement des manières plus efficace de gérer la chose mais elle a le mérite de bien fonctionner...