Bonsoir danyschibli
Comme proposé, ma « vision » de la chose, je me suis bien amusé, joli sujet de réflexion 
Dans la terminologie, il y a des Points A, B, C, D.. (ports en sortie) et des Bornes 1, 2, 3, 4… (ports en entrée avec PULL_UP interne), si le lieu est perturbé, il serait utile d'ajouter des PULL_UP externes.
Le programme s’articule autour du tableau à 2 dimensions :
const int puzzPoiBor[][2] =
{// A 1 B 2 C 3 D 4 E 5 F 6
{A0, 6}, {A1, 7}, {A2, 8}, {A3, 9}, {4, 10}, {5, 11} // Pin Points (sorties) et Bornes (Entrées)
};
{port du Point, port de la Borne}
Pour ajouter ou supprimer un couple Point/Borne, il suffit d’ajouter ou de supprimer une paire d’accolades {Point, Borne},
La solution à trouver est dans la variable :
String puzzSolution = "F0-B1-C2-D3-E4-A5";
Elle doit bien sûre avoir autant de paires PointBorne qu’il y en a dans le tableau puzzPoiBor[ ][2].
Les numéros de Bornes doivent aller de 0 à nombre de Bornes en ordre croissant, seuls les lettres des Points peuvent être intervertis, pour créer une nouvelle énigme.
Pendant le déroulement du jeu, il y a des indications dans le moniteur (115200)
Il n'y a que 3 cables sur 6
Pas encore ca avec E0-B1-C2-D3-F4-A5
Gagne avec F0-B1-C2-D3-E4-A5
D’autres indications se trouvent dans le programme.
/*
Name: ARDFR_boucles_non_interchangeables.ino
Created: 19.03.2022 19:14:50
Author: jpbbricole
*/
enum puzzPortsTypeIndex { portPoint, portBorne};
const int puzzPoiBor[][2] =
{// A 1 B 2 C 3 D 4 E 5 F 6
{A0, 6}, {A1, 7}, {A2, 8}, {A3, 9}, {4, 10}, {5, 11} // Pin Points (sorties) et Bornes (Entrées)
};
const int puzzIndexMax = (sizeof(puzzPoiBor) / sizeof(puzzPoiBor[0]))-1;
int puzzNombreDeCables = puzzIndexMax +1; // Nombre de pièces
String puzzSolution = "F0-B1-C2-D3-E4-A5";
void setup()
{
Serial.begin(115200);
// Initialisation des ports
for (int p = 0; p <= puzzIndexMax; p ++)
{
pinMode(puzzPoiBor[p][portPoint], OUTPUT); // Ports en sortie
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à LOW
pinMode(puzzPoiBor[p][portBorne], INPUT_PULLUP); // Bornes en entrée
}
}
void loop()
{
int cablesConnectes = puzzNombreConnectes();
if (cablesConnectes == puzzNombreDeCables) // Si tout les câbles connectés
{
String solutionJoueur = puzzLireSolutionJoueur();
if (solutionJoueur == puzzSolution)
{
Serial.println("Gagne avec " + solutionJoueur);
// Action quand solution trouvée
}
else
{
Serial.println("Pas encore ca avec " + solutionJoueur);
}
}
else
{
Serial.print("Il n'y a que " + String(cablesConnectes));
Serial.println(" cables sur " + String(puzzNombreDeCables));
}
delay(1000);
}
/*--------------------------------------------------------------
Retourne la solution proposée par le joueur'*--------------------------------------------------------------
'*--------------------------------------------------------------
*/
String puzzLireSolutionJoueur()
{
String soluceJoueur = ""; // Solution sous forme A3-C0-D1 ... si XX pas de Point connecté sur cette Borne
for (int b = 0; b <= puzzIndexMax; b ++) // Toutes les bornes
{
soluceJoueur += puzzLiaisonPointBorne(b) + "-";
}
return soluceJoueur.substring(0, soluceJoueur.length()-1); // Pour supprimer le dernier -
}
/*--------------------------------------------------------------
Retourne la liaison entre la borne borneNum et
son point A4 ou C2 ou XX si pas de liaison sur cette Borne
'*--------------------------------------------------------------
*/
String puzzLiaisonPointBorne(int borneNum)
{
String lienPoiBor = ""; // Liaison entre Point et Borne
for (int p = 0; p <= puzzIndexMax; p ++)
{
lienPoiBor = "XX"; // Liaison entre Point et Borne
int test = 0;
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à OFF
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == LOW) // Contrôle si continuité LOW
{ test ++; }
digitalWrite(puzzPoiBor[p][portPoint], HIGH); // Port à ON
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == HIGH) // Contrôle si continuité HIGH
{ test ++; }
if (test == 2) // Si tout OK
{
lienPoiBor = char('A' + p) + String(borneNum);
break;
}
}
return lienPoiBor;
}
/*--------------------------------------------------------------
Compte le nombre de câble(s) connecté(s)
entre Point et Borne
'*--------------------------------------------------------------
*/
int puzzNombreConnectes()
{
int connTotal = 0;
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les ports à OFF
{
digitalWrite(puzzPoiBor[b][portPoint], LOW);
}
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les bornes
{
if (digitalRead(puzzPoiBor[b][portBorne]) == LOW)
{ connTotal ++; }
}
return connTotal;
}
Pour le fun, on pourrait ajouter un interface Bluetooth, afin de modifier l’énigme à distance et ou de voir le déroulement du jeu.
A ta disposition pour tout renseignements supplémentaires.
PS : Le programme est testé « en vrai » mais….
Cordialement
jpbbricole