Des chiffres (pas des lettres)

Contenu du snippet

Ce logiciel recherche la solution exacte (sinon la plus proche) donnant le résultat désiré en fonction des nombres choisis. Les 6 nombres et le résultat sont choisis dans le respect de la règle du jeu.

Le logiciel explore sytématiquement tous les calculs corrects en n'éliminant que les différences nulles, les multiplications par 1 et les divisions non entières. Il affiche successivement tout calcul "meilleur" que le précédent et ne s'arrête que si le compte est bon ou que si l'arbre des tous les calculs correct est complètement exploré.

La vitesse des calculs occulte complètement les affichages intermédiaires et l'oeil ne retient que le dernier calcul !

Cliquez sur le nombre choisi pour l'éliminer. Le résultat peut être donné ou tiré au hasard.

Source / Exemple :


Public Class Chiffre1

  '------------------------------------------------

  Public Retour$ ' "à la ligne" pour écrire un "text" sur plusieurs lignes

  Public HVtab& ' constante de taille graphique Horizontale ou Verticale (clin d'oeil à l'Apple II) 
  Const LargeurTrait = 3
  Const SuperTaille = 43
  Const GrandeTaille = 24
  Const PetiteTaille = 16

  '------------------------------------------------
  ' les chiffres à choisir
  Public ValeurChoix%(13)
  Public NombreChoix%(13)
  Public ButtonChoix(13) As Button
  Public LabelTraitChoix As Label

  '------------------------------------------------
  ' les 6 chiffres choisis
  Public LabelExplique As Label
  Public ButtonDonnees(5) As Button
  Public LabelTraitDonnees As Label

  '------------------------------------------------
  ' Le nombre à trouver

  Public LabelNombre As Label
  Public TextNombre As TextBox
  Public SiNoTexte As Boolean
  Public LabelTraitNombre As Label
  Public ButtonHasard As Button
  Public ButtonRien As Button
  Public LabelSoluce As Label
  Public ButtonSoluce As Button
  Public LabelTraitSoluce As Label
  Public But% ' à trouver ou à approcher

  '------------------------------------------------
  ' les données + les résultats des calculs

  Public Signe$(3) ' de l'opération"
  Public Chiffre0&(5) ' profondeur du calcul : 0 = données
  Public Chiffre1&(4)
  Public Chiffre2&(3)
  Public Chiffre3&(2)
  Public Chiffre4&(1)

  Public Operation%(4) ' " 0 = + " ; " 1 = x " ; " 2 = - " ; " 3 = / "

  '------------------------------------------------

  Public LabelReponse As Label
  Public LabelTraitReponse As Label

  '------------------------------------------------

  Public KelChoix% ' le rang du chiffre choisi
  Public NombreDonnees% ' déjà choisie

  Public SiOperationCorrecte(4) As Boolean
  Public RangOperation%(4)
  Public RangOperande%(3)
  Public RangOperateur%(3) ' Operande Operation Operateur = Resultat
  ' au niveau 4 Operande(4) = 0 et Operateur(4) = 1
  Public MonResultat&(4)
  Public Approximation& ' la meilleure solution en cours

  '------------------------------------------------

  Public CouleurFond As Color
  Public CouleurButtonClair As Color
  Public CouleurButtonFonce As Color

  '--------------------------------------------------------------------------------------
  Private Sub Chiffre1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim Rang%, HVChoix&, Ecart&, VDonnees&, HNombre&, VNombre&
    Const Releve = 5

    '-------------------

    Retour = Chr(13)
    SiNoTexte = True
    Randomize()

    '-------------------
    Signe(0) = "+"
    Signe(1) = "´"
    Signe(2) = "-"
    Signe(3) = "¸"

    '-------------------

    CouleurFond = Color.FromArgb(255, 235, 240, 220)
    CouleurButtonClair = Color.FromArgb(255, 255, 240)
    CouleurButtonFonce = Color.FromArgb(235, 235, 210)

    '-------------------
    Me.Font = New Font("Times New Roman", PetiteTaille, FontStyle.Regular)
    HVtab = Me.Font.Height
    Me.BackColor = CouleurFond
    '-------------------
    ' Chiffres proposés + leur nombre maximum autorisé

    For Rang = 0 To 9
      ValeurChoix(Rang) = Rang + 1
      NombreChoix(Rang) = 2
    Next Rang

    ValeurChoix(10) = 25
    NombreChoix(10) = 1

    ValeurChoix(11) = 50
    NombreChoix(11) = 1

    ValeurChoix(12) = 75
    NombreChoix(12) = 1

    ValeurChoix(13) = 100
    NombreChoix(13) = 1

    '-------------------
    ' choix des chiffres autorisés

    HVChoix = HVtab * 0.7
    Ecart = HVtab * 0.2

    For Rang = 0 To 13
      ButtonChoix(Rang) = New Button
      Me.Controls.Add(ButtonChoix(Rang))
      ButtonChoix(Rang).BackColor = CouleurButtonClair
      ButtonChoix(Rang).Text = Chaine(ValeurChoix(Rang))
      ButtonChoix(Rang).Font = New Font("Symbol", GrandeTaille, FontStyle.Bold)
      ButtonChoix(Rang).Height = HVtab * 2
      ButtonChoix(Rang).Tag = ValeurChoix(Rang)
      AddHandler ButtonChoix(Rang).Click, AddressOf ButtonChoix_Click
      Select Case Rang
        Case 0 To 8
          ButtonChoix(Rang).Width = HVtab * 2
        Case 9 To 12
          ButtonChoix(Rang).Width = HVtab * 2.5
        Case Else
          ButtonChoix(Rang).Width = HVtab * 3.1
      End Select
      If Rang = 0 Then
        ButtonChoix(Rang).Location = New Point(HVChoix, HVChoix)
      Else
        ButtonChoix(Rang).Location = New Point(ButtonChoix(Rang - 1).Location.X + _
                                               ButtonChoix(Rang - 1).Width + Ecart, _
                                               HVChoix)
      End If

      ButtonChoix(Rang).TextAlign = ContentAlignment.MiddleCenter
    Next Rang

    '-------------------
    ' on encadre le tout

    LabelTraitChoix = New Label
    Me.Controls.Add(LabelTraitChoix)

    LabelTraitChoix.Location = New Point(ButtonChoix(0).Location.X - Ecart, _
                                         ButtonChoix(0).Location.Y - Ecart)
    LabelTraitChoix.Width = ButtonChoix(13).Location.X + _
                            ButtonChoix(0).Width + Ecart * 4
    LabelTraitChoix.Height = ButtonChoix(0).Height + Ecart * 2
    LabelTraitChoix.BorderStyle = BorderStyle.Fixed3D
    LabelTraitChoix.BackColor = CouleurFond

    '-------------------
    ' les 6 chiffres données

    NombreDonnees = 0
    VDonnees = LabelTraitChoix.Location.Y + LabelTraitChoix.Height + HVChoix + Ecart

    LabelExplique = New Label
    Me.Controls.Add(LabelExplique)
    LabelExplique.Text = "0 nombre"
    LabelExplique.Location = New Point(HVChoix, VDonnees)
    LabelExplique.Width = HVtab * 4.5
    LabelExplique.Height = HVtab
    LabelExplique.BorderStyle = BorderStyle.None
    LabelExplique.TextAlign = ContentAlignment.MiddleCenter
    LabelExplique.BackColor = CouleurFond

    For Rang = 0 To 5
      ButtonDonnees(Rang) = New Button
      Me.Controls.Add(ButtonDonnees(Rang))
      ButtonDonnees(Rang).Text = ""
      ButtonDonnees(Rang).Font = ButtonChoix(Rang).Font
      ButtonDonnees(Rang).Height = ButtonChoix(0).Height
      ButtonDonnees(Rang).Width = HVtab * 3.5
      ButtonDonnees(Rang).Location = New Point(HVChoix + Ecart * 2, LabelExplique.Location.Y + _
                                              LabelExplique.Height + Ecart + _
                                              (ButtonDonnees(0).Height + Ecart) * Rang)
      ButtonDonnees(Rang).TextAlign = ContentAlignment.MiddleCenter
      ButtonDonnees(Rang).Enabled = False
      ButtonDonnees(Rang).Tag = Rang
      ButtonDonnees(Rang).BackColor = CouleurButtonFonce
      AddHandler ButtonDonnees(Rang).Click, AddressOf ButtonDonnees_Click

    Next Rang

    LabelTraitDonnees = New Label
    Me.Controls.Add(LabelTraitDonnees)
    LabelTraitDonnees.Location = New Point(LabelTraitChoix.Location.X, _
                                           LabelTraitChoix.Location.Y + _
                                           LabelTraitChoix.Height + HVChoix)
    LabelTraitDonnees.Width = ButtonDonnees(5).Width + Ecart * 6.1
    LabelTraitDonnees.Height = ButtonDonnees(5).Location.Y + ButtonDonnees(5).Height - _
                               LabelTraitDonnees.Location.Y + Ecart
    LabelTraitDonnees.BorderStyle = BorderStyle.Fixed3D
    LabelTraitDonnees.BackColor = CouleurFond

    '-------------------

    VNombre = VDonnees
    HNombre = LabelTraitDonnees.Location.X + LabelTraitDonnees.Width + HVChoix + Ecart

    LabelNombre = New Label
    Me.Controls.Add(LabelNombre)
    LabelNombre.Text = "Le nombre" + Retour + "cherché :"
    LabelNombre.Font = New Font("Times New Roman", PetiteTaille, FontStyle.Bold)
    LabelNombre.Height = HVtab * 2
    LabelNombre.Width = HVtab * 5
    LabelNombre.Location = New Point(HNombre, VNombre)
    LabelNombre.TextAlign = ContentAlignment.TopCenter
    LabelNombre.BorderStyle = BorderStyle.None
    LabelNombre.BackColor = CouleurFond

    TextNombre = New TextBox
    Me.Controls.Add(TextNombre)
    TextNombre.Text = ""
    TextNombre.Font = New Font("Times New Roman", GrandeTaille, FontStyle.Bold)
    TextNombre.Height = HVtab * 2
    TextNombre.Width = HVtab * 3
    TextNombre.Location = New Point(HNombre + HVtab, _
                              ButtonDonnees(1).Location.Y - Ecart * Releve)
    TextNombre.TextAlign = HorizontalAlignment.Center
    TextNombre.BorderStyle = BorderStyle.Fixed3D
    AddHandler TextNombre.TextChanged, AddressOf TextNombre_TextChanged

    ButtonHasard = New Button
    Me.Controls.Add(ButtonHasard)
    ButtonHasard.Text = "Hasard"
    ButtonHasard.Width = HVtab * 3.9
    ButtonHasard.Height = HVtab * 1.7
    AddHandler ButtonHasard.Click, AddressOf ButtonHasard_Click
    ButtonHasard.BackColor = CouleurButtonClair
    ButtonHasard.Location = New Point(HNombre + HVtab * 0.5, _
                                      ButtonDonnees(2).Location.Y - Ecart * Releve)
    ButtonRien = New Button
    Me.Controls.Add(ButtonRien)
    ButtonRien.Enabled = False
    ButtonRien.Text = "Annuler"
    ButtonRien.Width = ButtonHasard.Width
    ButtonRien.Height = ButtonHasard.Height
    ButtonRien.BackColor = CouleurButtonFonce
    AddHandler ButtonRien.Click, AddressOf ButtonRien_Click
    ButtonRien.Location = New Point(ButtonHasard.Location.X, _
                                    ButtonDonnees(3).Location.Y - Ecart * Releve)

    LabelSoluce = New Label
    Me.Controls.Add(LabelSoluce)
    LabelSoluce.Location = New Point(HNombre, ButtonDonnees(4).Location.Y - HVtab * 0.2)
    LabelSoluce.Width = LabelNombre.Width
    LabelSoluce.Height = HVtab * 2
    LabelSoluce.BorderStyle = BorderStyle.None
    LabelSoluce.Text = "Lancer" + Retour + "le calcul"
    LabelSoluce.Font = LabelNombre.Font
    LabelSoluce.TextAlign = ContentAlignment.TopCenter
    LabelSoluce.BackColor = CouleurFond

    ButtonSoluce = New Button
    Me.Controls.Add(ButtonSoluce)
    ButtonSoluce.Text = "Solution"
    ButtonSoluce.Width = ButtonHasard.Width
    ButtonSoluce.Height = ButtonHasard.Height
    ButtonSoluce.BackColor = CouleurButtonFonce
    AddHandler ButtonSoluce.Click, AddressOf ButtonSoluce_Click
    ButtonSoluce.Enabled = False
    ButtonSoluce.Location = New Point(ButtonRien.Location.X, LabelSoluce.Location.Y + LabelSoluce.Height + HVtab * 0.5)

    LabelTraitNombre = New Label
    Me.Controls.Add(LabelTraitNombre)
    LabelTraitNombre.Location = New Point(HNombre - Ecart * 2.5, LabelTraitDonnees.Location.Y)
    LabelTraitNombre.Width = HVtab * 6
    LabelTraitNombre.Height = ButtonRien.Height + ButtonRien.Location.Y + Ecart * 2.5 - _
                              VNombre
    LabelTraitNombre.BorderStyle = BorderStyle.Fixed3D
    LabelTraitNombre.BackColor = CouleurFond

    LabelTraitSoluce = New Label
    Me.Controls.Add(LabelTraitSoluce)
    LabelTraitSoluce.Location = New Point(LabelTraitNombre.Location.X, _
                                          LabelTraitNombre.Location.Y + _
                                          LabelTraitNombre.Height + HVtab - Ecart * 2)
    LabelTraitSoluce.Width = LabelTraitNombre.Width
    LabelTraitSoluce.Height = ButtonSoluce.Height + ButtonSoluce.Location.Y - _
                              LabelTraitSoluce.Location.Y + Ecart * 2
    LabelTraitSoluce.BorderStyle = BorderStyle.Fixed3D
    LabelTraitSoluce.BackColor = CouleurFond

    '-------------------

    LabelReponse = New Label
    Me.Controls.Add(LabelReponse)

    LabelTraitReponse = New Label
    Me.Controls.Add(LabelTraitReponse)
    LabelTraitReponse.Location = New Point(LabelTraitNombre.Location.X + _
                                           LabelTraitNombre.Width + Ecart * 2, _
                                           LabelTraitNombre.Location.Y)
    LabelTraitReponse.Width = LabelTraitChoix.Location.X + LabelTraitChoix.Width - _
                              LabelTraitReponse.Location.X
    LabelTraitReponse.Height = LabelTraitDonnees.Location.Y + LabelTraitDonnees.Height - _
                               LabelTraitReponse.Location.Y
    LabelTraitReponse.BorderStyle = BorderStyle.Fixed3D
    LabelTraitReponse.BackColor = CouleurFond

    LabelReponse.Location = New Point(LabelTraitReponse.Location.X + HVtab * 0.5, _
                                      LabelTraitReponse.Location.Y + HVtab * 0.2)
    LabelReponse.Width = LabelTraitReponse.Width - HVtab
    LabelReponse.Height = LabelTraitReponse.Height - HVtab * 0.7
    LabelReponse.BorderStyle = BorderStyle.None
    LabelReponse.Text = ""
    LabelReponse.Font = New Font("Symbol", SuperTaille, FontStyle.Bold)
    LabelReponse.BackColor = CouleurFond

    '-------------------

    Me.Height = LabelTraitDonnees.Location.Y + LabelTraitDonnees.Height + HVChoix + Ecart * 6
    Me.Location = New Point(HVtab, HVtab)
    Me.Width = LabelTraitChoix.Location.X + LabelTraitChoix.Width + HVChoix + Ecart
    Me.Text = "  Des  chiffres  par  Jacques  BOURDEAU  :"

    '-------------------

    SiNoTexte = False

  End Sub
  '--------------------------------------------------------------------------------------
  Function Chaine$(ByVal Nombre&)

    Return Trim(Str(Nombre))

  End Function
  '--------------------------------------------------------------------------------------
  Private Sub ButtonDonnees_Click(ByVal Sender As System.Object, ByVal E As System.EventArgs)

    ButtonDonnees(Sender.Tag).Text = ""
    ButtonDonnees(Sender.Tag).Enabled = False
    ButtonDonnees(Sender.Tag).BackColor = CouleurButtonFonce
    NombreDonnees = NombreDonnees - 1
    Call VerifieMaximum()

  End Sub
  '--------------------------------------------------------------------------------------
  Private Sub ButtonChoix_Click(ByVal Sender As System.Object, ByVal E As System.EventArgs)

    Dim Rang%

    If NombreDonnees > 5 Then
      Exit Sub
    End If

    KelChoix = Sender.tag

    Rang = 0
    While Len(ButtonDonnees(Rang).Text.Trim) > 0
      Rang = Rang + 1
    End While

    ButtonDonnees(Rang).Text = Chaine(KelChoix)
    ButtonDonnees(Rang).Enabled = True
    ButtonDonnees(Rang).BackColor = CouleurButtonClair
    NombreDonnees = NombreDonnees + 1

    Call VerifieMaximum()

    ButtonSoluce.Enabled = (NombreDonnees = 6) And (Val(TextNombre.Text) > 100)
    If ButtonSoluce.Enabled Then
      ButtonSoluce.BackColor = CouleurButtonClair
    Else
      ButtonSoluce.BackColor = CouleurButtonFonce
    End If

  End Sub
  '--------------------------------------------------------------------------------------
  Private Sub TextNombre_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

    Dim Texte$, NewTexte$, Lettre$

    If SiNoTexte Then Exit Sub

    SiNoTexte = True
    Texte = TextNombre.Text
    If Len(Texte) > 3 Then
      Texte = Texte.Substring(0, 3)
    End If

    NewTexte = ""
    While (Len(Texte) > 0)
      Lettre = Texte.Chars(0)
      If (Lettre >= "0") And (Lettre <= "9") Then
        NewTexte = NewTexte + Lettre
      End If
      Texte = Texte.Substring(1)
    End While
    TextNombre.Text = NewTexte

    ButtonSoluce.Enabled = (Val(NewTexte) > 100) And (NombreDonnees = 6)
    If ButtonSoluce.Enabled Then
      ButtonSoluce.BackColor = CouleurButtonClair
    Else
      ButtonSoluce.BackColor = CouleurButtonFonce
    End If

    ButtonRien.Enabled = Len(NewTexte) > 0
    If ButtonRien.Enabled Then
      ButtonRien.BackColor = CouleurButtonClair
    Else
      ButtonRien.BackColor = CouleurButtonFonce
    End If

    TextNombre.SelectionStart = Len(TextNombre.Text)

    SiNoTexte = False

  End Sub
  '--------------------------------------------------------------------------------------
  'vérifie si le nombre maximum de chiffres est atteint
  Sub VerifieMaximum()

    Dim Rang%, Place%, NombreChiffre%(13)

    For Rang = 0 To 13
      NombreChiffre(Rang) = 0
    Next Rang

    For Place = 0 To 5
      If Len(ButtonDonnees(Place).Text) > 0 Then
        Rang = RangNombre(Val(ButtonDonnees(Place).Text))
        NombreChiffre(Rang) = NombreChiffre(Rang) + 1
      End If
    Next Place

    If NombreDonnees < 6 Then
      ButtonSoluce.Enabled = False
      For Rang = 0 To 13
        ButtonChoix(Rang).Enabled = (NombreChiffre(Rang) < NombreChoix(Rang))
      Next Rang
    Else
      For Rang = 0 To 13
        ButtonChoix(Rang).Enabled = False
      Next Rang
    End If
    For Rang = 0 To 13

      If ButtonChoix(Rang).Enabled Then
        ButtonChoix(Rang).BackColor = CouleurButtonClair
      Else
        ButtonChoix(Rang).BackColor = CouleurButtonFonce
      End If
    Next Rang

    Select Case NombreDonnees
      Case 0
        LabelExplique.Text = "0 nombre"
      Case 1
        LabelExplique.Text = "1 nombre"
      Case Else
        LabelExplique.Text = Chaine(NombreDonnees) + " nombres"
    End Select

  End Sub
  '--------------------------------------------------------------------------------------
  Public Function RangNombre%(ByVal KelChiffre%)

    Dim Reponse%, Rang%

    Reponse = -1
    For Rang = 0 To 13
      If ValeurChoix(Rang) = KelChiffre Then
        Reponse = Rang
      End If
    Next Rang

    Return Reponse

  End Function
  '--------------------------------------------------------------------------------------
  Private Sub ButtonRien_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    TextNombre.Text = ""
    ButtonRien.Enabled = False
    ButtonRien.BackColor = CouleurButtonFonce
    ButtonSoluce.Enabled = False
    ButtonSoluce.BackColor = CouleurButtonFonce

  End Sub
  '--------------------------------------------------------------------------------------
  Private Sub ButtonHasard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    Dim Koi%

    Koi = 0
    Randomize()

    While (Koi < 101) Or (Koi > 999)
      Koi = CInt(1000 * Rnd())
    End While

    SiNoTexte = True

    TextNombre.Text = Chaine(Koi)
    ButtonRien.Enabled = True
    ButtonRien.BackColor = CouleurButtonClair
    ButtonSoluce.Enabled = (NombreDonnees = 6)
    If ButtonSoluce.Enabled Then
      ButtonSoluce.BackColor = CouleurButtonClair
    Else
      ButtonSoluce.BackColor = CouleurButtonFonce
    End If
    SiNoTexte = False

  End Sub
  '--------------------------------------------------------------------------------------
  Private Sub ButtonSoluce_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

    Dim Rang%, Place%, Relais%, Envoi%
    Dim EncoreTri As Boolean
    Dim EncoreCherche(5) As Boolean

    'Public Operation%(5) ' " 0 = + " ; " 1 = x " ; " 2 = - " ; " 3 = / "
    'Public Resultat%(5) ' de l'opération
    'Public RangOperation%(5)
    'Public RangOperande%(5)
    'Public RangOperateur%(5) ' Operande Operation Operateur = Resultat

    'prépare la saisie des données
    For Rang = 0 To 5
      Chiffre0(Rang) = 0
    Next Rang

    'saisie + tri des données
    For Rang = 0 To 5
      Chiffre0(Rang) = Val(ButtonDonnees(Rang).Text)
      If Rang > 0 Then
        Place = Rang
        EncoreTri = (Chiffre0(Place - 1) < Chiffre0(Place))
        While EncoreTri
          Relais = Chiffre0(Place - 1)
          Chiffre0(Place - 1) = Chiffre0(Place)
          Chiffre0(Place) = Relais

          If Place > 0 Then
            Place = Place - 1
            If Place > 0 Then
              EncoreTri = (Chiffre0(Place - 1) < Chiffre0(Place))
            Else
              EncoreTri = False
            End If

          Else
            EncoreTri = False
          End If
        End While
      End If
    Next

    But = Val(TextNombre.Text)
    EncoreCherche(0) = True
    RangOperation(0) = 0
    RangOperande(0) = 0
    RangOperateur(0) = 1
    Approximation = 0

    While EncoreCherche(0)
      MonResultat(0) = Resultat(0)
      If SiOperationCorrecte(0) Then
        If Math.Abs(MonResultat(0) - But) < Math.Abs(Approximation - But) Then
          Approximation = MonResultat(0)
          Call MontrerSoluce(0)
        End If
        If Approximation = But Then
          EncoreCherche(0) = False
        Else ' passant au niveau suivant

          'passons au niveau 1
          EncoreCherche(1) = True
          RangOperation(1) = 0
          RangOperande(1) = 0
          RangOperateur(1) = 1

          'préparer le niveau suivant
          Envoi = 1
          Chiffre1(0) = MonResultat(0)

          For Rang = 0 To 5
            If (Rang <> RangOperateur(0)) And (Rang <> RangOperande(0)) Then
              Chiffre1(Envoi) = Chiffre0(Rang)

              Place = Envoi
              EncoreTri = (Chiffre1(Place - 1) < Chiffre1(Place))
              While EncoreTri
                Relais = Chiffre1(Place - 1)
                Chiffre1(Place - 1) = Chiffre1(Place)
                Chiffre1(Place) = Relais

                If Place > 0 Then
                  Place = Place - 1
                  If Place > 0 Then
                    EncoreTri = (Chiffre1(Place - 1) < Chiffre1(Place))
                  Else
                    EncoreTri = False
                  End If
                Else
                  EncoreTri = False
                End If
              End While
              Envoi = Envoi + 1
            End If
          Next

          While EncoreCherche(1)
            MonResultat(1) = Resultat(1)
            If SiOperationCorrecte(1) Then
              If Math.Abs(MonResultat(1) - But) < Math.Abs(Approximation - But) Then
                Approximation = MonResultat(1)
                Call MontrerSoluce(1)
              End If
              If Approximation = But Then
                EncoreCherche(1) = False
              Else ' passant au niveau suivant

                'passons au niveau 2
                EncoreCherche(2) = True
                RangOperation(2) = 0
                RangOperande(2) = 0
                RangOperateur(2) = 1

                'préparer le niveau suivant
                Envoi = 1 ' on ajoute les nombres restants après le résultat
                Chiffre2(0) = MonResultat(1)

                For Rang = 0 To 4
                  If (Rang <> RangOperateur(1)) And (Rang <> RangOperande(1)) Then
                    Chiffre2(Envoi) = Chiffre1(Rang)

                    Place = Envoi
                    EncoreTri = (Chiffre2(Place - 1) < Chiffre2(Place))
                    While EncoreTri
                      Relais = Chiffre2(Place - 1)
                      Chiffre2(Place - 1) = Chiffre2(Place)
                      Chiffre2(Place) = Relais

                      If Place > 0 Then
                        Place = Place - 1
                        If Place > 0 Then
                          EncoreTri = (Chiffre2(Place - 1) < Chiffre2(Place))
                        Else
                          EncoreTri = False
                        End If
                      Else
                        EncoreTri = False
                      End If
                    End While
                    Envoi = Envoi + 1
                  End If
                Next

                While EncoreCherche(2)
                  MonResultat(2) = Resultat(2)

                  If SiOperationCorrecte(2) Then
                    If Math.Abs(MonResultat(2) - But) < Math.Abs(Approximation - But) Then
                      Approximation = MonResultat(2)
                      Call MontrerSoluce(2)
                    End If
                    If Approximation = But Then
                      EncoreCherche(2) = False
                    Else ' passant au niveau suivant

                      'passons au niveau 3
                      EncoreCherche(3) = True
                      RangOperation(3) = 0
                      RangOperande(3) = 0
                      RangOperateur(3) = 1

                      'préparer le niveau suivant
                      Envoi = 1 ' on ajoute les nombres restants après le résultat
                      Chiffre3(0) = MonResultat(2)

                      For Rang = 0 To 3
                        If (Rang <> RangOperateur(2)) And (Rang <> RangOperande(2)) Then
                          Chiffre3(Envoi) = Chiffre2(Rang)

                          Place = Envoi
                          EncoreTri = (Chiffre3(Place - 1) < Chiffre3(Place))
                          While EncoreTri
                            Relais = Chiffre3(Place - 1)
                            Chiffre3(Place - 1) = Chiffre3(Place)
                            Chiffre3(Place) = Relais

                            If Place > 0 Then
                              Place = Place - 1
                              If Place > 0 Then
                                EncoreTri = (Chiffre3(Place - 1) < Chiffre3(Place))
                              Else
                                EncoreTri = False
                              End If
                            Else
                              EncoreTri = False
                            End If
                          End While
                          Envoi = Envoi + 1
                        End If
                      Next

                      While EncoreCherche(3)
                        MonResultat(3) = Resultat(3)

                        If SiOperationCorrecte(3) Then
                          If Math.Abs(MonResultat(3) - But) < Math.Abs(Approximation - But) Then
                            Approximation = MonResultat(3)
                            Call MontrerSoluce(3)
                          End If
                          If Approximation = But Then
                            EncoreCherche(3) = False
                          Else ' passant au niveau suivant
                            EncoreCherche(4) = True
                            RangOperation(4) = 0

                            'préparer le niveau suivant
                            Chiffre4(0) = MonResultat(3)

                            For Rang = 0 To 2
                              If (Rang <> RangOperateur(3)) And (Rang <> RangOperande(3)) Then
                                Chiffre4(1) = Chiffre3(Rang)
                              End If
                            Next
                            If Chiffre4(1) > Chiffre4(0) Then
                              Relais = Chiffre4(1)
                              Chiffre4(1) = Chiffre4(0)
                              Chiffre4(0) = Relais
                            End If

                            While EncoreCherche(4)
                              MonResultat(4) = Resultat(4)

                              If SiOperationCorrecte(4) Then

                                If Math.Abs(MonResultat(4) - But) < Math.Abs(Approximation - But) Then
                                  Approximation = MonResultat(4)
                                  Call MontrerSoluce(4)
                                End If
                                If Approximation = But Then
                                  EncoreCherche(4) = False
                                End If
                              End If

                              If RangOperation(4) < 3 Then
                                RangOperation(4) = RangOperation(4) + 1
                              Else
                                EncoreCherche(4) = False
                              End If
                            End While

                          End If
                        End If

                        If RangOperation(3) < 3 Then
                          RangOperation(3) = RangOperation(3) + 1
                        ElseIf RangOperateur(3) < 2 Then
                          RangOperation(3) = 0
                          RangOperateur(3) = RangOperateur(3) + 1
                        Else
                          If RangOperande(3) < 1 Then
                            RangOperande(3) = RangOperande(3) + 1
                            RangOperateur(3) = RangOperande(3) + 1
                          Else
                            EncoreCherche(3) = False
                          End If
                        End If
                      End While
                    End If
                  End If

                  If RangOperation(2) < 3 Then
                    RangOperation(2) = RangOperation(2) + 1
                  ElseIf RangOperateur(2) < 3 Then
                    RangOperation(2) = 0
                    RangOperateur(2) = RangOperateur(2) + 1
                  Else
                    If RangOperande(2) < 2 Then
                      RangOperande(2) = RangOperande(2) + 1
                      RangOperateur(2) = RangOperande(2) + 1
                    Else
                      EncoreCherche(2) = False
                    End If
                  End If

                End While

              End If
            End If

            If RangOperation(1) < 3 Then
              RangOperation(1) = RangOperation(1) + 1
            ElseIf RangOperateur(1) < 4 Then
              RangOperation(1) = 0
              RangOperateur(1) = RangOperateur(1) + 1
            Else
              If RangOperande(1) < 3 Then
                RangOperande(1) = RangOperande(1) + 1
                RangOperateur(1) = RangOperande(1) + 1
              Else
                EncoreCherche(1) = False
              End If
            End If

          End While
        End If
      End If

      If RangOperation(0) < 3 Then
        RangOperation(0) = RangOperation(0) + 1
      ElseIf RangOperateur(0) < 5 Then
        RangOperation(0) = 0
        RangOperateur(0) = RangOperateur(0) + 1
      Else
        If RangOperande(0) < 4 Then
          RangOperande(0) = RangOperande(0) + 1
          RangOperateur(0) = RangOperande(0) + 1
        Else
          EncoreCherche(0) = False
        End If
      End If
    End While

  End Sub
  '--------------------------------------------------------------------------------------
  Function Resultat&(ByVal KelNiveau%)

    Dim KelResultat&

    ' " 0 = + " ; " 1 = x " ; " 2 = - " ; " 3 = / "

    Select Case KelNiveau
      Case 0
        Select Case RangOperation(0)
          Case 0
            SiOperationCorrecte(0) = True
            KelResultat = Chiffre0(RangOperande(0)) + Chiffre0(RangOperateur(0))
          Case 1
            SiOperationCorrecte(0) = (Chiffre0(RangOperateur(0)) > 1)
            KelResultat = Chiffre0(RangOperande(0)) * Chiffre0(RangOperateur(0))
          Case 2
            SiOperationCorrecte(0) = (Chiffre0(RangOperande(0)) > Chiffre0(RangOperateur(0)))
            KelResultat = Chiffre0(RangOperande(0)) - Chiffre0(RangOperateur(0))
          Case Else
            SiOperationCorrecte(0) = ((Chiffre0(RangOperande(0)) Mod _
                                       Chiffre0(RangOperateur(0))) = 0)
            If Chiffre0(RangOperateur(0)) < 2 Then SiOperationCorrecte(0) = False
            KelResultat = Chiffre0(RangOperande(0)) \ Chiffre0(RangOperateur(0))
        End Select

      Case 1
        Select Case RangOperation(1)
          Case 0
            SiOperationCorrecte(1) = True
            KelResultat = Chiffre1(RangOperande(1)) + Chiffre1(RangOperateur(1))
          Case 1
            SiOperationCorrecte(1) = (Chiffre1(RangOperateur(1)) > 1)
            KelResultat = Chiffre1(RangOperande(1)) * Chiffre1(RangOperateur(1))
          Case 2
            SiOperationCorrecte(1) = (Chiffre1(RangOperande(1)) > Chiffre1(RangOperateur(1)))
            KelResultat = Chiffre1(RangOperande(1)) - Chiffre1(RangOperateur(1))
          Case Else
            SiOperationCorrecte(1) = ((Chiffre1(RangOperande(1)) Mod _
                                       Chiffre1(RangOperateur(1))) = 0)
            If Chiffre1(RangOperateur(1)) < 2 Then SiOperationCorrecte(1) = False
            KelResultat = Chiffre1(RangOperande(1)) \ Chiffre1(RangOperateur(1))
        End Select

      Case 2
        Select Case RangOperation(2)
          Case 0
            SiOperationCorrecte(2) = True
            KelResultat = Chiffre2(RangOperande(2)) + Chiffre2(RangOperateur(2))
          Case 1
            SiOperationCorrecte(2) = (Chiffre2(RangOperateur(2)) > 1)
            KelResultat = Chiffre2(RangOperande(2)) * Chiffre2(RangOperateur(2))
          Case 2
            SiOperationCorrecte(2) = (Chiffre2(RangOperande(2)) > Chiffre2(RangOperateur(2)))
            KelResultat = Chiffre2(RangOperande(2)) - Chiffre2(RangOperateur(2))
          Case Else
            SiOperationCorrecte(2) = ((Chiffre2(RangOperande(2)) Mod _
                                       Chiffre2(RangOperateur(2))) = 0)
            If Chiffre2(RangOperateur(2)) < 2 Then SiOperationCorrecte(2) = False
            KelResultat = Chiffre2(RangOperande(2)) \ Chiffre2(RangOperateur(2))
        End Select

      Case 3
        Select Case RangOperation(3)
          Case 0
            SiOperationCorrecte(3) = True
            KelResultat = Chiffre3(RangOperande(3)) + Chiffre3(RangOperateur(3))
          Case 1
            SiOperationCorrecte(3) = (Chiffre3(RangOperateur(3)) > 1)
            KelResultat = Chiffre3(RangOperande(3)) * Chiffre3(RangOperateur(3))
          Case 2
            SiOperationCorrecte(3) = (Chiffre3(RangOperande(3)) > Chiffre3(RangOperateur(3)))
            KelResultat = Chiffre3(RangOperande(3)) - Chiffre3(RangOperateur(3))
          Case Else
            SiOperationCorrecte(3) = ((Chiffre3(RangOperande(3)) Mod _
                                       Chiffre3(RangOperateur(3))) = 0)
            If Chiffre3(RangOperateur(3)) < 2 Then SiOperationCorrecte(3) = False
            KelResultat = Chiffre3(RangOperande(3)) \ Chiffre3(RangOperateur(3))
        End Select

      Case 4
        Select Case RangOperation(4)
          Case 0
            SiOperationCorrecte(4) = True
            KelResultat = Chiffre4(0) + Chiffre4(1)
          Case 1
            SiOperationCorrecte(4) = (Chiffre4(1) > 1)
            KelResultat = Chiffre4(0) * Chiffre4(1)
          Case 2
            SiOperationCorrecte(4) = (Chiffre4(0) > Chiffre4(1))
            KelResultat = Chiffre4(0) - Chiffre4(1)
          Case Else
            SiOperationCorrecte(4) = ((Chiffre4(0) Mod Chiffre4(1)) = 0)
            If Chiffre4(1) < 2 Then SiOperationCorrecte(4) = False
            KelResultat = Chiffre4(0) \ Chiffre4(1)
        End Select

    End Select

    If KelResultat = 0 Then SiOperationCorrecte(KelNiveau) = False

    Return KelResultat

  End Function
  '--------------------------------------------------------------------------------------
  Sub MontrerSoluce(ByVal KelNiveau%)

    LabelReponse.Text = ""

    LabelReponse.Text = LabelReponse.Text + _
                        Chaine(Chiffre0(RangOperande(0))) + " " + _
                        Signe(RangOperation(0)) + " " + _
                        Chaine(Chiffre0(RangOperateur(0))) + " = " + _
                        Chaine(MonResultat(0))

    If KelNiveau > 0 Then
      LabelReponse.Text = LabelReponse.Text + Retour + _
                          Chaine(Chiffre1(RangOperande(1))) + " " + _
                          Signe(RangOperation(1)) + " " + _
                          Chaine(Chiffre1(RangOperateur(1))) + " = " + _
                          Chaine(MonResultat(1))
    End If

    If KelNiveau > 1 Then
      LabelReponse.Text = LabelReponse.Text + Retour + _
                          Chaine(Chiffre2(RangOperande(2))) + " " + _
                          Signe(RangOperation(2)) + " " + _
                          Chaine(Chiffre2(RangOperateur(2))) + " = " + _
                          Chaine(MonResultat(2))
    End If

    If KelNiveau > 2 Then
      LabelReponse.Text = LabelReponse.Text + Retour + _
                          Chaine(Chiffre3(RangOperande(3))) + " " + _
                          Signe(RangOperation(3)) + " " + _
                          Chaine(Chiffre3(RangOperateur(3))) + " = " + _
                          Chaine(MonResultat(3))
    End If

    If KelNiveau > 3 Then
      LabelReponse.Text = LabelReponse.Text + Retour + _
                          Chaine(Chiffre4(0)) + " " + _
                          Signe(RangOperation(4)) + " " + _
                          Chaine(Chiffre4(1)) + " = " + _
                          Chaine(MonResultat(4))
    End If

  End Sub
  '--------------------------------------------------------------------------------------

End Class
'--------------------------------------------------------------------------------------

Conclusion :


La propriété "tag" des 14 boutons "ButtonChoix(13)" permet de les indexer afin de déterminer le bouton cliqué.

Pas de bug mais plein de méthodes net pour débutants. Le logiciel contrôle toute action de l'utilisateur et interdit tout plantage.

C'est une adaption en net d'un programme écrit à l'origine en assembleur sous Apple II il ya plus de 20 ans

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.