Scrabble (niveau première)

Romain -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je dois créer un Scrabble pour mon devoir de nsi, mais je suis perdu. Le prof nous a donné un code avec des fonctions à compléter, quelqu'un pourrait m'aider ? (il faut compléter les 4 fonctions mises entre guillemets).

scrabble={"A":1,"B":3,"C":3,"D":2,"E":1,"F":4,"G":2,"H":4,"I":1,"J":8,"K":10,"L":1,"M":2,"N":1,"O":1,"P":3,"Q":8,"R":1,"S":1,"T":1,"U":1,"V":4,"W":10,"X":10,"Y":10,"Z":10}

def points(mot):
    """ Fonction retournant le nombre de points au scrabble de la chaine de caractères mot """
    pt = 0
    for lettre in mot :
        pt = pt + scrabble[lettre]
    return pt

def dico_scrabble(fichier):
    """ Fonction retournant un dictionnaire dico ayant pour clé le nombre de lettre et pour valeur un dictionnaire
        associant un mot à son nombre de point au scrabble """
    dico = {n : {} for n in range(2,16)}    # on initialise le dictionnaire pour des mots de 2 à 15 caractères
    f = open(fichier)                       # on ouvre le fichier
    for ligne in f:                         # on parcourt le fichier ligne par ligne
        mot = ligne.strip()                 # on nettoie chaque ligne des caractères parasites type retour de ligne \n
                                            # on stocke dans dico le nombre de point de mot au bon endroit ... à compléter
    f.close()
    return dico

def solutions(main,n):
    """ Fonction retournant une liste sol de tuple (mot,valeur) autorisés au scrabble pour des mots de n lettres pris dans une main donnée"""
    sol = []
    for mot in mots[n]:                     # Pour chaque mot de n lettres autorisés
        dispo = list(main)                  # Liste des lettres de la main disponible
        for lettre in mot :                 # Pour chaque lettre du mot
                                            # Si la lettre est disponible  
                                            # alors la retirée des lettres disponible                
                                            # sinon arreté la boucle et passer au mot suivant ... à compléter
                
        else :                              # Si toutes les lettres du mot sont disponible  
                                            # ajouter à la liste sol le tuple (mot,valeur) ... à compléter
    return sol
            
def meilleur_coup(main):
    """ Fonction retournant un dictionnaire rep associant à chaque nombre de lettre un tuple (mot,valeur) tel que
        mot est le meilleur coup à jouer avec n lettres de main et valeur le nombre de points au scrabble rapporté par mot """
    rep ={}
    for n in range(2,8):                    # Pour chaque nombre n de lettre jouable
                                            # Récupère la liste des  tuple (mot,valeur) de n lettres et autorisés au scrabble ... à compléter
                                            # Détermine le mot de valeur maximal et ajoute le au dictionnaire rep ... à compléter
            
    return rep

fichier = 'scrabble.txt'
mots = dico_scrabble(fichier)
main = input("Votre main : ").upper()
best = meilleur_coup(main)
print(best)

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Bonjour,

    Explication du sujet

    Si j'ai bien compris ton sujet, le but est de trouver dans un fichier
    scrabble.txt
    (qui contient vu le programme les mots autorisés au scrabble) les mots dont la taille est comprise entre 2 et 16 pouvant être posés étant donnée un ensemble de lettres défini dans
    main
    .

    Au scrabble, le score d'un mot est obtenu en sommant les valeurs de ses lettres (voir variable
    scrabble
    et la fonction
    points
    ).

    Dans ton exercice, on ignore complètement le plateau et donc les mots éventuellement déjà posés. Ça a du sens si c'est le premier mot qu'on pose, mais si on voulait faire une intelligence artificielle pour les coups suivants, il faudrait quelque chose d'un peu plus compliqué (pour rappel, au scrabble, les mots suivants sont raccrochés à au moins un mot existant, ce qui donne l'opportunité de réutiliser une ou plusieurs lettres).Toutes ces difficultés semblent ignorées dans ton exercice.

    Pour démarrer

    Pour que ton programme soit exécutable et que tu vois où en est le squelette qu'on t'a proposé, tu pourrais remplir les "trous" par avec des
    print
    qui affiche le contenu des variables significatives.

    Par exemple, ligne 40, deux variables sont significatives (
    main
    et
    n
    ), donc pour les afficher, on peut ajouter :
        for n in range(2,8): 
            print(f"main = {main}")
            print(f"n = {n}")


    Veille à respecter l'indentation, en Python, c'est important !

    Étant donné ces variables, à toi d'écrire les bonnes instructions pour réaliser ce qui est écrit en commentaire.

    Si tu es toujours bloqué

    Il faudrait joindre le fichier
    scrabble.txt
    (au moins les premières lignes, s'il est long) et nous dire ce qui te bloque.

    Bonne chance
    0
  2. Romain
     
    Re, merci de ton aide.
    En fait, juste avant d'en venir à ma question, j'aimerai contextualiser. Nous (ma classe et moi) venons d'entrer en classe de première, et notre professeur nous a donner ce devoir qui à notre niveau paraît compliqué. Cela fait de nombreux jours que j'essaie de faire ce devoir, sans succès, mais je viens enfin d'accomplir la première fonction toute à l'heure.
    J'aimerai finalement demander ici une aide très approfondie des 3 autres fonctions afin de comprendre et d'ensuite pouvoir faire ce devoir.

    Merci d'avance pour votre aide.
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
       
      Dans ce cas il faut poser des questions plus précises, en prenant les points un par un. Quelle fonction / qu'as-tu fait / qu'est-ce qui te bloque ?
      0