ProPython
Exercice - Jeu de Morpion
11 Mar, 2021
Facile
Prérequis
Bases de Python

Exercice - Jeu de Morpion

Dans cet article, vous allez je l'espère réaliser votre premier programme par vous-même : un jeu de morpion en console, contre l'ordinateur. Cet exercice est destiné aux débutants, et je vous conseille d'essayer de le réaliser sans regarder les éléments de correction, et si jamais vous bloquez vraiment, d'éventuellement jeter un coup d'œil à la correction.

Prérequis

Pour réaliser cet exercice, vous aurez besoin de connaître les listes, les conditions, les boucles, et les fonctions. Si jamais vous avez suivi la formation du site, nous n'avons pas encore parlé des fonctions. Je vais donc en parler rapidement afin que vous puissiez comprendre comment les utiliser.

Les Fonctions

Définition

Une fonction est un peu une sorte de sous-programme écrit dans votre programme. Cela vous permet d'écrire du code que vous pourrez répéter facilement dans votre programme et en y passant des paramètres. Imaginons par exemple que souhaitez programmer un jeu de morpion (tiens tiens…). Vous aimeriez sûrement vérifier à chaque fin de tour d'un joueur si la partie est gagnée, ou terminée si jamais toutes les cases du morpion sont remplies. Vous allez sûrement écrire le même code à deux endroits différents, puisqu'il faut vérifier cela à la fin du tour du joueur 1, mais aussi à la fin du tour du joueur 2. Il est donc judicieux d'écrire une fonction, puisque cela va vous permettre d'écrire votre code une fois, et d'appeler votre fonction partout où vous aurez besoin de vérifier cela.

Ensuite, il faut savoir qu'on peut également passer des paramètres à une fonction. Par exemple, je peux écrire une fonction pour afficher le prénom d'une personne. Pour cela, je passe le prénom en paramètre de la fonction plutôt que de modifier mon code à chaque fois que je souhaite afficher un autre prénom.

Finalement, une fonction peut soit renvoyer une valeur, soit ne rien renvoyer.

Syntaxe

En Python, on utilise le mot-clé def pour déclarer une fonction. Voici donc la syntaxe : def nom_fonction(parametre1, parametre2, ...):. Ensuite, on écrit le code de notre fonction, sans oublier l'indentation (les espaces / la tabulation, pour ceux qui auraient oublié). On peut également préciser des valeurs par défaut pour les paramètres. Attention cependant, les paramètres dont vous souhaitez préciser une valeur par défaut doivent être placés après les paramètres n'ayant pas de valeur par défaut lors de la déclaration de la fonction.

