Module Module1 Public nombreDePions, nombreDeCoupsPossibles As Integer Public nombreDeCouleurDisponible As Integer Public pions(nombreDeCoupsPossibles - 1) As String 'Partie du plateau correspondant aux pions Public code As String 'Partie du plateau correspondant au code Public cles(nombreDeCoupsPossibles) As String 'Partie du plateau correspondant aux cles Public tableDesCouleurs(nombreDeCouleurDisponible) As String 'Couleurs disponibles Sub main() tableDesCouleurs = {"B", "J", "V", "R", "M", "G", "F", "A"} Dim finDePartie As Boolean Dim saisie As String = "non" Dim ordinateurSaisie As String Dim ordinateur As Boolean Dim numéroDeCoup As Integer = 0 Dim bravo As String = "" While Not IsNumeric(saisie) System.Console.WriteLine("Entrez le nombre de pions par ligne") saisie = System.Console.ReadLine() End While nombreDePions = saisie saisie = "" While (Not IsNumeric(saisie)) System.Console.WriteLine("Entrez le nombre de couleurs disponibles, doit être inférieur à 8") saisie = System.Console.ReadLine() End While nombreDeCouleurDisponible = saisie saisie = "" While Not IsNumeric(saisie) System.Console.WriteLine("Entrez le nombre de coup disponible avant l'échec") saisie = System.Console.ReadLine() End While nombreDeCoupsPossibles = saisie saisie = "" ReDim pions(nombreDeCoupsPossibles - 1) 'Redimensionne les tableaux dont la taille a changée ReDim cles(nombreDeCoupsPossibles - 1) ordinateurSaisie = "" While Not (ordinateurSaisie = "True" Or ordinateurSaisie = "False") System.Console.WriteLine("L'ordinateur doit-il générer un code secret ? Répondre oui ou non") 'Donne le choix au joueur de rentrer un code secret dans le cas d'une partie à deux ordinateurSaisie = System.Console.ReadLine() If StrConv(ordinateurSaisie, VbStrConv.Lowercase) = "non" Then 'StrConv convertie en minuscule la saisie pour que non, Non et NON soit la même chose ordinateurSaisie = "False" ElseIf StrConv(ordinateurSaisie, VbStrConv.Lowercase) = "oui" Then ordinateurSaisie = "True" End If End While ordinateur = Convert.ToBoolean(ordinateurSaisie) GenererUnCode(ordinateur) 'Appelle le sub de génération de code secret For i = 0 To nombreDePions - 1 'Génère une chaîne de caratère remplit de "N" de longueur fonction des paramètres pour la comparer à la combinsaison de clés noires trouvée bravo = bravo + "N" Next While Not finDePartie Console.Clear() System.Console.WriteLine("Les couleurs disponibles sont :") For i = 0 To nombreDeCouleurDisponible - 1 System.Console.Write(tableDesCouleurs(i) & " ") Next System.Console.WriteLine() System.Console.WriteLine(" Coup n° | Pions | Clés |") For i = 0 To numéroDeCoup - 1 System.Console.WriteLine(i + 1 & " | " & pions(i) & " | " & cles(i) & " |") Next If numéroDeCoup = nombreDeCoupsPossibles Then System.Console.WriteLine(" Vous avez perdu !") finDePartie = True ElseIf bravo = cles(numéroDeCoup) Then System.Console.WriteLine(" Vous avez gagné !") finDePartie = True End If If Not finDePartie Then EntrerUnCombinaison(numéroDeCoup) 'Demande à l'utilisateur de saisir une combinaison de pions GenererLesClésBlanchesEtNoires(numéroDeCoup) 'Génère les clés blanches et noires associés à la combinaison précédament saisie numéroDeCoup = numéroDeCoup + 1 End If End While System.Console.WriteLine("Le code à trouver était : " & code) System.Console.ReadLine() End Sub Sub GenererUnCode(ordinateur) Dim valeuraleatoire As Integer Dim codeHumain As String Dim tableauDeVérification() As Char Dim codeOk As Boolean Dim pionOk As Integer codeOk = False If ordinateur Then Randomize() 'Génère un code aléatoire For i = 0 To nombreDePions - 1 Randomize() valeuraleatoire = CInt(Int((nombreDeCouleurDisponible) * Rnd() + 1)) - 1 'génération d'un nombre entre 0 et le nombre de couleurs disponibles code = code + tableDesCouleurs(valeuraleatoire) Next Else While Not codeOk 'Demande à l'utilisateur d'entrer un code secret System.Console.WriteLine("Veuillez entrer un code secret sous la forme sans les chevrons") codeHumain = StrConv(System.Console.ReadLine(), VbStrConv.Uppercase) tableauDeVérification = codeHumain.ToCharArray() For i = 0 To nombreDePions - 1 For j = 0 To nombreDePions - 1 If tableauDeVérification(i) = tableDesCouleurs(j) Then pionOk = pionOk + 1 End If Next Next If pionOk = nombreDePions Then codeOk = True code = codeHumain Else System.Console.WriteLine("Les couleurs disponibles sont :") 'Rappelle à l'utilisateur quels sont les couleurs disponibles For i = 0 To nombreDeCouleurDisponible - 1 System.Console.Write(tableDesCouleurs(i)) Next End If End While End If End Sub Sub EntrerUnCombinaison(ligneEnCours) 'Demande à l'utilisateur de saisir une combinaison Dim combinaisonValide As Boolean Dim saisie As String = "" Dim pionOk As Integer Dim tableauDeVérification() As Char While Not combinaisonValide System.Console.WriteLine("Veuillez entrer une combinaison sous la forme sans les chevrons") saisie = StrConv(System.Console.ReadLine(), VbStrConv.Uppercase) If saisie.Length = nombreDePions Then tableauDeVérification = saisie.ToCharArray() For i = 0 To nombreDePions - 1 For j = 0 To nombreDeCouleurDisponible - 1 If tableauDeVérification(i) = tableDesCouleurs(j) Then pionOk = pionOk + 1 End If Next Next If pionOk = nombreDePions Then combinaisonValide = True End If End If End While pions(ligneEnCours) = saisie End Sub Sub GenererLesClésBlanchesEtNoires(ligneEnCours) Dim tableauDeVérification() As Char Dim codeChar() As Char tableauDeVérification = pions(ligneEnCours).ToCharArray() 'Découpe la combinaison "BBJR" -> "B" "B" "J" "R" codeChar = code.ToCharArray() Dim adresseDesDoublonsNoirs(nombreDePions) As Integer Dim adresseDesDoublonsBlancs((nombreDePions - 1) ^ 2) As Integer Dim indexNoir, indexBlanc As Integer For i = 0 To nombreDePions - 1 'Initialise le tableau recensant les clés noires à -1, car 0 correspond à une adresse adresseDesDoublonsNoirs(i) = -1 Next For i = 0 To (nombreDePions - 1) ^ 2 - 1 'Initialise le tableau recensant les clés noires à -1, car 0 correspond à une adresse adresseDesDoublonsBlancs(i) = -1 Next For i = 0 To nombreDePions - 1 For j = 0 To nombreDePions - 1 If tableauDeVérification(i) = codeChar(j) And i = j Then 'Repère l'adresse des clés noirs sans tenir compte des doublons adresseDesDoublonsNoirs(indexNoir) = j indexNoir = indexNoir + 1 ElseIf tableauDeVérification(i) = codeChar(j) And Not i = j Then 'Repère l'addresse des clés blanches sans tenir compte des doublons adresseDesDoublonsBlancs(indexBlanc) = j indexBlanc = indexBlanc + 1 End If Next Next For i = 0 To (nombreDePions - 1) ^ 2 - 1 'Supprime les doublons du tableau d'adresse For j = 0 To (nombreDePions - 1) ^ 2 - 1 If adresseDesDoublonsBlancs(i) = adresseDesDoublonsBlancs(j) And Not i = j Then adresseDesDoublonsBlancs(j) = -1 End If Next Next For i = 0 To nombreDePions - 1 'Supprime les doublons du tableau d'adresse For j = 0 To nombreDePions - 1 If adresseDesDoublonsNoirs(i) = adresseDesDoublonsNoirs(j) And Not i = j Then adresseDesDoublonsNoirs(j) = -1 End If Next Next For i = 0 To nombreDePions - 1 'Supprime dans le tableau des adresses blanches les adresses communes au tableau des adresses noirs For j = 0 To (nombreDePions - 1) ^ 2 - 1 If adresseDesDoublonsBlancs(j) = adresseDesDoublonsNoirs(i) Then adresseDesDoublonsBlancs(j) = -1 End If Next Next For i = 0 To nombreDePions - 1 If Not adresseDesDoublonsNoirs(i) = -1 Then 'Ecrit le résultat en mémoire cles(ligneEnCours) = cles(ligneEnCours) + "N" End If Next For i = 0 To (nombreDePions - 1) ^ 2 - 1 'Ecrit le résultat en mémoire If Not adresseDesDoublonsBlancs(i) = -1 Then cles(ligneEnCours) = cles(ligneEnCours) + "B" End If Next End Sub End Module