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
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
A voir également:
- Besoins d'aide sur un programme python
- Programme demarrage windows 10 - Guide
- Lg non programmé ✓ - Forum TV & Vidéo
- Desinstaller un programme - Guide
- Ce message d'erreur apparaît sur l'ordinateur d'elena. que peut-on dire du programme gwxux ? - Forum logiciel systeme
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
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/
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/
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
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
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
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
Modifié le 1 févr. 2022 à 19:17
Ok j'ai avancé. J'ai essayé de faire un truc potable pour la fonction
Voici mon code :
rand_moveet 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)
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
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 »?
Penses tu que ce que tu as écrit réponde à « à partir de la position p »?
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
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
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
1 févr. 2022 à 20:05
Bonjour RYn_9741
Bienvenue sur le forum.
Remarques préalables
Plusieurs choses avant de répondre à tes questions :
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
Il existe aussi des outils "graphiques". Ce n'est pas nécessaire mais plus confortable.
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 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 :
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
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
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 (
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
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 :-)
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 connaisnumpy
, tu pourrais aussi utiliser unnumpy.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
ouset
) peut influencer sur les performances de ton programme. Si tu décides d'utiliser unset
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
numpyextraire 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
inde python. Tu peux vérifier si un élément
xappartient à 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_moveprendrait 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 :-)
1 févr. 2022 à 18:35