Besoins d'aide sur un programme python

Fermé
RYn_9741 Messages postés 10 Date d'inscription mercredi 26 janvier 2022 Statut Membre Dernière intervention 1 février 2022 - Modifié le 1 févr. 2022 à 19:16
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 - 1 févr. 2022 à 20:05
Salut à tous;

Je suis en première bac NSI et j'ai un programme à faire en python. Je suis novice et le prof nous a donné un exercice à rendre, mais il ne nous a rien expliqué. C'est-à-dire qu'on ne sait rien, jugez par vous même :


Du coup j'aimerais savoir ce que je devrais faire exactement. Si quelqu'un a la gentillesse de m'aider (sur discord ou bien tout autre application). J'ai bien dit "de m'aider", car je ne veux pas les solution, mais je veux pouvoir qu'on m'aiguille.

Je vous remercie d'avance

4 réponses

Whismeril Messages postés 19049 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2024 913
1 févr. 2022 à 18:23
Bonjour

T’aider / t’aiguiller oui, mais il nous faut de quoi « démarrer ».
Voir ici https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
0
RYn_9741 Messages postés 10 Date d'inscription mercredi 26 janvier 2022 Statut Membre Dernière intervention 1 février 2022
1 févr. 2022 à 18:35
justement je n'ai aucune de comment commencer , ca fait littéralement 2h que je suis fixé sur mon pc a essayé de trouver de la doc mais je trouve vraiment rien c'est pour ca que je me tourne vers ccm en espérant que quelqu'un me donne un début
0
Whismeril Messages postés 19049 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2024 913
1 févr. 2022 à 18:52
OK.

L’exercice qui t’es donné n’est pas un exercice pour un primo débutant.
Il faut déjà quelques bases.

Je dirais même que c’est probablement une suite.
Si c’est bien le cas, tu devrais pouvoir au moins appliquer ce qui est écrit dans l’article que je t’ai mis en lien
0
RYn_9741 Messages postés 10 Date d'inscription mercredi 26 janvier 2022 Statut Membre Dernière intervention 1 février 2022
Modifié le 1 févr. 2022 à 19:17
Ok j'ai avancé. J'ai essayé de faire un truc potable pour la fonction
rand_move
et j'ai fait ça, mais je ne l'ai pas testée car il me faut le programme en entier avant.

Voici mon code :

def rand_move(pos):
    legal_moves = []

    for pos in range(9):
        if (pos == 0):
            legal_moves.append(pos)
0
Whismeril Messages postés 19049 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2024 913
1 févr. 2022 à 19:23
As tu déjà eu un exercice sur le tictactoe?

Penses tu que ce que tu as écrit réponde à « à partir de la position p »?
0
RYn_9741 Messages postés 10 Date d'inscription mercredi 26 janvier 2022 Statut Membre Dernière intervention 1 février 2022
1 févr. 2022 à 19:34
Non jamais c'est le premier , non justement ca réponds par rapport a l'arguments de la fonction pos , ou bien je me trompe
0
mamiemando Messages postés 33135 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 juin 2024 7 756
1 févr. 2022 à 20:05
Bonjour RYn_9741

Bienvenue sur le forum.

Remarques préalables

Plusieurs choses avant de répondre à tes questions :
  • Merci de soigner l'orthographe (accents, majuscules, accords...) et la ponctuation.
  • Merci d'éviter les captures d'écran quand un simple copier coller suffit (plus écologique et plus pratique pour tout le monde)
  • Merci d'utiliser les balises de code quand tu partages du code.
  • Merci d'être un peu moins incisif envers ton enseignant, nous n'y sommes pour rien et si tu penses que l'exercice est inadapté, c'est plutôt avec lui d'en discuter qu'avec nous. Je pense aussi que ton enseignant attende que tu viennes lui demander des conseils et de l'aide.


Concernant ton exercice

Tu n'as pas besoin d'écrire le code en entier pour tester une fonction en python. Tu peux tout à fait copier coller ta fonction dans ton interpréteur python et l'appeler pour voir ce qu'elle retourne. Ce sera pour toi l'occasion de tester tes fonctions au fur et à mesure de leur développement.

Sous Windows, l'interpréteur python se lance par exemple avec la commande
python.exe
. Sous Linux il y en a plein, personnellement j'utiliser
ipython3
.

Il existe aussi des outils "graphiques". Ce n'est pas nécessaire mais plus confortable.
  • Que tu sois sous windows ou linux (ou autre chose) tu peux installer et utiliser jupyter lab (le remplaçant de jupyter notebook) qui permet de coder dans ton navigateur et d'exécuter du code python comme dans un interpréteur python.
  • Si tu utilises un IDE (genre pycharm), il est possible de développer ton code et de lancer un interpréteur python (voir les boutons au base de la fenêtre) pour le tester/
  • Quelque soit l'outil graphique considéré, il a besoin d'une distribution python fonctionnelle installée au préalable (par exemple anaconda sous windows).


Ensuite, ton exercice n'est pas évident si tu débutes, mais pas d'affolement.

Le but final de ton exercice est d'énumérer les grilles gagnantes au jeu du tic tac toe (aka morpion).

Pour cela, il va te falloir écrire plusieurs fonctions auxiliaires, que tu combineras à la fin pour faire le programme final. Chaque question te fait écrire chacune de ces fonctions auxiliaires, avant de les rassembler dans la question G. Tu peux donc voir chacune des questions A à F comme de petits exercices indépendants.

Dans ce qui suit, je suppose que l'exercice est demandé pour une grille 3 x 3 mais sache que tout l'exercice se généralise pour des grilles de taille N x N.

