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

Langage PHP Discussion :

Cherche à développer un outil d'aide au scrabble


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Cherche à développer un outil d'aide au scrabble
    Bonjour,

    Je suis en train de développer un petit script d'aide au scrabble, ce script se présente sous la forme d'un petit formulaire dans lequel on défini le nombre de lettres que doit comporter le mot que l'on choisi, l'ensemble des lettres possibles et les lettres sont on veut pas, ce formulaire se base sur un dictionnaire de mots et une fois qu'on a tout rempli, ça nous donne une liste.

    Voici la page sur laquelle le formulaire est en fonctionnement mais qui ne fonctionne pas :
    https://thierrychabenat.fr/scrabble/formulaire.html

    Le
    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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
      <title>Formulaire de recherche de mots</title>
    </head>
    <body>
      <form id="monFormulaire" action="recherche.php" method="post" enctype="multipart/form-data">
        <label for="nombre">Nombre de lettres</label>
        <input type="number" id="nombre" name="nombre" min="1">
        <label for="possibles">Lettres possibles</label>
        <input type="text" id="possibles" name="possibles" value="abcdefghijklmnopqrstuvwxyz">
        <label for="impossibles">Lettres impossibles</label>
        <input type="text" id="impossibles" name="impossibles">
        <input type="file" id="fichier" name="fichier">
        <input type="submit" value="Rechercher">
      </form>
      <div id="resultats"></div>
    </body>
    </html>

    Le
    Code PHP : 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
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $nombre = $_POST["nombre"];
      $possibles = strtolower($_POST["possibles"]);
      $impossibles = strtolower($_POST["impossibles"]);
     
      $mots = [];
     
      if (isset($_FILES["fichier"]) && $_FILES["fichier"]["error"] == 0) {
        $fichier = $_FILES["fichier"]["tmp_name"];
        $destination = "/path/to/destination";
        move_uploaded_file($fichier, $destination);
     
      $fichier = "../scrabble/dictionnaire.txt";
        $contenu = file_get_contents($fichier);
        $lignes = explode("\n", $contenu);
     
        foreach ($lignes as $ligne) {
          $mot = trim($ligne);
     
          if (mb_strlen($mot) == $nombre && !preg_match("/[zZ]/", $mot) && preg_match("/^[$possibles]*$/u", $mot)) {
            $mots[] = $mot;
          }
        }
     
        if (!empty($mots)) {
          echo "Résultats :<br>";
          foreach ($mots as $mot) {
            echo "$mot<br>";
          }
        } else {
          echo "Aucun mot correspondant aux critères trouvés.";
        }
      } else {
        echo "Veuillez sélectionner un fichier.";
      }
    }
     
    ?>

    Comme vous pouvez le constater, ça ne fonctionne pas et j'ai beau m'arracher les cheveux, je ne comprends pas pourquoi, auriez-vous une idée sur la question ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Vérifie les valeurs de upload_max_filesize et post_max_size dans ton php.ini. Vérifie aussi que tu as les droits nécessaires pour accéder au répertoire tmp (0777) et à celui de destination.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Les répertoires ne correspondent pas, est-ce que c'est normal?
    $destination = "/path/to/destination";     // <--
    move_uploaded_file($fichier, $destination);
     
    $fichier = "../scrabble/dictionnaire.txt"; // <--
    Quelque soit l'origine du problème, isole le pour le résoudre (fait un simple formulaire de téléchargement de fichier sans rien d'autre et regarde ce qui se passe).

    Quelques remarques:
    • Pourquoi charger un dictionnaire à chaque fois? À à ma connaissance il n'y a pas 150 dictionnaires de scrabble, et ce serait plus simple de mettre le fichier une fois pour toute sur ton serveur, et encore mieux de placer les mots dans une base de données. (Pour info, mon fichier dictionnaire de scrabble français fait environ 4.2 Mo pour 378989 entrées toutes en majuscules séparées par \n).
    • Au scrabble, les accents, cédilles et la casse ne sont pas pris en compte. Ça vaut aussi bien pour le contenu du dictionnaire que pour l'entrée utilisateur. Partant de ce principe, tu t'épargnerais la variante multibyte de strlen et le modificateur u dans la regex qui ne vont pas accélérer les choses.
    • Elle t'a fait quoi la lettre Z?
    • Il y a plus simple que de faire successivement un file_get_contents, un explode, un foreach, un trim puis un filtrage selon conditions, c'est d'utiliser l'instruction file avec l'option FILE_IGNORE_NEW_LINES et d'utiliser array_filter. Néanmoins, procéder de cette manière t'oblige à charger tout le fichier dans un tableau, ce qui représente un bon gros tableau qui occupe pas mal de mémoire pour un fichier de 378989 entrées. L'alternative serait de le lire ligne par ligne (avec stream_get_contents) en ne retenant que celles qui correspondent aux critères. Le plus performant reste l'utilisation d'une base de données.

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai revu mon code, ça a l'air de mieux fonctionner, j'ai modifié mon dictionnaire en supprimant tous les caractères superflus pour ne laisser que les mots.
    Je t'avouerai que suis nul à chier en code, après, je suis d'accord qu'avec une base de donnée, ça serait mieux mais ça complexifie les choses, je maîtrise pas du tout.

    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
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $nombre = $_POST["nombre"];
      $possibles = strtolower($_POST["possibles"]);
      $impossibles = strtolower($_POST["impossibles"]);
     
      $mots = [];
     
      if (isset($_FILES["fichier"]) && $_FILES["fichier"]["error"] == 0) {
        $fichier = $_FILES["fichier"]["tmp_name"];
     
        // Ouvre le fichier en lecture
        $handle = fopen($fichier, "r");
     
        if ($handle) {
          while (($mot = fgets($handle)) !== false) {
            $mot = trim($mot);
     
            // Vérifie les critères
           if (strlen($mot) == $nombre && !strpbrk($mot, $impossibles) && strpbrk($mot, $possibles) !== false) {
        $mots[] = $mot;
    }
     
          }
     
          fclose($handle);
        }
     
        if (!empty($mots)) {
          echo "Résultats :<br>";
          foreach ($mots as $mot) {
            echo "$mot<br>";
          }
        } else {
          echo "Aucun mot correspondant aux critères trouvés.";
        }
      } else {
        echo "Veuillez sélectionner un fichier.";
      }
    }
    ?>

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Content de voir que ça fonctionne, mais une fois encore, pourquoi est-ce que tu t'embêtes à uploader ton dictionnaire avec ton formulaire, place ton dictionnaire dans l'arborescence de ton site une bonne fois pour toute, upload le avec filezilla (ou autre).

    Je me suis trompé dans mon précédent message, c'est stream_get_line (à utiliser à la place de fgets) et pas stream_get_contents. L'avantage par rapport à fgets c'est qu'il te fournit la ligne sans le saut de ligne (si tu lui précise en paramètre) et t'évite d'utiliser trim ensuite.

    Privilégie les comparaisons strictes === quand c'est possible, c'est plus claire et plus rapide.

    ...je suis d'accord qu'avec une base de donnée, ça serait mieux mais ça complexifie les choses, je maîtrise pas du tout...
    Maintenant que tu as une V1 fonctionnelle, rien ne t'empêche de tenter le coup.

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai réglé mon problème de d'upload de de mon dictionnaire, là, par contre j'aimerai apporter une petite modification à mon code mais j'arrive à rien aujourd'hui :

    J'aimerai ajouter la possibilité d'ajouter des lettres de début et des lettres de fin dans mon formulaire car pour l'instant, on peut chercher des mots en tapant une lettre de début et une lettre de fin.
    Comment je peux faire ça ?

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Si j'ai bien compris, tu veux pouvoir préciser plusieurs lettres comme première lettre possible et idem pour la fin.

    Avec preg_match mais dans ce cas tu dois vérifier que le champ "lettres début" n'est pas vide avant de faire le test, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (!empty($lettresdebut) && !preg_match('~\A [' . preg_quote($lettresdebut, '~') . '] ~x', $mot)) {
        continue; // on saute au prochain mot de la boucle foreach
    }
     
    if (!empty($lettresfin) && !preg_match('~ [' . preg_quote($lettresfin, '~') . '] \z ~x', $mot)) {
        continue; // on saute au prochain mot de la boucle foreach
    }
    (les crochets délimitent une classe de caractères, \A et \z sont les ancres de début et fin de chaîne, et x permet d'ignorer les espaces dans la pattern.)
    Tu peux aussi extraire la première lettre du mot et vérifier qu'elle est présente dans $lettresdebut avec strpos.

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Ce que j'aimerai idéalement, c'est un peu ce qu'on a sur ce site :

    https://words.dbbeat.com/recherche/m...vec-7-lettres/

    avec en plus les quelques fonctionnalités de mon script.
    C'est pas évident

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Je ne vois pas où est la difficulté, à partir de PHP 8, tu as les fonctions str_starts_with et str_ends_with qui font trés bien l'affaire.

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677
    Par défaut
    Citation Envoyé par chabgyver Voir le message
    avec en plus les quelques fonctionnalités de mon script.
    C'est pas évident
    c'est la partie algorithme ou la partie codage qui vous pose souci ?
    la théorie informatique dit que si un algorithme peut être exécuté dans un langage de programmation alors il peut l'être dans n'importe lequel et donc en php.

    en ce qui concerne les fonctionnalités dont vous avez parlé, cela me fait penser à ce site :
    https://www.motsavec.fr/

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    @mathieu
    C'est exactement ça.
    Je pense que ce site utilise sans doute une base de donnée, ça serait peut-être plus simple, encore que, je suis tellement nul en code que ça me paraît hors de portée.
    En tout cas merci pour le lien.
    Je vous explique pourquoi je veux utiliser ce genre d'outil, j'ai un compte sur Binance et il y a tous les jours un jeu qui consiste à trouver des mots composé d'un certain nombre de lettres, on a 6 chances, si on trouve tous les mots, on gagne des points qui donne sans doute droit à quelque chose de sympa, le problème est que je ne suis pas anglophone et le jeu s'adresse à un public anglophone, c'est pourquoi je voulais un outil pour m'aider un peu.

  11. #11
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677

  12. #12
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2023
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2023
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Messieurs, vous m'avez aidé dans mon projet, je ne suis pas allé jusqu'au bout mais je tenais quand même à vous remercier et à vous présenter mes meilleurs voeux pour cette nouvelle année qui je l'espère sera enrichissante à tous points de vue.

    Je vais cocher la case "résolu".
    A bientôt et encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2006, 16h51
  2. Outil d'aide à la création d'une DTD
    Par Elmilouse dans le forum Valider
    Réponses: 1
    Dernier message: 28/02/2006, 01h56

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