﻿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 <BRJB> 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 <BRJB> 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