Ensuite, j'avoue que la terminologie choisie dans l'exercice n'est pas forcément des plus parlante, alors clarifions-la.
  • Une position
    p
    correspond à une grille (partiellement ou complètement rempli). Il y a plusieurs manières de représenter une grille de morpion. Tu peux indexer les cases de 1 à 9 (mais ce sera peu pratique pour vérifier si un joueur a gagné ou pas) ou utiliser des listes imbriquées de sorte à faire comme si tu avais un tableau 3 x 3. Si tu connais
    numpy
    , tu pourrais aussi utiliser un
    numpy.array
    pour directement créer une matrice 3 x 3.
  • Un mouvement consiste à faire jouer le joueur courant (qui ajoutera dans la grille courante son symbole, soit x soit o). La grille qui en résulte forme une nouvelle position.
  • Une position est gagnante si un joueur parvient à former une ligne horizontale, verticale ou diagonale de longueur 3.
  • J'ai l'impression qu'inverser une position signifie remplacer les x par des o et les o par des x. Ce n'est pas très clair mais vu l'exercice on dirait que c'est ça.
  • Une base désigne un container (par exemple une liste) qui permet de stocker plusieurs positions. Le choix du container sous-jacent (par exemple
    list
    ou
    set
    ) peut influencer sur les performances de ton programme. Si tu décides d'utiliser un
    set
    il faudra que le type associé à une position soit hashable (ce qui est le cas des tuples, mais pas des listes). Si tu ne sais pas ce qu'est un set et/ou un hash, peut être que tu devrais rester sur un modèle un peu moins efficace mais plus facile pour toi (par exemple, en n'utilisant que des listes).


Une fois ces définitions données, l'exercice devrait être plus compréhensible. Reste à voir maintenant comment l'aborder.

a)

Il faut choisir comment tu modélises une position. Ensuite pour trouver la prochaine position, il faut ajouter un symbole x ou o dans une case encore non remplie.

En toute rigueur, il faudrait que la fonction prenne en paramètre le joueur courant pour qu'on sache si c'est un x ou un o qu'il faut ajouter. On peut compter le nombre de x et de o présents dans la grille pour l'inférer, mais en cas d'égalité, on ne sait pas forcément à qui c'est le tour. Vue la suite de l'exercice, ce n'est pas forcément important, cela signifie juste que certains mouvement consécutif ne correspondent pas à quelque chose de "possible" dans une partie normale, mais ça ne veut pas dire que cette position ne peut pas être atteinte dans l'absolu.

Donc en gros :
  • Si le nombre de x et de o présents dans la grille sont égaux, il suffit de placer aléatoirement un x ou un o dans une case choisie aléatoirement parmi les cases vides.
  • Sinon, s'il y a strictement plus de x que de o, alors il faut il faut placer un o dans une case choisie aléatoirement parmi les cases vides.
  • Sinon (S'il y a strictement plus de x que de o), alors il faut il faut placer un x dans une case choisie aléatoirement parmi les cases vides.


b)

Ici il faut écrire une boucle qui va parcourir ta grille afin de vérifier si l'un des joueur a gagné en formant une ligne horizontale, verticale, ou diagonale de longueur 3. Si tu utilises
numpy
extraire une ligne, une colonne ou une diagonale se fait assez facilement. Sinon il faudra faire la vérification avec les boucles for adéquates.

c)

Cette question est un peu plus facile, car il suffit de vérifier si en jouant dans une case vide, le joueur player (donc x ou o) gagne en réutilisant la fonction codée dans la question b.

d)

Voir la définition d'inversion, si tu es arrivé à faire la question b, ce devrait être une formalité, car celle-ci est plutôt plus facile.

e)

Ici, il n'y a rien à faire à part utiliser l'opérateur
in
de python. Tu peux vérifier si un élément
x
appartient à un itérable
c
(liste, set...) en évaluant
x in c
.

f)

Dans cette question aussi, il n'y a rien à faire : si tu utilises une liste ou un set, il suffit d'appeler la méthode adéquate (
c.append(x)
pour les listes,
c.add(x)
pour les sets)

g)

L'exercice n'est pas extrêmement clair sur la manière dont doivent être générées les positions, ni même si elles sont atteignables dans une partie normale. Il serait logique que oui et du coup la fonction
rand_move
prendrait son intérêt. Ceci dit c'est assez discutable comme manière de faire car on n'est pas sûr d'énumérer toutes les positions, et on risque d'en énumérer certaines plusieurs fois. Je pense que l'exercice ne s'embarrasse pas de ce genre de considération car ce serait trop compliqué à ce stade, mais sache que ça peut se faire avec un algorithme de branchement (pour chaque position on évalue récursivement chaque position suivante valide au sens des règles du jeu).

Bref, ici je pense que tu te contentes simplement de partir d'une grille vide, de faire des mouvements aléatoire jusqu'à ce qu'un joueur gagne et d'ajouter la configuration trouvée si elle n'est pas déjà connue.

Je n'ai pas vraiment compris ce que ton enseignant attendait dans son pseudo code. Si tu trouves une position gagnante, la position inversée (en admettant que ma définition soit correcte) est aussi gagnante, et donc on aurait envie d'insérer les deux en base (mais ça n'est pas ce qui est fait dans le pseudo code). Par ailleurs, si une grille est gagnante, la faire pivoter d'un quart de tour ou la renverser par symétrie horizontale ou verticale la laisse gagnante. Cela signifie que quand tu trouves un position gagnantes, tu en trouves en réalité 12 (1 position trouvée + 3 induites par rotation + 2 induites par symétrie) * le nombre de joueurs.

Bref... bon courage pour ton exercice, et n'hésite pas à discuter avec ton enseignant(e) qui sera ravi(e) de te guider :-)
0