Mini-projet : Tic Tac Toe

Objectifs

Ecrire un programme Python permettant à 2 joueurs de jouer au tic tac toe.

Contraintes

Le programme principal (hors fonctions et appel de bibliothèque) ne devra pas faire plus de 25 lignes. Le programme devra donc être séparé en plusieurs fonctions. Vous êtes libre de suivre les consignes données pour la création de fonction (« Guide de consigne » un peu plus bas dans la page) ou bien d’effectuer votre propre programme avec vos propres fonctions.

A chaque fois que l’on demande à l’utilisateur de rentrer un choix de case, si ce choix n’est pas possible alors la demande sera réitérée.

Le déroulement du jeu lors de l’exécution du programme devra s’effectuer comme ci-dessous. Le même affichage doit être respecté.

Pour aller plus loin (et avoir une meilleure note…) vous pouvez ajouter des extensions à votre jeu.

Extensions possibles

Guide de consignes

Ce guide vous permettra de programmer des fonctions utiles vous atteindre l’objectif donné.

Fonction de création des joueurs

Créer une fonction « creation_joueur » qui demande à l’utilisateur de rentrer le pseudo du joueur 1 puis du joueur 2.
Le pseudo du joueur 1 sera stocké dans la variable j1.
Le pseudo du joueur 1 sera stocké dans la variable j2.
La fonction retournera les variables j1 et j2.

Ci-dessous un exemple d’appel de cette fonction dans la console.

Fonction de simulation d’un toss (pile ou face)

Importer la bibliothèque « random » et « time ».
Créer une fonction « toss » qui prend en argument j1 et j2 (chaine de caractères correspondants aux pseudos des joueurs lors de l’appel de cette fonction).
Cette fonction simulera un jeu du « pile ou face » pour savoir qui a la main.
Un chiffre aléatoire est tiré grâce à la fonction « randint » de la bibliothèque random. Soit 0 pour pile, soit 1 pour face.
La fonction demande au joueur 1 de rentrer soit « pile » soit « face ».
Si la réponse n’est ni « pile » ni « face » la fonction redemandera la réponse du joueur.
Lorsque le joueur 1 à donné sa réponse la fonction effectuera un décompte « 3 », « 2 », « 1 » espacé d’une seconde chacun grâce à la fonction sleep() de la bibliothèque time.
Si le joueur 1 trouve le bon résultat on affiche celui-ci et la fonction retournera dans l’ordre la variable j1 (joueur qui a donc la main) puis j2.
Si le joueur 1 ne trouve pas le bon résultat on affiche celui-ci et la fonction retournera dans l’ordre la variable j2 (joueur qui a donc la main) puis j1.
Cette fonction permet de déterminer qui commence avec les pions « X ».

Ci-dessous un exemple d’appel de cette fonction dans la console.

Fonction d’affichage de la grille de jeu

La grille de jeu sera représentée grâce à une liste de liste (tableau à 2 dimensions) et s’initialisera comme ceci :

grille = [["#","#","#"],["#","#","#"],["#","#","#"]]

Créer une fonction « affichage » qui prend en argument une liste de liste g et qui permet de l’afficher dans la console sous la même forme que dans l’exemple ci-dessous avec les repères pour chaque ligne et chaque colonne.

Fonction de choix d’une case

Créer une fonction « choisir » qui prend en argument j (la chaine de caractère d’un pseudo des joueurs) et g (la grille). Cette fonction permettra au joueur j de choisir une case parmi celle existante.
Si la case choisie est déjà prise dans la grille où n’est pas valide (ex : « A3 », « D1 », « A11 », « 1A », etc.) le joueur doit choisir une autre case.

Pour vérifier si le choix est valide, on peut créer deux tableaux comme ci-dessous et vérifier si le premier caractère du choix de l’utilisateur est dans la liste « ligne », si le deuxième dans la liste « colonne » et si la choix est composé de seulement 2 caractères :

ligne = ["A","B","C"]
colonne = ["0","1","2"]

Par exemple pour vérifier qu’un élément « element » est présent dans une liste « liste » on peut utiliser la condition suivante :

if element in liste :

Vous pouvez tester le code suivant à part pour voir son fonctionnement :

liste = ["A","B","1","2"]
element = input("Vérifier la présence de l'élément suivant dans la liste :")

if element in liste :
   print(element, "est présent dans la liste.")
else :
   print(element, "non présent dans la liste.")

Pour vérifier si la case choisie n’est pas déjà utilisé il faut regarder dans la grille si elle est différente de « # ». Il faut donc passer du caractère représentant la ligne à un numéro représentant l’index de la ligne de la grille. Pour cela on peut utiliser la fonction index.

test=ligne.index("A")

Cette commande permettra de retourner la valeur « 0 ».

Fonction de positionnement d’un pion

Créer une fonction « positionner » qui prend en argument g (la grille de jeu), p (le pion du joueur : soit « X », soit « O ») et c (la case choisit par l’utilisateur dans la fonction précédente). Cette fonction doit permettre de placer le pion p dans la grille de jeu g sur la case c.

La fonction retournera alors la grille mise à jour.

Au passage vous aurez remarqué que sur cet exemple on construit la grille 3×3 avec une autre technique. On dit alors que cette liste est créée par « compréhension ». Cela permet de gagner en nombre de ligne de code et d’être plus concis.

Fonction de test de victoire

Créer une fonction « test_victoire » qui prend en argument g (la grille de jeu) et p (le pion du joueur actuel : soit « X », soit « O »). Cette fonction doit parcourir la grille de jeu g pour vérifier si il y a une victoire ou non d’un joueur en vérifiant si 3 pions p sont alignés.

Extensions

Vous pouvez choisir d’effectuer tout ou une partie de ces extensions ou bien de créer vous même vos propres extensions de programme.

Menu

Créer un menu de départ pour permettre à l’utilisateur de choisir différentes options.

En fonction de ce que l’utilisateur fait comme choix il sera redirigé vers une partie du programme.

Changement de taille de la grille

Créer une fonction permettant d’adapter la taille de la grille en fonction de ce que souhaite l’utilisateur. L’utilisateur pourra aussi choisir le nombre de pion qui devront être aligné pour remporter la partie.

On se limitera à une grille carré allant de 3×3 à 9×9 cases et le nombre de pion aligné pour gagner devra être forcément inférieur à la taille de la grille.

Les fonctions de jeu devront alors prendre en compte cette grille. Le travail le plus compliqué est alors d’adapter la fonction qui permet de vérifier si il y a un gagnant.

IA

Créer plusieurs fonctions qui permettent de faire jouer l’ordinateur au lieu d’un joueur réel. Vous pouvez dans un premier temps créer un mode facile où l’ordinateur choisit aléatoirement une case parmi celle disponible.