diff --git a/Makefile b/Makefile deleted file mode 100644 index fb4c8b9c8bb1fbd73ae8135792187e7cc1a453b5..0000000000000000000000000000000000000000 --- a/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -OPTIONS = --filter=pandoc-numbering -OPTIONS += --filter=pandoc-crossref - - -PDFOPTIONS = --highlight-style kate -PDFOPTIONS += --pdf-engine xelatex -PDFOPTIONS += --number-sections -PDFOPTIONS += --template=./default.latex - - -HTMLOPTIONS += -t html5 -HTMLOPTIONS += -c tufte-css/tufte.css -HTMLOPTIONS += --self-contained - -MD=$(wildcard *.md) -HTML=$(MD:%.md=%.html) -PDF=$(MD:%.md=%.pdf) - - -all: $(HTML) $(PDF) - -%.pdf: %.md Makefile - pandoc -s $(OPTIONS) $(PDFOPTIONS) -o $@ $< - -%.html: %.md Makefile - pandoc -s $(OPTIONS) $(HTMLOPTIONS) -o $@ $< - -deploy: all - mkdir -p prog_seq_c_tp/puissance4 - cp puissance4.html prog_seq_c_tp/puissance4/index.html - cp puissance4.pdf prog_seq_c_tp/puissance4/puissance4.pdf - tar czvf skeleton_for_students.tar.gz skeleton_for_students && mv skeleton_for_students.tar.gz prog_seq_c_tp/puissance4/ - -clean: - rm -rf *.html *.pdf prog_seq_c_tp diff --git a/README.md b/README.md deleted file mode 100644 index 1ee61d93fd6a0469e8a3b2c917b098208ae76c0b..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# 11_puissance_4 - diff --git a/puissance4.md b/puissance4.md deleted file mode 100644 index 39ec6100ac9f4d74e193babee7e8d4457210e2b7..0000000000000000000000000000000000000000 --- a/puissance4.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -author: -- Puissance 4 -title: Cours de programmation séquentielle -autoSectionLabels: false -autoEqnLabels: true -eqnPrefix: - - "éq." - - "éqs." -chapters: true -numberSections: false -chaptersDepth: 1 -sectionsDepth: 3 -lang: fr -documentclass: article -papersize: A4 -cref: false -urlcolor: blue -toc: false -... - - -# But du travail pratique - -Le but de ce travail pratique est de réaliser un jeu de puissance 4. Le jeu doit implémenter trois modes différents : - -- un mode deux joueurs ; -- un mode un joueur où l’ordinateur joue aléatoirement ; -- un mode un joueur "intelligent" où l’ordinateur essaie de gagner ou de ne pas perdre. - -Le rendu visuel du jeu sera réalisé en mode texte "ASCII Art" tel qu’illustré -ci-dessous (vous pouvez copier-coller les symboles depuis la version HTML de -cet énoncé ou depuis le [repo git](https://gitedu.hesge.ch/programmation_sequentielle/travaux_pratiques/c_lang/puissance4/enonce): - -``` -Column number? (starts at 1): -4 -┌─┬─┬─┬─┬─┬─┬─┐ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │X│ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │X│O│ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│O│X│X│O│ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│X│O│X│O│ │ │ │ -└─┴─┴─┴─┴─┴─┴─┘ - 1 2 3 4 5 6 7 -Player one won! -``` - -En outre, une batterie de tests (`testbed`) permettant de valider que votre implémentation est correcte vous est fournie, de même que le programme fonctionnel. Ainsi, vous pourrez vous assurez que votre implémentation produit exactement l’affichage souhaité. Ce dernier point est particulièrement important, car si l’affichage exact n’est pas respecté, tous les tests de validation échoueront. - -# Syntaxe du programme à implémenter - -Le programme à implémenter doit impérativement respecter la syntaxe suivante : - -``` -Usage: puissance4 <mode> <row> <col> - mode specifies the mode: 1 = single player game (random), - 2 = single player game (AI), 3 = two players game - row specifies the number of rows (>= 4) - col specifies the number of columns (>= 4) -``` - -A noter que l’ordre des arguments est fixé et que le dernier argument est -optionnel. -Voici un exemple d’exécution avec le mode deux joueurs sur une grille de 6x7 (lignes x colonnes) : - -``` -./puissance4 3 6 7 -``` - -Un autre exemple avec une partie contre l’ordinateur "intelligent" sur une grille de 11x9 : - -``` -./puissance4 2 11 9 -``` - -# Règles du jeu - -Le jeu se joue à deux. Chacun leur tour, les joueurs choisissent une colonne. Quand le choix est fait, une pastille "tombe" au bas de la colonne spécifiée. Le premier joueur qui aligne quatre pastilles soit verticalement, soit horizontalement, soit en diagonale a gagné. - -- Le plateau de jeu est composé d’un nombre arbitraire de lignes et colonnes ; le nombre de lignes ou colonnes doit être supérieur ou égal à quatre. -- A chaque joueur correspond une pastille ; celle-ci est représentée par le - caractère `X` pour le premier joueur et `O` pour le deuxième. -- Chacun leur tour les joueurs choisissent une colonne à l’aide du clavier ; la - première colonne est numérotée `1`. -- Si une colonne invalide est spécifiée, le programme doit re-demander à l’utilisateur d’entrer une colonne (valide). -- Une fois une colonne sélectionnée, la pastille du joueur va se placer en bas de la colonne sur la première case non-occupée (si toute la colonne est occupée il est impossible de poser la pastille). -- Le premier joueur à avoir aligné quatre pastilles horizontalement, verticalement, ou en diagonale, a gagné. -- Si toutes les cases sont remplies et qu'aucun joueur n'a gagné la partie se termine par un match nul. - -## Mode ordinateur aléatoire - -Programmer le jeu pour une seule personne face à l’ordinateur. Dans la première version de cette variante l’ordinateur jouera toujours au hasard. - -## Mode ordinateur "intelligent" - -Dans une version plus sophistiquée l’ordinateur sera en mesure d’empêcher la victoire de son adversaire s’il gagne au prochain coup, ou gagnera s’il est en mesure de gagner au prochain coup. Dans tous les autres cas l’ordinateur jouera au hasard. - -# Cahier des charges - -1. Programmer le jeu entre un humain et un ordinateur : - - L'ordinateur jouera toujours un coup au hasard. -2. Programmer une "intelligence artificielle" un peu plus évoluée : - - L'ordinateur gagnera s'il le peut au prochain coup. - - L'ordinateur empêchera le joueur de gagner au prochain coup s'il le peut. -3. Programmer le jeu à deux joueurs humains : - - Afficher l'état de la partie à l'écran où une case libre est représenté - par un `\ ` (espace), et les cases de chacun des joueurs par un `X` ou un - `O` respectivement. Le tableau de jeu sera affiché comme dans l'exemple fourni. - - La victoire doit être vérifiée après chaque coup. - - Un match nul est possible si aucun des joueurs n'a gagné et qu'il n'y a plus de case libre. -4. Les paramètres du jeu sont lus sur la ligne de commande selon la syntaxe - définie au paragraphe *Syntaxe du programme à implémenter*. - -# Tests automatisés - -## Paramètres d'entrée - -Il est très important de respecter le format de la ligne de commande comme indiquées ci-dessus. - -Le joueur doit rentrer une colonne à la fois. On supposera qu'il rentrera toujours un nombre entre 1 et le nombre de colonnes (pour simplifier). - -## Début de la partie - -1. Si `M` et `N` correspondent au `row` et `col` des paramètres d'entrée. Vous devez afficher la taille du plateau de jeu sur la première ligne - -``` -Board size is MxN (rows x col) -``` - -2. Vous devez afficher en "ASCII Art" l'état du tableau au début de la partie : - -``` -┌─┬─┬─┬─┬─┬─┬─┐ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -└─┴─┴─┴─┴─┴─┴─┘ - 1 2 3 4 5 6 7 -``` - -## En cours de partie - -1. Lorsqu'un joueur doit jouer, la chaine de caractères suivante doit être affichée : - -``` -Column number? (starts at 1): -``` - -2. Après chaque coup (que ce soit d'un joueur ou de l'ordinateur), le tableau de jeu doit aussi être affiché : - -``` -┌─┬─┬─┬─┬─┬─┬─┐ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│ │ │ │ │ │ │ │ -├─┼─┼─┼─┼─┼─┼─┤ -│X│O│ │ │ │ │ │ -└─┴─┴─┴─┴─┴─┴─┘ - 1 2 3 4 5 6 7 -``` - -## Victoire/défaite/match nul - -Un certain nombre de tests automatisés sont fournis avec le code. Il est impératif que le format de sortie soit scrupuleusement respecté pour pouvoir passer les tests. -En d'autres termes: - -- Lorsque le joueur 1 a gagné, le programme affichera : - -``` -Player one won!" -``` - -- Lorsque le joueur 2 a gagné, le programme affichera : - -``` -Player two won! -``` - -- Lorsque l'ordinateur a gagné, le programme affichera : - -``` -Computer won! -``` - -- Lorsque le résultat est un match nul, le programme affichera : - -``` -It is a draw. -``` - -## Tests automatisés fournis - -Un squelette comprenant les tests automatisés vous est fourni sur la page dans l'archive -[skeleton_for_students.tar.gz](https://malaspinas.academy/prog_seq_c_tp/puissance4/skeleton_for_students.tar.gz). - -A l'intérieur du répertoire se trouve un `Makefile`. Celui-ci sera utilisé pour compiler votre programme et nettoyer les fichiers finaux et intermédiaires générés. -Ce `Makefile` doit contenir les cibles suivantes : - -- `puissance4` : cible par défaut permettant de générer l'exécutable du jeu ; - le nom de l'exécutable doit impérativement être "puissance4". -- `clean` : cible permettant de supprimer l'exécutable et les fichiers - intermédiaires générés (et aussi les fichiers candidats du `testbed`). -- `tests` : cible permettant d'exécuter la batterie de tests ; vous ne devriez pas avoir à modifier les règles de cette cible (c'est déjà fait pour vous). - -**Important:** Il est impératif d'initialiser la graine de votre générateur de -nombre aléatoire à `0` pour que les tests passent avec succès (`srand(0)`). - -Il est **impératif que votre programme passe tous les tests !** Vous pouvez vérifier simplement ceci en exécutant "make tests" dans le répertoire racine du travail pratique. En cas d'exécution sans erreur, vous devriez obtenir un affichage similaire à ceci : - -``` -$ make tests -make -C testbed -make[1]: Entering directory '/home/orestis/git/projects/puissance4/testbed' -make -C 2players -make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/2players' -=============[2 player tests]============= -test1 ------------------------------ -test2 ------------------------------ -test3 ------------------------------ -test4 ------------------------------ -test5 ------------------------------ -make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/2players' -make -C rand_ai -make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/rand_ai' -=============[random AI tests]============= -test1 ------------------------------ -test2 ------------------------------ -test3 ------------------------------ -test4 ------------------------------ -make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/rand_ai' -make -C smart_ai -make[2]: Entering directory '/home/orestis/git/projects/puissance4/testbed/smart_ai' -=============[smart AI tests]============= -test1 ------------------------------ -test2 ------------------------------ -test3 ------------------------------ -test4 ------------------------------ -test5 ------------------------------ -make[2]: Leaving directory '/home/orestis/git/projects/puissance4/testbed/smart_ai' -make[1]: Leaving directory '/home/orestis/git/projects/puissance4/testbed' - -``` - -# Notes importantes - -- Vous trouverez sur dans l'archive `skeleton_for_students.tar.gz` un - exécutable (`puissance4`) qui devrait être conforme au standard que nous avons défini dans ce document. N'hésitez pas à l'exécuter pour vérifier le format de sortie. -- Écrivez un code aussi modulaire et réutilisable que possible. -- Mettez votre code dans plusieurs fichiers séparés ; le projet sera compilé - avec le `Makefile` fourni dans le squelette. -- Essayez d'écrire vos propres tests pour chacune des fonctions que vous concevez. - diff --git a/skeleton_for_students/puissance4 b/skeleton_for_students/puissance4 index c73ed624297549082e6abff83ff60652fc3c34c8..5f0533d698e72014369b4c325fb941a9beb63c01 100755 Binary files a/skeleton_for_students/puissance4 and b/skeleton_for_students/puissance4 differ