Jeu du morpion

Jeu du morpion

Le jeu se joue à la console entre deux joueurs qui entrent alternativement soit le caractère X, soit le caractère O

Un joueur gagne s'il réussit à avoir un alignement sur une des lignes, ou une des colonnes, ou une des diagonales

Si au bout des neuf coups joués il n'y a pas d'alignement, le match est considéré comme nul

Le but de ce projet, au delà de coder un jeu de morpion, est de comprendre l'intérêt de la programmation modulaire et des tests

Dans l'E.N.T vous a été fourni deux fichiers, le fichier tictac.py et morpion.py

Pourquoi deux fichiers ?

Le fichier tictac.py doit contenir toutes les fonctions qui permettent de jouer à la console le jeu du Morpion

Le module doctest importé dans le fichier tictac.py permet de tester les fonctions une par une

Ensuite une fois les tests terminés on peut jouer en exécutant le fichier morpion.py qui importe le module tictac.py

Vous devez rendre pour le 14/11/19 le fichier tictac_VOTRENOM.py dûment complété (on explique plus bas ce qui est attendu)

Attendus

Il convient de suivre pas à pas et scrupuleusement les questions suivantes pour la mise au point du projet
  1. En adaptant la fonction déjà donnée alignementLigne(tableau,numLigne) définir la fonction alignementColonne(tableau,numColonne)
  2. En adaptant la documentation de la fonction alignementLigne(tableau,numLigne) écrire celle de la fonction alignementColonne(tableau,numColonne)

    Puis ajouter les deux lignes de tests suivants avant la fin de la documentation '''

    Attention! Il y a un espace entre >>> et alignementColonne(...)

    Que signifient ces deux lignes ?

    Après le symbole >>> le module doctest va exécuter la fonction alignementColonne(tableau,numColonne) sur le cas particulier où la valeur de plateau est [[ '#','#','O'],['X','X','O'],['#','O','O']] et la valeur de numColonne est 2 et comparer le résultat qu'il a obtenu avec le résultat espéré que vous avez mis juste en dessous c'est à dire True

    En effet sur ce cas particulier il y a un alignement dans la colonne numéro 2 où il n'y a que des O

    S'il obtient le même résultat que celui que vous avez mis alors il dit que le test est ok

  3. Ensuite si vous exécutez le fichier tictac.py le module doctest exécutera les tests intégrés dans la documentation de la fonction alignementColonne(tableau,numColonne) et vous devez observez ceci au début du rapport de test si tout est ok

    Cependant à la fin du rapport de tests on observe aussi que beaucoup de fonctions n'ont pas été testées

    C'est normal certaines n'ont pas été définies et d'autres comme affichePlateau(plateau) qui retourne None ne seront pas testées

    A la fin de la mise au point du projet vous devrez avoir comme rapport de tests

    Le message "Test passed" vous assure maintenant que si vos exemples de test ont bien été choisis votre programme est "presque" correct

    Il reste peut-être des erreurs mais la méthode que vous avez utilisé en a éliminé un grand nombre au cours des tests

  4. Pour voir si vous avez compris, ajoutez un exemple de test à la fonction alignementColonne(...), exécutez le fichier et observez
  5. Documenter, définir et tester la fonction alignementColonnes(plateau) (regarder l'exemple de alignementLignes(plateau))
  6. Documenter, définir et tester les fonctions alignementDiagonale1(plateau) et alignementDiagonale2(plateau)
  7. Documenter, définir et tester la fonction alignementDiagonales(plateau)
  8. Documenter, définir et tester la fonction alignement(plateau) qui retourne True s'il y a un alignement dans une des trois lignes ou une des trois colonnes ou une des deux diagonales, False sinon
  9. La fonction sontValides(plateau,x,y) est déjà documentée avec des tests. Il reste à la définir et à la tester. A quoi sert cette fonction ?

    Avant d'entrer un caractère 'O' ou 'X' le joueur doit préciser en quel endroit du plateau il veut mettre le caractère et cet endroit est repéré par des coordonnées (x,y) où x et y sont deux entiers

    (x,y) sont valides si 0 <= x <= 2 et 0 <= y <= 2 et si plateau[x][y] == '#'

    On ne traitera pas le cas où l'utilisateur entre n'importe quoi à la place de deux entiers

    Tester sontValides(plateau,x,y)

  10. De même la fonction estValide(car,numJoueur) est déjà documentée, elle sert à contrôler que le joueur entre un caractère au clavier conforme à son numéro numJoueur 0 ou 1

    Définir la fonction estValide(car,numJoueur)

    Tester la fonction estValide(car,numJoueur)

  11. La fonction partieEstFinie(plateau,nbCoups) est déjà documentée avec des exemples de tests. Bien comprendre la documentation pour définir cette fonction

    Tester

  12. A ce stade le jeu est presque fini d'être mis au point et les deux dernières fonctions jouer(plateau,numJoueur) et unePartie(plateau) seront testées en exécutant morpion.py

    La fonction jouer(plateau,numJoueur) consiste dans un premier temps à, tant que les coordonnées entrées par un joueur ne sont pas valides, à lui demander d'entrer les coordonnées par l'instruction

    
    lig,col = tuple(input("NumLigne,NumColonne ? -->  "))
    
    

    Dans un second temps, une fois que les coordonnées sont valides, on demande à l'utilisateur d'entrer un caractère conforme à son numéro de joueur numJoueur tant que le caractère entré n'est pas conforme à son numéro

    
    car = input("Entrez votre caractère --> ")
    
    

    Une fois que les coordonnées sont valides et le caractère conforme au numéro de joueur on peut faire l'affectation

    
    plateau[lig][col] = car
    
    
  13. Enfin il reste à définir la fonction unePartie(plateau)

    Tant que la partie n'est pas finie on fait jouer un joueur de numéro numJoueur avec la fonction jouer(plateau,numJoueur)

    On fait évoluer le numéro du joueur numJoueur à chaque tour par l'instruction

    
    numJoueur = (numJoueur + 1) % 2
    
    

    Enfin pour que le jeu soit compréhensible on demande à ce qu'il y ait un affichage dans la console :

    • du plateau de jeu à chaque tour
    • un message pour annoncer le tour de X ou O
    • l'affichage du nombre de coups déjà joués

    A la fin du jeu on demande à ce que soit affiché soit un message disant quel joueur a gagné X ou O

    soit un message annonçant un match nul

  14. Arrivé à ce stade vous avez fini !