>>> def dire_bonjour(prenom, age=43"):
...    print("Bonjour "+prenom+". Vous avez "+age+"ans.")
...
>>> dire_bonjour("Jean", 48)
Bonjour Jean. Vous avez 48 ans.
>>> dire_bonjour("Jacques")
Bonjour Jacques. Vous avez 43 ans

Si on souhaite écrire une fonction renvoyant une valeur, on utilise le mot-clé return dans le corps de notre fonction.

>>> def addition(a, b):
...    return a + b
>>> addition(2, 5)
7

Evidemment, les fonctions sont des objets très complexes en Python, et il y a bien plus de choses à savoir sur elles. Cependant, dans le cadre de cet exercice, ce qui est plus haut est largement suffisant, nous verrons le reste plus tard !

Les imports

Définition

En Python, vous avez la possibilité d'importer ce qu'on appelle des packages, c'est à dire des bouts de code créés par d'autres utilisateurs, ce qui vous permet d'utiliser des fonctions et des objets sans avoir à les réécrire, si jamais quelqu'un l'a déjà fait. Par exemple, vous souhaitez calculer la racine carrée d'un nombre. Vous pouvez importer le package math, qui contient la fonction sqrt(x), fonction qui vous renvoie la racine carrée de x.

Syntaxe

Pour importer un package, on utilise le mot-clé import suivi du nom du package.

import math

Ensuite, pour utiliser un objet, une fonction, ou n'importe quel élément du package, on utilise . suivi de son nom.

>>> import math
>>> math.sqrt(16)
4

On peut aussi importer des éléments d'une autre façon : en utilisant from, cela permet de spécifier ce que l'on souhaite importer. Par exemple, ci-dessus, en important le package math, j'importe tout ce qu'il contient. En utilisant from, je peux décider d'importer seulement ce dont j'ai besoin, par exemple sqrt. Cependant, cette méthode modifier l'espace de nom, c'est à dire je n'ai plus besoin de préciser que sqrt vient du package maths. En utilisant cette méthode, je peux même importer sqrt avec un nom différent, en utilisant le mot-clé as.

>>> from math import sqrt
>>> sqrt(16)  # Et non math.sqrt(16)
4
>>> from math import exp as exponentielle
>>> exponentielle(3)
20.085536923187668

Autre chose à savoir également, même si ce n'est pas nécessaire dans le cadre de l'exercice : on peut séparer notre code en plusieurs fichiers et importer du code de nos propres fichiers de la même façon que ci-dessus. Par exemple, on crée un ficher foo.py dans lequel on écrit une fonction dire_bonjour. Si ce fichier est situé au même endroit que votre fichier main.py dans votre projet, vous pouvez écrire import foo et utiliser votre fonction dire_bonjour dans le fichier main.py de cette façon : foo.dire_bonjour(). Si jamais foo.py est situé dans un répertoire, à la place vous écrirez import nom_du_repertoire.foo, et nom_du_repertoire.foo.dire_bonjour() pour exécuter votre fonction.

Exercice

On va maintenant pouvoir commencer l'exercice. Tout d'abord, il faut commencer par définir clairement l'énoncé.

Enoncé

  • On souhaite réaliser un jeu de morpion en console, jouable seul contre l'ordinateur.
  • On modélise le plateau de jeu comme une grille de 3 cases par 3 cases, et dont les cases sont numérotées de 1 à 9 afin de demander au joueur dans quelle case il souhaite jouer.
  • L'affichage en console doit ressembler à l'image ci-dessus, bien sûr les numéros ne seront pas visibles, et seront remplacés par des X ou des O en fonction du joueur.
  • Il n'est pas possible de jouer sur une case déjà remplie (évidemment, mais il vaut mieux le préciser !).
  • Il n'y a pas d'intelligence artificielle, l'ordinateur joue des coups aléatoires.

Conseils

  • Une façon simple de modéliser le plateau est d'utiliser une liste de 9 chaînes de caractères, pouvant être soit vides, soit "X", soit "O". On peut également utiliser un dictionnaire, dans ce cas les clés sont les numéros des cases du plateau, et les valeurs sont les valeurs des cases.
board = [
    "X", "", "O",
    "", X"", "O",
    "", "", ""
]

# Ou bien :

board = {
    1: "X", 2: "", 3: "O",
    4: "", 5: "X", 6: "O",
    7: "", 8: "", 9: ""
}
  • Pour générer des nombres aléatoires, le plus simple est d'utiliser la fonction randint(a, b) du package random, qui permet de générer un entier entre a et b (inclus).
  • La trame du jeu doit ressembler à ceci, dans l'ordre :
    • Dessin du plateau de jeu
    • On demande au joueur quelle case il souhaite jouer
    • Mise à jour du plateau en fonction de la case choisie
    • Vérification du plateau pour savoir si le joueur a gagné ou si la partie est terminée
    • L'ordinateur choisit une case aléatoire
    • Mise à jour du plateau en fonction de la case choisie
    • Vérification du plateau pour savoir si l'ordi a gagné ou si la partie est terminée
    • Retour à la première étape jusqu'à ce que qu'il y ait un gagnant ou que le jeu soit terminé

Vous avez maintenant tous les éléments nécessaires pour réussir à programmer ce jeu ! Si jamais vous êtes bloqués, essayez de revenir sur les articles précédents pour réviser les notions qui bloquent avant de regarder les éléments de correction, il n'y a rien de mieux pour s'entrainer que d'essayer de faire ceci sans la correction.

Eléments de correction

Vous êtes bloqués ? Retrouvez ici quelques éléments pour vous aider à avancer, sans réellement spoiler toute la correction !

Dessin du plateau
Tour du joueur
Tour de l'ordinateur
Vérification du plateau
Code final

Le mot de la fin

Voilà, c'est tout pour ce petit exercice, qui vous aura permis de vous entrainer un peu avant de passer à la suite. Pour ceux qui n'auraient pas réussi, l'essentiel est de bien comprendre la correction. Vous pouvez aussi réviser un peu en repassant sur les précédents articles : Introduction, Syntaxe et Fonctions de base et Listes et Dictionnaires.

Si vous avez des questions, ou que vous avez besoin de précisions sur la correction ou sur l'exercice, n'hésitez-pas à laisser un commentaire, ou bien contactez-moi par mail : contact@propython.fr.

Merci à tous d'avoir lu, on se retrouve prochainement pour la suite de votre apprentissage de Python !

Laisser un commentaire

Premium - 15€/mois

L'accès à des articles inédits, à une multitude de ressources, à de nouveaux projets, mais également à des vidéos explicatives, découvrez ici pourquoi passer premium.

Articles liés

Catégories

Ressources

Retrouvez une collection de ressources (des scripts, des fiches résumé, des images...) liées aux articles du blog ou au Python.
Voir

Contact

contact@propython.fr
Se connecter pour envoyer un message directement depuis le site.

Navigation

AccueilSe connecterCréer un compteRessourcesPremium

Catégories

Pages légales

Politique de confidentialitéMentions légalesConditions générales de vente