IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Optimisation compte est bon


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut Optimisation compte est bon
    Bonjour à tous !

    Cela faisait un moment que je n'étais pas venu sur le forum, j'espère que vous me pardonnerez

    Je reviens donc vers vous, pour un petit programme personnel, qui comme indiqué dans le titre, est le jeu du compte est bon.

    J'ai déjà développé toute l'interface, ainsi que la recherche de solution et la possibilité d'effectuer les calculs. Ma demande est donc, si vous y convenez, d'optimiser le programme, et essentiellement la recherche de la solution optimale (qui est fonctionnelle, mais peut s'avérer relativement lente).

    Je joins le document (je sais, les règles du forum préconisent de mettre uniquement le code, mais l'application, vous en conviendrez, ne le permet pas vraiment), si vous êtes intéressés pour y jouer, ou pour m'aider à l'optimiser. (fichier xlsm, pas de mot de passe).

    Compte est bon.xlsm

    Merci d'avance pour votre aide
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  2. #2
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Bonjour,

    Personne en mesure de m'aider? En attendant, voici une petite correction apportée (le tirage de l'objectif aléatoire était erroné), ainsi qu'une très légère optimisation (Si la valeur maximale pouvant être obtenue avec l'ensemble des plaques est inférieure ou égale à la valeur objectif, alors celle-ci est la meilleure solution réalisable).

    J'imagine bien qu'il ne s'agit pas d'un projet pour débutants, mais je suis certain que sur le forum il y a des personnes très qualifiées pour m'aider dans ce projet.

    Si vous avez besoin que j'ajoute des commentaires dans mon code, je le ferais également avec plaisir ! (Et je comprends parfaitement qu'en leur absence, cela puisse rebuter certaines personnes).

    Merci d'avance

    Compte est bon.xlsm
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    Sub test()
    With CreateObject("ScriptControl")
       .Language = "JScript"
       .AddCode Jv
       Debug.Print .Run("go", "4, 3, 1, 7, 25, 3", 828)
    End With
    End Sub
    Function Jv()
    Jv = Jv & "var nb_a_tirer = 6; // combien de nombres à tirer aléatoirement" & vbCrLf
    Jv = Jv & "var cible = 2;var nbalea='';var nbcible=0; // valeur cible" & vbCrLf
    Jv = Jv & "var nbres_dispos = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100); // nombres dispos pour tirage aléatoire" & vbCrLf
    Jv = Jv & "var operations_encours = new Array();" & vbCrLf
    Jv = Jv & "var best_operations = new Array();" & vbCrLf
    Jv = Jv & "var best_distance;" & vbCrLf
    Jv = Jv & "var best_nb_op;" & vbCrLf
    Jv = Jv & "var nbres_aleas = new Array(6,3,50,50,50,500); // tableau des nombres tirés pour calcul" & vbCrLf
    Jv = Jv & "var operateurs = new Array('+','*','-','/');" & vbCrLf
    Jv = Jv & "var compteur = 0;" & vbCrLf
    Jv = Jv & "var resultat = '';" & vbCrLf
    Jv = Jv & "" & vbCrLf
    Jv = Jv & "" & vbCrLf
    Jv = Jv & "// tirage d'un nombre cible aléatoirement" & vbCrLf
    Jv = Jv & "function nombre_cible_aleatoire() {" & vbCrLf
    Jv = Jv & " cible = 100 + Math.floor(900*Math.random());" & vbCrLf
    Jv = Jv & "nbcible= cible;" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "// tirage des nombres pour le calcul" & vbCrLf
    Jv = Jv & "function nombres_aleatoires() {" & vbCrLf
    Jv = Jv & " var texte = '';" & vbCrLf
    Jv = Jv & " for(i=0;i<nb_a_tirer;i++)" & vbCrLf
    Jv = Jv & " {" & vbCrLf
    Jv = Jv & " b = 1 + Math.floor((nbres_dispos.length)*Math.random());" & vbCrLf
    Jv = Jv & " texte = texte + '   ' + nbres_dispos[b-1];" & vbCrLf
    Jv = Jv & " nbres_aleas[i] = nbres_dispos[b-1];" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " nbalea = texte;" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "// calcule de 2 nombres n1 et n2 avec 1 des 4 opérateurs" & vbCrLf
    Jv = Jv & "function calcule(n1, n2, op){" & vbCrLf
    Jv = Jv & " compteur = compteur + 1;" & vbCrLf
    Jv = Jv & " var res;" & vbCrLf
    Jv = Jv & " if(op == '+'){" & vbCrLf
    Jv = Jv & "  res = n1 + n2;" & vbCrLf
    Jv = Jv & "  operations_encours.push(n1+ op + n2 + '=' + res);" & vbCrLf
    Jv = Jv & "  return res;" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " if(op == '-') {" & vbCrLf
    Jv = Jv & "  if(n1 > n2)" & vbCrLf
    Jv = Jv & "  {" & vbCrLf
    Jv = Jv & "   res = n1 - n2;" & vbCrLf
    Jv = Jv & "   operations_encours.push(n1 + op + n2 + '=' + res);" & vbCrLf
    Jv = Jv & "   return res;" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & "  else" & vbCrLf
    Jv = Jv & "  {" & vbCrLf
    Jv = Jv & "   res = n2 - n1;" & vbCrLf
    Jv = Jv & "   operations_encours.push(n2 + op + n1 + '=' + res);" & vbCrLf
    Jv = Jv & "   return res;" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " if(op == '*')" & vbCrLf
    Jv = Jv & " {" & vbCrLf
    Jv = Jv & "  res = n1 * n2;" & vbCrLf
    Jv = Jv & "  operations_encours.push(n1 + op + n2 + '=' + res);" & vbCrLf
    Jv = Jv & "  return res;" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " if(op == '/')" & vbCrLf
    Jv = Jv & " {" & vbCrLf
    Jv = Jv & "  if(n1 >= n2){" & vbCrLf
    Jv = Jv & "   res = Math.floor(n1 / n2);" & vbCrLf
    Jv = Jv & "   if(res * n2 != n1) res = 0;" & vbCrLf
    Jv = Jv & "   operations_encours.push(n1 + op + n2 + '=' + res);" & vbCrLf
    Jv = Jv & "   return res;" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & "  else" & vbCrLf
    Jv = Jv & "  {" & vbCrLf
    Jv = Jv & "   res = Math.floor(n2 / n1);" & vbCrLf
    Jv = Jv & "   if(res * n1 != n2) res = 0;" & vbCrLf
    Jv = Jv & "   operations_encours.push(n2 + op + n1 + '=' + res);" & vbCrLf
    Jv = Jv & "   return res;" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "function go(Tin,Vin){" & vbCrLf
    Jv = Jv & "nbres_aleas=Tin.split(',');cible=Vin; // réinitialisation des variables" & vbCrLf
    Jv = Jv & " compteur = 0;" & vbCrLf
    Jv = Jv & " best_distance = cible;" & vbCrLf
    Jv = Jv & " best_nb_op = nb_a_tirer;" & vbCrLf
    Jv = Jv & " operations_encours = new Array();" & vbCrLf
    Jv = Jv & " best_operations = new Array();" & vbCrLf
    Jv = Jv & " resultat = '';" & vbCrLf
    Jv = Jv & " recherche_arbre(nbres_aleas);  // recherche récursive" & vbCrLf
    Jv = Jv & " if(best_distance ==0) resultat = resultat + 'Le compte est bon ! \n';" & vbCrLf
    Jv = Jv & " else resultat = resultat + 'Le compte n est pas bon ! \n';" & vbCrLf
    Jv = Jv & " affiche(compteur,best_operations);" & vbCrLf
    Jv = Jv & "return resultat;" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "function recherche_arbre(tab){" & vbCrLf
    Jv = Jv & " var nb_nombres = tab.length;" & vbCrLf
    Jv = Jv & " var i,j,p;" & vbCrLf
    Jv = Jv & " //if(nb_nombres<=best_nb_op){" & vbCrLf
    Jv = Jv & " for(i=0;i<nb_nombres-1;i++) {" & vbCrLf
    Jv = Jv & "  for(j=i+1;j<nb_nombres;j++){" & vbCrLf
    Jv = Jv & "   for(p=0;p<4;p++){" & vbCrLf
    Jv = Jv & "    res = calcule(tab[i],tab[j],operateurs[p]); // on calcule et on empile" & vbCrLf
    Jv = Jv & "    if(res!=0){" & vbCrLf
    Jv = Jv & "    compare(res);" & vbCrLf
    Jv = Jv & "    var tab2 = new Array();" & vbCrLf
    Jv = Jv & "    tab2.push(res);" & vbCrLf
    Jv = Jv & "    for(k=0;k<nb_nombres;k++) if(k!=i && k!=j) tab2.push(tab[k]);" & vbCrLf
    Jv = Jv & "    if(tab2.length>1 && operations_encours.length<best_nb_op-1) recherche_arbre(tab2);" & vbCrLf
    Jv = Jv & "    }" & vbCrLf
    Jv = Jv & "    operations_encours.pop(); // on dépile" & vbCrLf
    Jv = Jv & "   }" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "" & vbCrLf
    Jv = Jv & "" & vbCrLf
    Jv = Jv & "function compare(n){" & vbCrLf
    Jv = Jv & " if(n==cible && operations_encours.length<best_nb_op){" & vbCrLf
    Jv = Jv & "  best_distance = 0;" & vbCrLf
    Jv = Jv & "  best_nb_op = operations_encours.length;" & vbCrLf
    Jv = Jv & "  copie_vers_best_operations();" & vbCrLf
    Jv = Jv & "  //resultat = 'Le compte est bon ! \n';" & vbCrLf
    Jv = Jv & "  //affiche(compteur,operations_encours);" & vbCrLf
    Jv = Jv & "  //break;" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " else{" & vbCrLf
    Jv = Jv & "  if(best_distance !=0){" & vbCrLf
    Jv = Jv & "   var distance = Math.abs(n-cible);" & vbCrLf
    Jv = Jv & "   if(distance < best_distance){" & vbCrLf
    Jv = Jv & "    best_distance = distance;" & vbCrLf
    Jv = Jv & "    copie_vers_best_operations();" & vbCrLf
    Jv = Jv & "   }" & vbCrLf
    Jv = Jv & "  }" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "function copie_vers_best_operations(){" & vbCrLf
    Jv = Jv & " for(i=0;i<operations_encours.length;i++) best_operations[i] = operations_encours[i];" & vbCrLf
    Jv = Jv & " for(i=operations_encours.length;i<nb_a_tirer-1;i++) best_operations[i] = '';" & vbCrLf
    Jv = Jv & "}" & vbCrLf
    Jv = Jv & "function affiche(nb_operations, tab_operations){" & vbCrLf
    Jv = Jv & " resultat = resultat + 'Profondeur de recherche : ' + nb_operations + '\n';" & vbCrLf
    Jv = Jv & " var i;" & vbCrLf
    Jv = Jv & " for(i=0;i<tab_operations.length;i++){" & vbCrLf
    Jv = Jv & "  resultat = resultat + tab_operations[i] + '\n';" & vbCrLf
    Jv = Jv & " }" & vbCrLf
    Jv = Jv & " return resultat;;" & vbCrLf
    Jv = Jv & "}"
    End Function
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    <script language="Javascript">
    var nb_a_tirer = 6; // combien de nombres à tirer aléatoirement
    var cible = 2; // valeur cible
    var nbres_dispos = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100); // nombres dispos pour tirage aléatoire
    var operations_encours = new Array();
    var best_operations = new Array();
    var best_distance;
    var best_nb_op;
    var nbres_aleas = new Array(6,3,50,50,50,500); // tableau des nombres tirés pour calcul
    var operateurs = new Array('+','*','-','/');
    var compteur = 0;
    var resultat = '';
     
     
     
     
    // tirage d'un nombre cible aléatoirement
    function nombre_cible_aleatoire() {
     cible = 100 + Math.floor(900*Math.random());
     document.forme.nbcible.value = cible;
    }
    // tirage des nombres pour le calcul
    function nombres_aleatoires() {
     var texte = '';
     for(i=0;i<nb_a_tirer;i++)
     {
     b = 1 + Math.floor((nbres_dispos.length)*Math.random());
     texte = texte + '   ' + nbres_dispos[b-1];
     nbres_aleas[i] = nbres_dispos[b-1];
     }
     document.forme.nbalea.value = texte;
    }
    // calcule de 2 nombres n1 et n2 avec 1 des 4 opérateurs
    function calcule(n1, n2, op){
     compteur = compteur + 1;
     var res;
     if(op == '+'){
      res = n1 + n2;
      operations_encours.push(n1+ op + n2 + '=' + res);
      return res;
     }
     if(op == '-') {
      if(n1 > n2)
      {
       res = n1 - n2;
       operations_encours.push(n1 + op + n2 + '=' + res);
       return res;
      }
      else
      {
       res = n2 - n1;
       operations_encours.push(n2 + op + n1 + '=' + res);
       return res;
      }
     }
     if(op == '*')
     {
      res = n1 * n2;
      operations_encours.push(n1 + op + n2 + '=' + res);
      return res;
     }
     if(op == '/')
     {
      if(n1 >= n2){
       res = Math.floor(n1 / n2);
       if(res * n2 != n1) res = 0;
       operations_encours.push(n1 + op + n2 + '=' + res);
       return res;
      }
      else
      {
       res = Math.floor(n2 / n1);
       if(res * n1 != n2) res = 0;
       operations_encours.push(n2 + op + n1 + '=' + res);
       return res;
      }
     }
    }
    function go(){
     // réinitialisation des variables
     compteur = 0;
     best_distance = cible;
     best_nb_op = nb_a_tirer;
     operations_encours = new Array();
     best_operations = new Array();
     resultat = '';
     recherche_arbre(nbres_aleas);  // recherche récursive
     if(best_distance ==0) resultat = resultat + "Le compte est bon ! \n";
     else resultat = resultat + "Le compte n est pas bon ! \n";
     affiche(compteur,best_operations);
     document.forme.go.value = resultat;
    }
    function recherche_arbre(tab){
     var nb_nombres = tab.length;
     var i,j,p;
     //if(nb_nombres<=best_nb_op){
     for(i=0;i<nb_nombres-1;i++) {
      for(j=i+1;j<nb_nombres;j++){
       for(p=0;p<4;p++){
        res = calcule(tab[i],tab[j],operateurs[p]); // on calcule et on empile
        if(res!=0){
        compare(res);
        var tab2 = new Array();
        tab2.push(res);
        for(k=0;k<nb_nombres;k++) if(k!=i && k!=j) tab2.push(tab[k]);
        if(tab2.length>1 && operations_encours.length<best_nb_op-1) recherche_arbre(tab2);
        }
        operations_encours.pop(); // on dépile
       }
      }
     }
    }
     
     
     
     
    function compare(n){
     if(n==cible && operations_encours.length<best_nb_op){
      best_distance = 0;
      best_nb_op = operations_encours.length;
      copie_vers_best_operations();
      //resultat = 'Le compte est bon ! \n';
      //affiche(compteur,operations_encours);
      //break;
     }
     else{
      if(best_distance !=0){
       var distance = Math.abs(n-cible);
       if(distance < best_distance){
        best_distance = distance;
        copie_vers_best_operations();
       }
      }
     }
    }
    function copie_vers_best_operations(){
     for(i=0;i<operations_encours.length;i++) best_operations[i] = operations_encours[i];
     for(i=operations_encours.length;i<nb_a_tirer-1;i++) best_operations[i] = '';
    }
    function affiche(nb_operations, tab_operations){
     resultat = resultat + 'Profondeur de recherche : ' + nb_operations + '\n';
     var i;
     for(i=0;i<tab_operations.length;i++){
      resultat = resultat + tab_operations[i] + '\n';
     }
     document.forme.go.value = resultat;;
    }
    </script>
     
     
     
     
     
     
     
     
    <form name="forme">
    <a href="javascript:nombre_cible_aleatoire();">Générer nombre cible aléatoire</a><br>
    <input type="text" size="35" maxlength="35" name="nbcible"></input><br>
    <a href="javascript:nombres_aleatoires();">Nombres aléatoires</a><br>
    <input type="text" size="35" maxlength="35" name="nbalea"></input><br>
    <a href="javascript:go();">Go!</a><br>
    <textarea cols="80" rows="10" name="go"></textarea>
    </form>
    Dernière modification par Invité ; 27/07/2017 à 13h55.

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    @dysorthographie

    Bonjour,

    Merci d'avoir répondu, mais je ne vois pas ce que tu apportes au projet
    Il est vrai que mon solveur est inspiré de l'algorithme javascript que tu as donné, source que j'aurais dû citer, veuillez m'en excuser, je le fais maintenant : Source première du solveur (code javascript)

    J'ai adapté le mieux possible ce code en VBA, mais je sais qu'il est possible de l'optimiser, d'ailleurs, voici une nouvelle version un peu plus rapide et plus aboutie (et commentée cette fois-ci)

    Compte est bon.xlsm

    Si quelqu'un a des idées pour l'optimiser encore, n'hésitez pas. Mon objectif est que la recherche de solutions se fasse en moins d'une minute, peu importe le cas. J'ai réussi à le faire passer de 3 min 30 dans le pire des cas à 2 minutes, mais je trouve cela encore long.

    NB : J'ai développé d'autres jeux également, dont les codes et interfaces sont de moi à 100% et que je mettrai bientôt dans les ressources, une fois ce jeu du compte est bon terminé (Masterming, memory, morpion, jeu du pendu, chaud-froid, le mot le plus long, ainsi qu'un solveur du petit bac à ma sauce). Et par la suite, ils devraient être complétés par un jeu de dames et un scrabble qui sont en cours de développement.
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code ça a l'avantage d'optimiser le temps de traitent! : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With CreateObject("ScriptControl")
       .Language = "JScript"
       .AddCode Jv
       Debug.Print .Run("go", "4, 3, 1, 7, 25, 3", 828)
     End With

  6. #6
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Code ça a l'avantage d'optimiser le temps de traitent
    Excuse-moi mais... je n'ai pas compris ce que tu voulais dire...
    Voulais-tu me faire comprendre que je peux exécuter du code javascript depuis VBA? Si oui, est-ce vraiment plus rapide?
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui tu peux exécuter du JavaScripts depuis Vb; oui c'est beaucoup plus rapide!
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 28/07/2017 à 12h40.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour !

    Citation Envoyé par jeanmidudu Voir le message
    NB : J'ai développé d'autres jeux également (memory, jeu du pendu)
    J'en ai développé aussi avec animations pour mes enfants quand ils étaient petits, aucune difficulté particulière …

    Sinon par mieux que Robert (salut !) et j'en profite pour le citer :

    ___________________________________________________________________________________________________________
    Question bien formulée, solution assurée !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Bonjour à tous,

    Je reviens sur cette discussion, avec un version beaucoup plus aboutie, tout à fait opérationnelle et plus optimisée du jeu "le compte est bon".
    Cette nouvelle version recherche les solutions dès que les nombres aléatoires sont générés, ainsi la recherche des solutions est effectuée en parallèle du jeu, ce qui permet d'avoir un certain gain de temps quant aux possibles attentes en fin de partie avant l'affichage des solutions.

    Sinon, je reste toujours à l'écoute de possibilités pour optimiser la recherche de solutions. Pour ce qui est de l'utilisation de scripts javascript (ou tout autre langage), ce n'est pas dans mon intérêt ici car l'objet "Scriptcontrol" n'est utilisable que sur les versions 32 bits d'Excel , or, je souhaite que mon jeu soit totalement portable (qu'il puisse fonctionner avec n'importe quelle version d'Excel, sans avoir besoin d'effectuer aucune configuration particulière).

    Le jeu est libre d'utilisation et de droits, merci simplement de me citer si vous le modifiez ou l'utilisez à vos fins

    compte est bon.xlsm

    Edit : suite à la très juste remarque de Daranc, j'ai retiré le classeur vide
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  10. #10
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeanmidudu Voir le message
    Et pour ceux qui ne veulent pas prendre de risque avec les fichiers .xlsm, le voici en .xlsx :
    donc sans le code , autant dire un classeur vide

  11. #11
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Citation Envoyé par Daranc Voir le message
    donc sans le code , autant dire un classeur vide
    Oups, pardon, j'avais oublié ce détail . Je le vire alors (désolé )
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  12. #12
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Suite à la très juste remarque de Daranc, plutôt qu'un classeur Excel, voici un zip contenant les sources de mon code (2 UserForm et un module de classe) :
    Fichiers attachés Fichiers attachés
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  13. #13
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.
    Tu as une erreur de division dans la Fonction calc.

    Exemple:
    100 / 14 ne donne pas 7, mais 7,14285714285714

    La cause :
    IIl serait hautement preferable d'utiliser le type Double (decimale flottante) plutot que le type Long (integer).
    Cordialement

    Docmarti.

  14. #14
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Très juste Docmarti, merci !
    Voilà la correction (fichier .xlsm puis zip des sources) :
    Fichiers attachés Fichiers attachés
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  15. #15
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    N'oublie pas qu'à ce jeu, l'usage des décimales est interdit.

    Par exemple, il est interdit de faire :
    6 / 4 = 1,5
    1,5 * 10 = 15

    Il faut tenir compte de cette règle dans ton code.

    Mais, pour pouvoir vérifier l'absence de décimales dans le résultat d'une opération, il faut que le type de variable de ce résultat soit Single ou Double comme le suggère Docmarti.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  16. #16
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Citation Envoyé par Menhir Voir le message
    N'oublie pas qu'à ce jeu, l'usage des décimales est interdit.

    Par exemple, il est interdit de faire :
    6 / 4 = 1,5
    1,5 * 10 = 15

    Il faut tenir compte de cette règle dans ton code.
    J'avais déjà pris en compte cette règle, lorsque le joueur joue et qu'il tente de réaliser une division non entière (ou bien une soustraction dont le résultat est inférieur à 1), un message d'erreur s'affiche à l'utilisateur et l'opération n'est pas prise en compte. De même pour la recherche de solutions (mais sans affichage de message d'erreur bien entendu, pour éviter le ralentissement de la recherche)

    Mais, pour pouvoir vérifier l'absence de décimales dans le résultat d'une opération, il faut que le type de variable de ce résultat soit Single ou Double comme le suggère Docmarti.
    J'ai indiqué dans mon précédent message avoir corrigé l'erreur. Pour des raisons d'efficacité, j'ai 2 fonctions de calcul différentes (qui ne traitent pas les opérations de la même manière), une destinée aux calculs de l'utilisateur (qui était opérationnelle à 100% déjà, le type double était bien pris en compte), et une pour la recherche de solution (dont Docmarti m'a fait remarqué l'erreur, que j'ai d'ores-et-déjà corrigée).

    Mais dans tous les cas, merci pour ta remarque et de te pencher sur mon cas
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  17. #17
    Invité
    Invité(e)
    Par défaut
    bonjour,
    64 32 je vois pas le problème!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Function CreateObjectx86(sProgID)
     
        Static oWnd As Object
        Dim bRunning As Boolean
     
     
        #If Win64 Then
            bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
            If IsEmpty(sProgID) Then
                If bRunning Then oWnd.Close
                Exit Function
            End If
            If Not bRunning Then
                Set oWnd = CreateWindow()
                oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
            End If
            Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
        #Else
            If Not IsEmpty(sProgID) Then Set CreateObjectx86 = CreateObject(sProgID)
        #End If
     
     
    End Function
    Function CreateWindow()
     
     
        ' source http://forum.script-coding.com/viewtopic.php?pid=75356#p75356
        Dim sSignature, oShellWnd, oProc
     
     
        On Error Resume Next
        sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
        CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False
        Do
            For Each oShellWnd In CreateObject("Shell.Application").Windows
                Set CreateWindow = oShellWnd.GetProperty(sSignature)
                If Err.Number = 0 Then Exit Function
                Err.Clear
            Next
        Loop
     
     
    End Function
     
     
     
     
    Sub Init()
    Set JVS = CreateObjectx86("ScriptControl")
    With JVS
       .Language = "JScript"
       .AddCode Jv
    ' Debug.Print .Run("nombres_aleatoires")
    ' Debug.Print .Run("nombre_cible_aleatoire")
    '   Debug.Print .Run("go", "4, 3, 1, 7, 25, 3", 828)
    End With
    End Sub
    Fichiers attachés Fichiers attachés

  18. #18
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Je n'avais pas pensé à l'utilisation de CreateObjectx86, je n'en ai pas l'habitude.

    En effet, vu comme cela ce serait bien plus efficace.
    Par contre, après test, ta fonction javascript de solveur du compte est bon ne fonctionne pas (fais le test avec "1,1,2,4,4,5,828").

    Du coup, je vais essayer de passer ma fonction au format javascript
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

  19. #19
    Invité
    Invité(e)
    Par défaut
    A vrais dire, comme tu le savais, elle n'est pas de moi je l'ai adapté pour la rendre interactive avec vba!

    Mais chez moi ça fonctionne win10 office 2017!

  20. #20
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Points : 505
    Points
    505
    Par défaut
    Oui et comme c'était celle que j'utilisais initialement, cela m'a surpris. Après, peut-être que c'est la méthode initiale qui est erronée dans certains cas particuliers (comme lorsque le maximum pouvant être obtenu avec les 6 chiffres est inférieur à l'objectif par exemple), comme tu peux le voir ci-après :
    Nom : compte bon erroné.JPG
Affichages : 1383
Taille : 126,8 Ko A moins que je ne sois idiot, mais pour moi, 3 + 1 n'a jamais donné 31 et 8 + 31 n'a jamais donné 831.

    De plus, j'ai également amélioré un peu l'algorithme de base, du coup, je vais tenter d'utiliser javascript sur mon algo.
    Sinon, pour information je suis sous Win 10 avec Office 2016.
    Politesse, respect et humilité sont les 3 éléments nécessaires dans une bonne relation d'entraide. Nous faisons cela par plaisir d'aider, ne nous le retirez pas

Discussions similaires

  1. Jeu "Le compte est bon" avec récursivité
    Par elvis54 dans le forum Général Java
    Réponses: 1
    Dernier message: 19/11/2008, 07h50
  2. [Jeu "Le Compte est Bon"] Recherche algorithme
    Par Chriss21 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 29/10/2005, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo