À chaque étape de programmation, vous devez vérifier si le programme :
cd TD-plusLoin
Pour compiler un programme, on utilise l’instruction suivante :
gcc -Wall exo.c -o nomExecutable
Pour executer un programme, on utilise l’instruction suivante :
./nomExecutable
Le Mastermind est un jeu de déduction dont le but pour le joueur est de deviner le code défini par un maître du jeu. Cette déduction se fait par étape successives de proposition retour du maître du jeu, dans la limite de 12. Le joueur place des pions de couleurs dans les trous de la première rangée immédiatement en face de lui. Le maître du jeu va donner des informations sur cette proposition de code. - Si l’un des pions correspond par sa position et sa couleur à un pion caché derrière l’écran, le maître du jeu l’indique en plaçant une fiche noire dans l’un des trous de marque, sur le côté droit correspondant du plateau ; - Si l’un des pions correspond uniquement par sa couleur, le maître du jeu l’indique par une fiche blanche dans l’un des trous de marque ; - S’il n’y a aucune correspondance, il ne marque rien.
La partie s’arrête lorsque le joueur découvre le code (le maître du jeu a posé quatre fiches noires) ou bien si au bout des 12 tentatives, le joueur n’a pas trouvé le code, alors le maître du jeu l’a tenu en échec. L’objectif ici est de programmer votre version de ce jeu, considérant que le rôle du maître du jeu est incarné par l’ordinateur et le joueur, l’utilisateur de votre programme.
Nous vous proposons d’implémenter la version simplifiée en terme de taille de code et de couleurs disponibles. Le code à deviner comportera 4 pions de couleur parmi 6 couleurs disponibles (jaune, bleu, rouge, vert, orange, violet). Certains pions peuvent être identiques. Nous utiliserons un plateau de jeu à 12 tentatives. Vous pourrez ajouter le comptage de points (cf détail des règles). Vous trouverez plus d’informations sur le jeu et le détail des règles ici
#include <stdio.h>
#include <stdlib.h>
/* exo 1 : un mastermind*/
int main(){
return 0;
}
NB : vous n’êtes pas obligé d’utiliser les mêmes emojis ou affichage que la vidéo ci-dessus !
Définir une énumération couleur qui défini l’ensemble des couleurs jouables (jaune, bleu, rouge, vert, orange, violet). N’oubliez pas la nomenclature en MAJUSCULES dans le code…
Définir une énumération placement qui défini l’ensemble des résultats de l’analyse (vide, blanc, noir ). N’oubliez pas la nomenclature en MAJUSCULES dans le code….
typedef enum semaine{
, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE
LUNDI}semaine;
Vous pouvez laisser int dans la définition de la pile, car le programme assimilera LUNDI, MARDI, … par les entiers 0, 1 … jusqu’à 6.
("Je suis de le jour %d \n",LUNDI);
printf("Je suis de le jour %d \n",MARDI);
printf("Je suis de le jour %d \n",MERCREDI); printf
0
1
2
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void encode(int codeSecret[4]);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void afficherCodeSecret(int codeSecret[4]);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void initialiserPlateau(int plateauJeu[12][4]);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void afficherPlateau(int plateauJeu[12][4]);
attention : ici, on ne fera que l’affichage, la vérification du code rentré par l’utilisateur se fera dans la procédure decode (question 11)
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void afficherCodePlacements(int plateauPlacements [12][4],int numeroCoups);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void saisieUtilisateur(int plateauJeu[12][4],int numeroCoups){
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int estPresente(int coul, int codeSecret[4]);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int aGagne(int plateauPlacements[nbCoups][nbCodeSecret], int numeroCoups);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void decode(int plateauJeu[12][4],int plateauPlacements[12][4], int numeroCoups, int codeSecret[4]);
On considère une grille d’entier, carrée de taille N, représentant un champ. Dans ce champ, se trouvent 12 moutons disposés aléatoirement (caractère ‘M’), de l’herbe (caractère ‘H’) ou rien du tout (caractère ‘ ’). Le champ est initialisé avec les 12 moutons et de l’herbe ailleurs.
À chaque “tour” d’unité de temps, un mouton se déplace aléatoirement sur une case adjacente, de manière verticale ou horizontale. S’il y a de l’herbe, il la mange et au prochain déplacement, cette case sera vide.
S’il y a un mouton, il y a combat de moutons et à la fin, il n’en reste qu’un. Au prochain déplacement, cette case sera vide.
Si la case est vide et qu’autour (verticalement ou horizontalement), il n’y a pas d’herbe, ce mouton meurt de faim. Cette case devient vide.
Si un mouton se trouve sur un bord, il a moins de possibilité de déplacement.
#include <stdio.h>
#include <stdlib.h>
/* exo 2 : les moutons */
int main(){
return 0;
}
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void initChamp (int champ[N][N],int taille);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void afficherChamp (int champ[N][N],int taille);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int bouge();
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int verifGrille(int dep, int i, int j,int taille);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int herbeAutour(int champ[N][N], int i, int j, int taille);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void evolue(int champ[N][N],int taille);
("sleep 2");
system("clear"); system
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
int compterMouton(int champ[N][N],int taille);
/* Auteur : ... */
/* Date : ... */
/* Résumé : ... */
/* Entrée(s) : ... */
/* Sortie(s) : ... */
void tournoi(int champ[N][N], int taille);
Le jeu de la vie est un automate cellulaire qui repose sur le principe d’évolution. C’est une invention de John Horton Conway vers 1970.
Le jeu de la vie est un jeu sans joueur, il n’y a aucune intervention du joueur lors de l’exécution. Il s’agit d’un automate cellulaire, un modèle où chaque état conduit mécaniquement à l’état suivant à partir de règles pré-établies.
Le jeu se déroule sur une matrice 2D carrée. Une cellule évolue d’un tour à un autre. Une case a donc 8 voisins potentiels.
Par exemple, ici, la case 1 a un voisin dans la diagonale du haut. Les autres cases sont vides.
Une case a donc des voisins dans les 8 directions suivantes : Nord, Nord-Est, Est, Sud-Est, Sud, Sud-Ouest, Ouest, et Nord-Ouest.
L’évolution de la grille se fait au tour par tour en appliquant un ensemble de règles locales à chaque case. Ces règles prennent en compte l’état et le voisinage de la case et sont appliquées simultanément sur toutes les cases de la grille. Voici les règles que vous utiliserez :
Il existe 2 type d’évolution de grille dans le calcul des voisins :
Le jeu de la vie se représente sur un tableau d’entiers dynamique 2D. La grille est une matrice (carée ou non). Les valeurs de la case possibles sont 0 ou 1. La matrice doit être donnée en entrée via un fichier texte.
Le fichier .txt
doit être construit comme suit :
5 5
0 0 0 0 0
1 0 0 0 1
0 0 0 0 0
1 1 1 0 0
0 0 0 0 0
400 1
void initialiser(int grille[N],int lignes,int colonnes);
void afficher(int grille[N],int lignes,int colonnes);
cat planeur.txt | ./exe
./exe < planneur.txt
Attention Vous devez réaliser 2 calculs de voisinage un pour une matrice torique et un pour une matrice finie