diff --git a/doc/FonctionTest.markdown b/doc/FonctionTest.markdown
new file mode 100644
index 0000000000000000000000000000000000000000..fe9c7587834255f2e7286a53dd98c2c134374e80
--- /dev/null
+++ b/doc/FonctionTest.markdown
@@ -0,0 +1,19 @@
+# Fonctions Test
+Fonctions qui servent pour tester le programme: ces fonctions sont appelées par le programme principal.
+
+## play()
+Jouer une partie joueur vs joueur, sert pour tester si les règles sont bien implementées dans le programme
+
+## playout()
+Jouer une partie joueur vs ordi: programme final. Comment ça marche ?
+
+- Créer une instance du jeu
+- Créer une instance du mcts pour ce jeu: `auto mctsPlayer = mcts::make_mcts_two_players(JEU, 5000, 0.3, 4); `
+  - 5000: temps de reflexion en ms pour chaque tour du jeu
+  - 0.3 Facteur d'exploration (?)
+  - 4 nombre de visites avant expansion: un noeud sera visité 4 fois avant que son expansion soit faite dans l'arbre
+- Tant que le jeu n'est pas fini, si c'est le tour de l'ordi
+  - Soit dire à l'ordi ce qu'on a choisi comme coup(?), soit lui faire un `mctsPlayer.reset()` qui efface tout l'arbre.
+  - Demander à l'ordi de choisir un coup `mctsPlayer.select_move();`
+  - Jouer ce coup
+- Quand le jeu est fini dire à l'humain qu'il a perdu (parce que le MCTS est trop fort)
\ No newline at end of file
diff --git a/doc/GameInterface.markdown b/doc/GameInterface.markdown
new file mode 100644
index 0000000000000000000000000000000000000000..2a9f8c9984c1d66c3b376b4c419fd974d806228f
--- /dev/null
+++ b/doc/GameInterface.markdown
@@ -0,0 +1,114 @@
+# Game interface (game/game.hpp)
+Interface qui décrit un jeu, un jeu doit implémenter les fonctions décrites dans cette interface
+
+Comment implementer l'interface: squelette du fichier .h du jeu
+
+```C++
+namespace game
+{
+	struct JEU_state //structure qui décrit un état du jeu
+	{
+		[...]
+	}
+	
+	class JEU : public game<JEU_state>
+	{
+		public:
+			JEU();
+			JEU(const JEU& J) = default;
+			JEU& operator=(const JEU& J) = default;
+			bool end_of_game() const;
+			int value(std::uint8_t player) const;
+			bool won(std::uint8_t player) const;
+			bool lost(std::uint8_t player) const;
+			bool draw(std::uint8_t player) const;
+			uint8_t current_player() const;
+			std::uint16_t number_of_moves() const;
+			void play(std::uint16_t m);
+			void undo(std::uint16_t m) {}
+			std::string player_to_string(std::uint8_t player) const;
+			std::string move_to_string(std::uint16_t m) const;
+			std::string to_string() const;
+			void playout(std::mt19937& engine, int max_depth = -1);
+			std::set<int> to_input_vector() const;
+			void from_input_vector(const std::set<int>& input);
+			morpion_state get_state();
+			void set_state(const morpion_state& state);
+			std::shared_ptr<game<morpion_state>> do_copy() const;
+			std::uint64_t hash(std::uint16_t m) const;
+			std::uint64_t hash() const;
+		private:
+			[... Methodes utiles pour le jeu mais pas nécessaires pour le MCTS ...]
+
+	};
+	std::ostream& operator<<(std::ostream& os, const JEU& J);
+}
+```
+
+## Explication des différentes fonctions:
+
+### bool end_of_game()
+Est-ce que le jeu est terminé ? Soit parce que quelqu'un a gagné, soit parce que c'est égalité
+
+### int value (int player)
+Quelle est la valeur pour le joueur `player` dans l'état actuel du jeu ? Normalement 1 veut dire qu'il a gagné, -1 qu'il a perdu, 0 c'est égalité
+
+### bool won/lost/draw(int player)
+Est-ce que le joueur `player` a gagné/perdu/fait égalité ?
+
+### int current_player()
+C'est à quel joueur de jouer maintenant ? (Au début ce sera le joueur 0)
+
+### int number_of_moves()
+Nombre de coups que le joueur qui doit jouer maintenant peut jouer.
+
+### play(int move)
+Jouer le coup numéro `move` parmi les coups possibles: mets à jour l'état.  
+`move` represente la position du coup parmi tous les coups possibles, ce n'est pas la réprésentation du coup.
+
+### undo(int move)
+Pas implementé.
+
+### string player_to_string(int player)
+Representation d'un joueur de façon comprehensible par un humain
+
+### string move_to_string(int move)
+Representation d'un coup de façon comprehensible par un humain (par exemple B7).
+**Note:** est-ce que le coup doit être compris comme le coup numéro `move` dans la liste des coups possibles ou `move` est la representation que l'ordi a du coup ?
+
+### string to_string()
+Representation de l'état actuel du jeu (c'est à dire, dessiner l'état actuel du jeu)
+
+### playout(engine, max_depth)
+Joue le jeu en choisissant des coups au hasard jusqu'à la fin du jeu.
+
+### get/set_state()
+Retourne/charge l'état
+
+### Les autres
+Non utilisées
+
+## Fonction play(int move)
+Elle doit jouer le coup numéro `move` parmi les coups possibles. Algorithme:
+
+- Recuperer quel coup est le coup numéro `move` dans la liste des coups possibles
+- Mettre à jour le bon bitboard selon quel jouer doit jouer maintenant
+- Ajouter 1 au nombre de coups joués jusqu'à maintenant (si nécessaire)
+- Vérifier si un joueur a gagné et mettre à jour l'état
+- Mettre à jour la liste de tous les coups possibles
+
+## Fonction playout
+```C++
+void JEU::playout(mt19937& engine, int max_depth)
+	{
+		while (!end_of_game())
+		{
+			uniform_int_distribution<uint16_t> distribution(0, number_of_moves() -1);
+			uint16_t move = distribution(engine);
+			play(move);
+		}
+	}
+```
+
+Choisit un coup au hasard parmi les coups possibles et le joue.
+	
\ No newline at end of file