19-01-2013, 10:32 PM
Heu, non, car je te parle de 3 fonctions, une qui teste une ligne donnée, l'autre qui teste une colonne donnée, la dernière qui teste une diagonale donnée.
Dans chacune de ces fonctions, il n'y a donc qu'une seule boucle for, qui teste toutes les cases de la ligne/colonne/diagonale:
Pour tester toutes les lignes, tu appelles la fonction dans une boucle:
Il ne s'agit donc pas de faire un énorme "switch", mais d'utiliser des boucles et des fonctions, c'est ce pour quoi est prévu l'informatique: éviter de taper tous les cas possibles un à un.
Oui, en pratique, cela reviendra à tester tous les cas, mais avec un code qui est suffisamment léger pour être lisible et pour être entretenu (car ton switch, si tu passe à un plateau 6x6, tu vas en ch*er!)
Si tu as l'index entier N et que tu cherches les coordonnées ligne-colonne (l,c), c'est assez simple:
(l,c) = (floor(N/p), c%p)
avec p la taille du plateau; valable pour des index non-négatifs; les coordonnées sont entre (0,0) inclus et (p-1,p-1) inclus.
Dans chacune de ces fonctions, il n'y a donc qu'une seule boucle for, qui teste toutes les cases de la ligne/colonne/diagonale:
Code :
/**
* @param int l Numéro de ligne
* @param int n Taille du plateau, considéré comme carré n*n
* @return bool true si la ligne est d'une seule couleur
*/
function testeLigne(l, n)
{
var color = plateau[l][0]; //Récupérer la couleur en L,0
for (var i=1;i<n;i++)
if (plateau[l][i] != color)
return false; // J'ai trouvé une couleur différente: je quitte
return true; // Sinon, je renvoie true, car toute la ligne est d'une couleur
}
...
Pour tester toutes les lignes, tu appelles la fonction dans une boucle:
Code :
for (var x=0;x<nb_lignes;x++)
if (testeLigne(x))
return vousAvezPerduCarVousAvezColoreUneLigne();
Il ne s'agit donc pas de faire un énorme "switch", mais d'utiliser des boucles et des fonctions, c'est ce pour quoi est prévu l'informatique: éviter de taper tous les cas possibles un à un.
Oui, en pratique, cela reviendra à tester tous les cas, mais avec un code qui est suffisamment léger pour être lisible et pour être entretenu (car ton switch, si tu passe à un plateau 6x6, tu vas en ch*er!)
Si tu as l'index entier N et que tu cherches les coordonnées ligne-colonne (l,c), c'est assez simple:
(l,c) = (floor(N/p), c%p)
avec p la taille du plateau; valable pour des index non-négatifs; les coordonnées sont entre (0,0) inclus et (p-1,p-1) inclus.