Rapport de projet unix
Sommaire ntroduction 2 Interprétation du sujet et choix effectués 3 Analyse du Script 4 Menu 4 Charger et nouvelle partie 4 Boucle principale 6 Affichage : 6 Détection de victoire Detection horizontal Detection verticale 9 Detection en diagona p g Quitter et sauvegarder une partie 12 Conclusion 13 Introduction Dans le cadre de notre deuxième année d’école préparatoire à I’EFREI, nous avons la possibilité de s’initier à différents langages de programmation. Durant ce semestre nous avons donc découvert le système UNIX et le Shell et leurs spécificités.
Notre projet consistait alors grâce à nos bases acquises en TP, ? développer un « Puissance 4 », célèbre jeu de société. Le principal objectif était de nous forcer à nous adapter à différents univers de programmation à travers ces multiples séances pour pouvoir nouveaux, de ce fait nous avons dû faire de nombreuses recherches concernant les commandes à utiliser. nterprétation du sujet et choix effectués La difficulté principale du sujet résidait dans le stockage et la modification de notre plateau de jeu. Nous hésitions à stocker notre plateau dans un seul tableau ou dans plusieurs tableaux.
Nous avons finalement retenu la solution d’en utiliser plusieurs car la manipulation des pions nous semblait plus simple avec cette méthode. De plus notre vision du plateau était plus claire et épurée. Chaque tableau représentait donc une ligne du plateau. Nous avons donc 7 caractères par tableau et 6 tableaux représentant les 6 lignes du plateau : soit un total de 42 cases. Notre deuxième difficulté était de choisir un moyen de modifier le plateau après le tour d’un joueur. II fallait donc réafficher le tableau modifié après chaque tour.
En effet en C nous aurions tilisé les tableaux à double dimension mais i n’y a pas d’équivalent en Shell. Notre solution a été d’utiliser la commande eval qui nous permet de raisonner comme un tableau double dimension. La commande eval permet d’enregistrer sur la même ligne une liste d’argument. Le nom de chaque tableau comportera le numéro de ligne associée ce qui nous permet alors de naviguer entre les lignes grâce à la commande eval. Concernant la condition de victoire nous avons simplement vérifié si le dernier pion joué était entouré de 3 pions de la même couleur.
On testera donc les lignes pion joué était entouré de 3 pions de la même couleur. On testera donc les lignes verticales et horizontales, mais également les diagonales. Nous avons également étudié le cas d’un match nul si aucun des 2 joueurs ne parvient à s’imposer avec le remplissage total du plateau. pour la sauvegarde nous avons simplement enregistré le plateau de jeu ainsi que la position des pions dans un fichier texte que les joueurs peuvent nommer selon leur choix. Lors du lancement du jeu nous pouvons choisir de relancer une nouvelle partie ou d’en charger une récemment enregistrée.
Nous proposons aux joueurs de quitter leur partie à tout moment et d’enregistrer leur partie. Analyse du Script Menu Notre programme débute par un menu de sélection où le joueur peut choisir de démarrer une nouvelle partie ou d’en charger une précédente. Pour réaliser cela nous utilisons la commande echo qui permet d’afficher. Nous lisons alors le choix de futilisateur. Charger et nouvelle partie Nous analysons le choix de l’utilisateur grâce à 2 conditions. Si le choix est 1, nous créons une nouvelle partie avec nos 6 tableaux composés de 7 « _ » représentant les cases vides.
Si le choix est 2, on teste s’il existe, dans le dossier save, des parties enregistrées sous la forme d’un fichier . txt . On utilise donc la commande : Is save I wc -l ) » Si verif c’est qu’aucun fichier n’a été enregistré auparavant, on créer alors une nouvell nant soin d’afficher ? 3 enregistré auparavant, on créer alors une nouvelle partie en prenant soin d’afficher à rutilisateur qu’aucune partie n’a été trouvée. On utilise la commande sleep pour effectuer un petit temps de pause afin de laisser à l’utilisateur le temps de voir qu’aucune partie n’a été trouvée avant que la nouvelle se lance.
Si on trouve des parties, on demande à Futilisateur de renseigner le nom de celle qu’il recherche. On cherche ensuite si sa partie existe grâce à la commande eval Igame=save/’$game’. txt’ Si la partie n’est pas trouvée on l’informe l’utilisateur qu’il est inexistant avant de revenir à la saisie de la partie. Si la partie est bien trouvée on la charge et l’utilisateur reprend alors là où il était. Dans le code ci-dessus la commande eval va nous permettre de manipuler les tableaux comme des tableaux à double dimensions.
La variable x représente le numéro du tableau et donc de la ligne t y la position du caractère Boucle principale Affichage On rentre ensuite dans notre boucle principale qui se termine quand un des joueurs gagne ou quand le match nul est déclaré. On affiche alors le plateau grâce à la fonction affichage. Cette fonction affiche tout d’abord les numéros de colonne. On affiche ensuite tout le plateau à l’aide de 2 boucles while (de O à 5 pour les lignes et de O à 6 pour les colonnes). Si la valeur a afficher est un X, on l’affiche sur fond rouge sinon sur fond jaune grâce au On effect code couleur.
On ne change pas la couleur d’un « 4 fond Jaune grâce au code couleur. On ne change pas la couleur d’un « _ On effectue un passage à la ligne tous les 7 caractères grâce à la boucle. Après avoir affiché notre tableau on continue à exécuter la boucle principale On affiche ensuite le nom du joueur auquel c’est le tour de jouer. Pour cela on compte les tours et les tours pairs seront assignés au joueur 1 tandis que les impairs seront pour le joueur 2. On utilise pour cela la commande « % » qui est un détecteur de parité. L’utilisateur va ensuite saisir la colonne.
L’utilisateur a alors à choisir une colonne comprise entre 1 et 7 ou peut quitter la partie en tapant q. Si le numéro de colonne est correct, on affiche un X ou un O en fonction du joueur dans la colonne désirée. pour cela on doit déterminer la ligne du pion en fonction des pions déjà présents dans cette colonne. On utilise une boucle qui parcourt la colonne jusqu’à trouver un X ou un O. Si c’est le cas elle place le pion dans la ligne du dessus du pion trouvé, sinon le pion sera placé tout en bas. On utilisera toujours la commande eval pour changer de valeur.
On incrémente le tour et on utilise la fonction pour vérifier S un des joueurs a gagné, en mettant en paramètre dans cette onction les variables x et y représentant les coordonnées du pion que nous venons de placer. La fonction win a pour but détecter une victoire de l’un des joueurs ou un match nul. Pour le match nul nous vérifions simplement si le nombre de tour S l’un des joueurs ou un match nul. Pour le match nul nous vérifions simplement si le nombre de tour actuel a atteint le maximum possible soit 42. SI c’est le cas on attribue 1 à la variable match nul.
Detection horizontale Nous procédons à la verification horizontale, pour cela nous enregistrons la position du dernier pion joué dans la variable PJ (position joueur). Nous incrémentons les colonnes de 1 et nous enregistrons la nouvelle position (avec les colonnes incrémentées) dans une variable pdl. Nous faisons cela 3 fois ce qui peret d’avoir 4 valeur enregistrées, la position du joueur, et trois case vers la droite sur la meme ligne. Pour le test horizontal vers la gauche nous décrementons grâce à la même méthode. On vérifie ensuite l’égalité de ces 4 valeurs.
Si l’égalité est vérifiée c’est que l’un des 2 joueurs a gagné, nous vérifions ensuite quel joueur vient de jouer par l’observation du nombre de tours. Nous attribuons alors 1 à la variable win du joueur correspondant pour le déclarer vainqueur. Nous affectons à la variable winner 1 ce qui signifie la fin de partie. Detection verticale Après cette vérification horizontale (doite et gauche), nous vérifions les conditions de victoires verticales. Le principe de base est le même avec un déplacement de curseur qui va tester les lignes en dessous du dernier pion joué car aucun ne peut être situé au dessus.
Contrairement à la vérification horizontale nous incrémentons ici les lignes et les colonnes restent fixes. ? la vérification horizontale nous incrémentons ici les lignes et les colonnes restent fixes. On compare les 3 lignes du dessous, chaque valeur étant stockée dans des variables phbl , 2,3 et toujours PJ pour la position du pion Si ces 4 valeurs s’avèrent égales run des joueur a donc gagné et nous effectuons les même tests que pour la détection horizontale. Detection en diagonale Nous allons donc passer à la vérification en diagonale.
Elle se décompose en 4 parties, qui correspondent aux 4 diagonales qui entourent le pion : en haut à droite, en haut à gauche, en bas à gauche, en bas à droite. La fonction reprend le même principe que les vérifications horizontales et verticales or ici nous incrémentons ( ou décrementons) à la fois la colonne et la ligne. Nous décrirons ici uniquement l’un des 4 cas car ils sont tous basés sur le même principe. Nous enregistrons comme précédemment la position du dernier pion joué dans la variable PJ.
Nous décrémentons ensuite la ligne (la ligne la plus haute étant O) pour monter d’une ligne. Nous incrémentons la colonne pour se décaler d’une colonne vers la droite. La position correspondra alors à une case en haut à droite u pion joué. Nous enregistrons cette variable dans une variable pdhd (position diagonale haut droite). Nous reproduisons cela 3 fois et nous comparons les 4 valeurs obtenues (position du joueur, une case en haut à droite….. ) Si ces 4 valeurs s’avèrent égales alors.
Nous attribuons alors 1 à la variable win du joueur cor Si ces 4 valeurs s’avèrent égales alors. Nous attribuons alors 1 à la variable win du joueur correspondant pour le déclarer vainqueur. Nous affectons à la variable winner 1 ce qui signifie la fin de Pour la diagonale en haut à gauche on gardera le même principe vec une décrementation des colonnes, en bas à gauche décrémentation des colonnes et incrémentation de la ligne, et en bas à droite incrémentation des colonnes et lignes.
Après la fonction Win, en fonction du résultat on affichera la victoire de l’un des 2 joueurs. Quitter et sauvegarder une partie En cas de volonté de quitter la partie, le joueur saisie q lors du choix de colonne. On propose alors à l’utilisateur de sauvegarder sa partie et on lui demandera de renseigner le nom qu’il veut attribuer à sa partie. On va ensuite copier le plateau contenant les ions dans un fichier texte à l’aide d’une boucle : Conclusion Ce projet nous a permis de découvrir un nouveau langage et d’en acquérir des réflexes qui pourront nous servir dans le futur.
Nous y avons découvert de nombreux avantages par rapport au C comme la manipulation de variables, la création de fonctions, etc… mais certains points sont plus complexes comme les tableaux à double dimension. Nous avons réussi dans ce projet ? faire face aux problèmes rencontrés et avons su trouver les moyens nécessaires à l’élaboration d’un jeu qui fonctionne. 8