From 3362af9a43201121a6d00c2017b989ee31033c9f Mon Sep 17 00:00:00 2001 From: ColinDrieu <colin.drieu@insa-rennes.fr> Date: Tue, 17 May 2016 16:32:45 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20fonction=20permettant=20de=20de?= =?UTF-8?q?terminer=20si=20une=20case=20est=20=C3=A0=20port=C3=A9e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit J'ai modifié Terrains.xml de maniere à ce que les forets ne soient pas franchissables par les sorts. --- resources/Terrains.xml | 2 +- src/case.c | 72 ++++++++++++++++++++++++++++++++++++++++++ src/case.h | 2 ++ src/controleur.c | 29 +++++++++++++++-- src/personnage.h | 2 ++ 5 files changed, 104 insertions(+), 3 deletions(-) diff --git a/resources/Terrains.xml b/resources/Terrains.xml index d159420..10456bd 100644 --- a/resources/Terrains.xml +++ b/resources/Terrains.xml @@ -4,7 +4,7 @@ </Terrain> <Terrain id="G_RIVER" name="Riviere" FR="0" FRS="1" PDR="1" Desc="River, arrete de river" f_default="../resources/Skins/eau.bmp"> </Terrain> - <Terrain id="G_FOREST" name="Foret" FR="1" FRS="1" PDR="2" Desc="Le frère de Fopart" f_default="../resources/Skins/foret.bmp"> + <Terrain id="G_FOREST" name="Foret" FR="1" FRS="0" PDR="2" Desc="Le frère de Fopart" f_default="../resources/Skins/foret.bmp"> </Terrain> <Terrain id="G_MOUNT" name="Montagne" FR="0" FRS="0" PDR="0" Desc="Montagne est plus haut que tontagne" f_default="../resources/Skins/montagne.bmp"> </Terrain> diff --git a/src/case.c b/src/case.c index 6733b2e..4e2ab4f 100644 --- a/src/case.c +++ b/src/case.c @@ -5,6 +5,7 @@ #include "structures.h" #include "personnage.h" #include "deplacements.h" +#include "partie.h" /*! * \file case.c @@ -124,3 +125,74 @@ int initCarte(Carte_A * sourceXML, Carte_Jeu * destination, Game_Package * pack) } return 1; } + + /*! + * \fn int adjacente(Case * depart, Case * cible) + * \brief La fonction teste si la case cible est adjacente à la case départ. + * + * \param un pointeur vers la case de départ, un pointeur vers la case à tester + * \return 1 si la case est adjacente, 0 sinon. + */ +int adjacente(Case * depart, Case * cible){ + if(get_x(cible)==get_x(depart)){ + if((get_y(cible)==get_y(depart)-1)||(get_y(cible)==get_y(depart)+1)){ + return 1; + } + else{ + return 0; + } + } + else if((get_x(cible)==(get_x(depart)-1))||(get_x(cible)==(get_x(depart)+1))){ + if(get_x(depart)%2==1){ + if((get_y(cible)==get_y(depart))||(get_y(cible)==get_y(depart)-1)){ + return 1; + } + else{ + return 0; + } + } + else{ + if((get_y(cible)==get_y(depart))||(get_y(cible)==get_y(depart)+1)){ + return 1; + } + else{ + return 0; + } + } + } + else{ + return 0; + } +} + + /*! + * \fn APorteeRecursif(Carte_Jeu * c, Case * depart, Case * cible,int portee) + * \brief La fonction teste si la case cible est a portée de la case de départ. + * + * \param La carte sur laquelle on fait le test, un pointeur vers la case de départ, un pointeur vers la case à tester, un entier representant la portée + * \return 1 si la case est à portée, 0 sinon. + */ +int APorteeRecursif(Carte_Jeu * c, Case * depart, Case * cible,int portee){ + int i,j; + + if(depart==cible){ + return (cible->terrain->franchissable_sorts==vrai); + } + + else if((portee==1)&&(adjacente(depart,cible))){ + return (cible->terrain->franchissable_sorts==vrai); + } + else{ + portee--; + for((i=get_x(depart)-portee);((i<LARG_MAX_CARTE)&&(i<=get_x(depart)+portee));i++){ + for((j=get_y(depart)-portee);((j<HAUT_MAX_CARTE)&&(j<=get_y(depart)+portee));j++){ + if(adjacente(getCase(c,i,j),depart)){ + if(APorteeRecursif(c,getCase(c,i,j),cible,portee)){ + return (cible->terrain->franchissable_sorts==vrai); + } + } + } + } + return 0; + } +} diff --git a/src/case.h b/src/case.h index 7dd05df..7d40b27 100644 --- a/src/case.h +++ b/src/case.h @@ -46,6 +46,8 @@ int initCarte(Carte_A * sourceXML, Carte_Jeu * destination, Game_Package * pack) /*Case * trouverCase(Carte * c, int x, int y);*/ +int adjacente(Case * depart, Case * cible); +int APorteeRecursif(Carte_Jeu *c, Case * depart, Case * cible,int portee); #endif diff --git a/src/controleur.c b/src/controleur.c index 3f65b18..d4fe9d8 100644 --- a/src/controleur.c +++ b/src/controleur.c @@ -854,7 +854,7 @@ void testControlleurConsole(){ ajouterPersonnage(packGlobal.Classes_Package[4].nom,1,2); ajouterPersonnage(packGlobal.Classes_Package[0].nom,2,2); - selectionnerCarte(packGlobal.Cartes_Package[2].nom); + selectionnerCarte(packGlobal.Cartes_Package[4].nom); initPositions(); @@ -865,11 +865,37 @@ void testControlleurConsole(){ } for(i=0;i<LARG_MAX_CARTE;i++){ + if(i%2){ + printf(" "); + } for(j=0;j<HAUT_MAX_CARTE;j++){ printf("%d ",personnagePresent(i,j)); } printf("\n"); } + printf("\n"); + for(i=0;i<LARG_MAX_CARTE;i++){ + if(i%2==0){ + printf(" "); + } + for(j=0;j<HAUT_MAX_CARTE;j++){ + printf("%d ",adjacente(getCase(getCarte(partieGlobale),7,4),getCase(getCarte(partieGlobale),i,j))); + } + printf("\n"); + } + printf("\n"); + + printf("A portee :\n"); + for(i=0;i<LARG_MAX_CARTE;i++){ + if(i%2==0){ + printf(" "); + } + for(j=0;j<HAUT_MAX_CARTE;j++){ + printf("%d ",APorteeRecursif(getCarte(partieGlobale),getCase(getCarte(partieGlobale),7,4),getCase(getCarte(partieGlobale),i,j),3)); + } + printf("\n"); + } + printf("\n"); for(i=0;i<LARG_MAX_CARTE;i++){ for(j=0;j<HAUT_MAX_CARTE;j++){ @@ -902,7 +928,6 @@ void testControlleurConsole(){ } } } - } diff --git a/src/personnage.h b/src/personnage.h index 5aeaf06..075d536 100644 --- a/src/personnage.h +++ b/src/personnage.h @@ -39,6 +39,8 @@ void retraitPD(Personnage * p, int n); int personnageKO(Personnage * p); int manaSuffisant(Personnage * p, int mana); +int APortee(Personnage * depart, Personnage * cible, int portee); + Classe * getClasse(Personnage *p); char * getNomPersonnage(Personnage * p); -- GitLab