From e6504666e7456ad8db9739bd0c279f163c440f41 Mon Sep 17 00:00:00 2001 From: Henri Montjoie <henri.montjoie@insa-rennes.fr> Date: Sun, 28 Feb 2016 01:17:12 +0100 Subject: [PATCH] =?UTF-8?q?fonctions=20de=20base=20associ=C3=A9es=20aux=20?= =?UTF-8?q?cases,=20=C3=A0=20la=20carte=20et=20aux=20personnages=20+=20fon?= =?UTF-8?q?ction=20d=C3=A9placement=20sur=20cases=20hexagonales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/case.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ src/case.h | 26 ++++++++++++++++++ src/deplacements.c | 33 +++++++++++++++++++++++ src/deplacements.h | 9 +++++++ src/main.c | 21 --------------- src/personnage.c | 39 +++++++++++++++++++++++++++ src/personnage.h | 16 +++++++++++ src/structures.h | 24 +++++++++++------ 8 files changed, 205 insertions(+), 29 deletions(-) create mode 100644 src/case.c create mode 100644 src/case.h create mode 100644 src/deplacements.c create mode 100644 src/deplacements.h create mode 100644 src/personnage.c create mode 100644 src/personnage.h diff --git a/src/case.c b/src/case.c new file mode 100644 index 0000000..028278c --- /dev/null +++ b/src/case.c @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdlib.h> +#include "structures.h" +#include "case.h" +#include "personnage.h" +#include "deplacements.h" + +Case* init_case(Case *c,int x, int y, type_terrain *t){ + c->coord_x=x; + c->coord_y=y; + c->terrain=t; + c->occupee=0; + return c; +} + +int get_x(Case *c){ + return c->coord_x; +} + +int get_y(Case *c){ + return c->coord_y; +} + +boolean est_occupee(Case *c){ + return c->occupee; +} + +boolean terrain_franchissable(type_terrain *t){ + return t->franchissable; +} + +boolean case_franchissable(Case *c){ + return terrain_franchissable(c->terrain); +} + +void marquer_occupee(Case *c){ + if (c->occupee==vrai) printf("case déjà occupée"); + c->occupee=vrai; +} + +void marquer_libre(Case *c){ + if (c->occupee==faux) printf("case déjà libre"); + c->occupee=faux; +} + +type_terrain* get_terrain(Case *c){ + if (c->terrain==NULL){ + fprintf(stderr,"pas de terrain"); + } + return c->terrain; +} + +int init_carte(carte* c,unsigned short int largeur, unsigned short int hauteur){ + int i,j,n; + if (largeur*hauteur>TAILLE_MAX_CARTE){ + printf("erreur : taille maximum de la carte dépassée"); + return 1; + } + for (i=0;i<largeur;i++){ + for (j=0;j<hauteur;j++){ + init_case(c[n],i,j,NULL); + n++; + } + } + return 0; +} diff --git a/src/case.h b/src/case.h new file mode 100644 index 0000000..817cda9 --- /dev/null +++ b/src/case.h @@ -0,0 +1,26 @@ +#ifndef CASE_H_INCLUDED +#define CASE_H_INCLUDED + +Case* init_case(Case *c,int x, int y, type_terrain *t); + +int get_x(Case *c); + +int get_y(Case *c); + +boolean est_occupee(Case *c); + +boolean terrain_franchissable(type_terrain *t); + +boolean case_franchissable(Case *c); + +void marquer_occupee(Case *c); + +void marquer_libre(Case *c); + +type_terrain* get_terrain(Case *c); + +int init_carte(carte* c,unsigned short int largeur, unsigned short int hauteur); + + +#endif + diff --git a/src/deplacements.c b/src/deplacements.c new file mode 100644 index 0000000..8314582 --- /dev/null +++ b/src/deplacements.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> +#include "structures.h" +#include "case.h" +#include "personnage.h" +#include "deplacements.h" + +boolean case_a_cote(personnage *perso,Case *destination){ /* vérifie que la case hexagonale "destination" est contigue à la case du personnage */ + Case *depart = getPosition(perso); + if (get_x(depart)>get_x(destination)+1||get_x(depart)<get_x(destination)-1||get_y(depart)>get_y(destination)+1||get_y(depart)>get_y(destination)-1){ + return faux; + } + if (get_y(depart)==get_y(destination)+1&&get_x(depart)!=get_x(destination)){ + return faux; + } + return vrai; +} + +int deplacement_unitaire(personnage *perso,Case *destination){ /*déplace un personnage sur une case située à côté de la sienne, si cela est possible */ + if (est_occupee(destination)){ + printf("déplacement impossible : case déjà occupée par un personnage"); + return 1; + } + if (case_franchissable(destination)==faux){ + printf("déplacement impossible : case infranchissable"); + return 1; + } + if (case_a_cote(perso,destination)==vrai){ + return deplacer_personnage(perso, destination); + } + printf("déplacement impossible : case non contigue"); + return 1; +} diff --git a/src/deplacements.h b/src/deplacements.h new file mode 100644 index 0000000..aa96761 --- /dev/null +++ b/src/deplacements.h @@ -0,0 +1,9 @@ +#ifndef DEPLACEMENTS_H_INCLUDED +#define DEPLACEMENTS_H_INCLUDED + +boolean case_a_cote(personnage *perso,Case *destination); + +int deplacement_unitaire(personnage *perso,Case *destination); + + +#endif diff --git a/src/main.c b/src/main.c index df72852..a3eb74e 100644 --- a/src/main.c +++ b/src/main.c @@ -2,27 +2,6 @@ #include <stdlib.h> #include "structures.h" -Case* init_case(int x, int y, type_terrain t){ - Case *c; - c->coord_x=x; - c->coord_y=y; - c->terrain=t; - c->occupee=0; - return c; -} - -int init_carte(carte* c,unsigned short int largeur, unsigned short int hauteur){ - int i,j,n; - for (i=0;i<largeur;i++){ - for (j=0;j<hauteur;j++){ - c[n]=init_case(i,j,0); - n++; - } - } - return 0; -} - - int main() { diff --git a/src/personnage.c b/src/personnage.c new file mode 100644 index 0000000..b9754e3 --- /dev/null +++ b/src/personnage.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include <stdlib.h> +#include "structures.h" +#include "case.h" +#include "personnage.h" +#include "deplacements.h" + +personnage* init_personnage(personnage *perso, classe *c, Case *casedepart){ + perso->classe=*c; + perso->points_deplacement=c->points_deplacement_max; + perso->PV=c->PV_max; + perso->position=casedepart; + marquer_occupee(casedepart); + return perso; +} + +Case* getPosition(personnage *p){ + return p->position; +} + +int get_PV(personnage *p){ + return p->PV; +} + +int get_PD(personnage *p){ + return p->points_deplacement; +} + +boolean est_paralyse(personnage *p){ + return p->paralyse; +} + +int deplacer_personnage (personnage *perso, Case *destination){ /*déplace un personnage d'une case à une autre. Ne vérifie pas si le déplacement est autorisé, cela doit être fait par la fonction qui l'appelle*/ + marquer_libre(getPosition(perso)); + perso->position=destination; + marquer_occupee(getPosition(perso)); +} + + diff --git a/src/personnage.h b/src/personnage.h new file mode 100644 index 0000000..5041f16 --- /dev/null +++ b/src/personnage.h @@ -0,0 +1,16 @@ +#ifndef PERSONNAGE_H_INCLUDED +#define PERSONNAGE_H_INCLUDED + +personnage* init_personnage(personnage *perso, classe *c, Case *casedepart); + +Case* getPosition(personnage *p); + +int get_PV(personnage *p); + +int get_PD(personnage *p); + +boolean est_paralyse(personnage *p); + +int deplacer_personnage (personnage *perso, Case *destination); + +#endif diff --git a/src/structures.h b/src/structures.h index 7f3b425..8f9f0c7 100644 --- a/src/structures.h +++ b/src/structures.h @@ -1,43 +1,51 @@ #ifndef STRUCTURES_H_INCLUDED #define STRUCTURES_H_INCLUDED +#define TAILLE_MAX_CARTE 256 +#define TAILLE_NOMS 16 /* definition des structures nécessaires : case, classe, etc */ -typedef enum {plaine,eau,montagne,foret} type_terrain; +typedef char type_nom[TAILLE_NOMS]; typedef enum {faux, vrai} boolean; +typedef struct { + type_nom nom; + boolean franchissable; + unsigned short int PD_requis; +} type_terrain; + + typedef struct { unsigned short int coord_x; unsigned short int coord_y; - type_terrain terrain; + type_terrain *terrain; boolean occupee; } Case; -typedef Case* carte; - +typedef Case carte[TAILLE_MAX_CARTE]; typedef struct { - char nom[16]; + type_nom nom; unsigned short int degats_directs; unsigned short int degats_permanents; boolean paralysie; } attaque; typedef struct { - char nom[16]; + type_nom nom; attaque attaque; unsigned short int points_deplacement_max; unsigned short int PV_max; } classe; typedef struct { - char nom[16]; + type_nom nom; classe classe; unsigned short int points_deplacement; unsigned short int PV; boolean paralyse; - Case position; + Case *position; } personnage; #endif -- GitLab