#include "deplacement.h"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef M_PI
# define M_PI 3.14159265358979323846
# define M_PI_2 1.57079632679489661923
# define M_PI_4 0.78539816339744830962
#endif
/****************/
/* 2 * 3 * 4 */
/****************/
/* 1 * * 5 */
/****************/
/* 8 * 7 * 6 */
/****************/
/*
zone 1: x<= 95 ; y<405 ; y>95 ;
zone 2: x<=95 ; y<= 95 ;
zone 3: x>95 ; x<405; y<=95;
zone 4: x>=405 ; y<=95;
zone 5: x>=405 ; y<400 ; y>95 ;
zone 6: x>=405 ; y>=405;
zone 7: x>95 ; x<405 ; y>=405;
zone 8: x<=95 ; y>=405;
*/
#define EPSILON 0.0001
Direction deplacement (Info * info) {
Direction direction;
Perso * perso;
int nbre_gommes_zones;
/* dans ce cas la il s'agit du premier appel de la fonction, il faut donc initialiser la structure perso*/
if (info->perso == NULL)
{
info->perso = malloc(sizeof(perso));
((Perso*)info->perso)->old = .0;
}
/* raccourci pratique */
perso = (Perso*) info->perso;
/* appel de la fonction chercher gomme zone qui va compter le nombre de gommes par zone et qui va nous renvoyer le nombre de gomme sur les zones du bord*/
nbre_gommes_zones = ChercheGommeZone(info);
/* Si il y a des gommes dans les zones du bord le ploucman va y aller se nourrir */
if (nbre_gommes_zones>0)
{
direction = NettoyerZone(info);
}
/* Sinon on finit de nettoyer la totalite du plateau en s'occupant de la zone central*/
else
{
direction = NettoyerZoneCentral(info);
}
perso->old=direction;
return (direction-M_PI);
}
/********************************************************************************/
/************************Fonction chercher nbr gomme par zone********************/
/********************************************************************************/
int ChercheGommeZone(Info * info)
{
int i;
int somme;
Perso * perso;
/* raccourci pratique */
perso = (Perso*) info->perso;
/* on met à zéro le tableau de gomme */
perso->nbre_gomme_zone[0] = 0;
perso->nbre_gomme_zone[1] = 0;
perso->nbre_gomme_zone[2] = 0;
perso->nbre_gomme_zone[3] = 0;
perso->nbre_gomme_zone[4] = 0;
perso->nbre_gomme_zone[5] = 0;
perso->nbre_gomme_zone[6] = 0;
perso->nbre_gomme_zone[7] = 0;
perso->nbre_gomme_zone[8] = 0;
perso->nbre_gomme_zone[9] = 0;
perso->nbre_gomme_zone[10] = 0;
perso->nbre_gomme_zone[11] = 0;
/* on parcours le tableau de gomme */
for (i=0; i<info->n_cibles;i++)
{
if( info->cibles[i] == 0)
{
/* Si gomme dans la zone 1 */
if( info->pos_cibles[i].x <= 95 && info->pos_cibles[i].y < 405 && info->pos_cibles[i].y > 95 )
{
(perso->nbre_gomme_zone[0])++;
}
/* Si gomme dans zone 2 */
else if (info->pos_cibles[i].y <= 95 && info->pos_cibles[i].x <= 95)
{
(perso->nbre_gomme_zone[1])++;
}
/* Si gomme dans zone 3 */
else if (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y <= 95 )
{
(perso->nbre_gomme_zone[2])++;
}
/* Si gomme dans zone 4 */
else if ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y <= 95)
{
(perso->nbre_gomme_zone[3])++;
}
/* Si gomme dans zone 5 */
else if ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y < 405 && info->pos_cibles[i].y > 95)
{
(perso->nbre_gomme_zone[4])++;
}
/* Si gomme dans zone 6 */
else if ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y >= 405)
{
(perso->nbre_gomme_zone[5])++;
}
/* Si gomme dans zone 7 */
else if ( info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y >= 405 )
{
(perso->nbre_gomme_zone[6])++;
}
/* Si gomme dans zone 8 */
else if ( info->pos_cibles[i].y >= 405 && info->pos_cibles[i].x <= 95)
{
(perso->nbre_gomme_zone[7])++;
}
/* Si gomme dans zone central droite */
else if (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 > info->pos_cibles[i].y - 96) && (info->pos_cibles[i].x - 0 > 500 - info->pos_cibles[i].y))
{
(perso->nbre_gomme_zone[8])++;
}
/* Si gomme dans zone central haut */
else if (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 > info->pos_cibles[i].y - 96) && (info->pos_cibles[i].x - 0 < 500 - info->pos_cibles[i].y))
{
(perso->nbre_gomme_zone[9])++;
}
/* Si gomme dans zone central gauche */
else if (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 < info->pos_cibles[i].y - 96) && (500 - info->pos_cibles[i].x > info->pos_cibles[i].y))
{
(perso->nbre_gomme_zone[10])++;
}
/* Si gomme dans zone central bas */
else if (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 < info->pos_cibles[i].y - 96) && (500 - info->pos_cibles[i].x < info->pos_cibles[i].y))
{
(perso->nbre_gomme_zone[11])++;
}
}
}
/* on fait la somme des gommes pour savoir si il reste des gommes dans les zones externes */
somme = perso->nbre_gomme_zone[0]+ perso->nbre_gomme_zone[1] + perso->nbre_gomme_zone[2] + perso->nbre_gomme_zone[3] + perso->nbre_gomme_zone[4] + perso->nbre_gomme_zone[5] + perso->nbre_gomme_zone[6] + perso->nbre_gomme_zone[7];
return(somme);
}
/********************************************************************************/
/***********************Fonction nettoyer gommes dans zone***********************/
/********************************************************************************/
Direction NettoyerZone(Info * info)
{
Perso * perso;
Direction direction;
/* raccourci pratique */
perso = (Perso*) info->perso;
/***********************************************/
/******** Si le ploucman est dans zone 1 *******/
/***********************************************/
if( info->position.x <= 95 && info->position.y < 405 && info->position.y > 95 )
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[0]> 0)
{
direction=MangerGommesZone(info,"zone1");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[7] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[7] == 0)
{
/* aller vers la zone 2 */
direction=MangerGommesZone(info,"zone2");
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[7] > 0)
{
/* aller vers la zone 8 */
direction=MangerGommesZone(info,"zone8");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[7] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[6] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[5] == 0) || (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[5] > 0))
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[5] == 0)
{
/* aller vers zone 2 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[5] > 0)
{
/* aller vers zone 8 */
direction=-M_PI_2;
}
}
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[6] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[6] == 0)
{
/* aller vers la zone 2 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[6] > 0)
{
/* aller vers la zone 8 */
direction=-M_PI_2;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 2 *******/
/***********************************************/
else if (info->position.y <= 95 && info->position.x <= 95)
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[1] > 0)
{
direction=MangerGommesZone(info,"zone2");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[2] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[2] == 0)
{
/* aller vers la zone 1 */
direction=MangerGommesZone(info,"zone1");
}
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[2] > 0)
{
/* aller vers la zone 3 */
direction=MangerGommesZone(info,"zone3");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[0]== 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[7] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[4] == 0 && perso->nbre_gomme_zone[6] == 0) || (perso->nbre_gomme_zone[4] > 0 && perso->nbre_gomme_zone[6] > 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[4] > 0 && perso->nbre_gomme_zone[6] == 0)
{
/* aller vers zone 3 */
direction=M_PI;
}
else if (perso->nbre_gomme_zone[4] == 0 && perso->nbre_gomme_zone[6] > 0)
{
/* aller vers zone 1 */
direction=-M_PI_2;
}
}
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[7] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[7] == 0)
{
/* aller vers la zone 3 */
direction=M_PI;
}
else if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[7] > 0)
{
/* aller vers la zone 1 */
direction=-M_PI_2;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 3 *******/
/***********************************************/
else if (info->position.x > 95 && info->position.x < 405 && info->position.y <= 95 )
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[2] > 0)
{
direction=MangerGommesZone(info,"zone3");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[3] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[3] == 0)
{
/* aller vers la zone 2 */
direction=MangerGommesZone(info,"zone2");
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[3] > 0)
{
/* aller vers la zone 4 */
direction=MangerGommesZone(info,"zone4");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[3] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[4] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[7] > 0 && perso->nbre_gomme_zone[5] > 0) || (perso->nbre_gomme_zone[7] == 0 && perso->nbre_gomme_zone[5] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[7] > 0 && perso->nbre_gomme_zone[5] == 0)
{
/* aller vers zone 2 */
direction=.0;
}
else if (perso->nbre_gomme_zone[7] == 0 && perso->nbre_gomme_zone[5] > 0)
{
/* aller vers zone 8 */
direction=M_PI;
}
}
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[4] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[4] == 0)
{
/* aller vers la zone 2 */
direction=.0;
}
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[4] > 0)
{
/* aller vers la zone 4 */
direction=M_PI;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 4 *******/
/***********************************************/
else if ( info->position.x >= 405 && info->position.y <= 95)
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[3] > 0)
{
direction=MangerGommesZone(info,"zone4");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[4] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[4] == 0)
{
/* aller vers la zone 3 */
direction=MangerGommesZone(info,"zone3");
}
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[4] > 0)
{
/* aller dans la zone 5 */
direction=MangerGommesZone(info,"zone5");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[4] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[5] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[6] > 0) || (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[6] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[6] == 0)
{
/* aller vers zone 3 */
direction=.0;
}
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[6] > 0)
{
/* aller vers zone 5 */
direction=-M_PI_2;
}
}
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[5] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[5] == 0)
{
/* aller vers la zone 3 */
direction=.0;
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[5] > 0)
{
/* aller vers la zone 5 */
direction=-M_PI_2;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 5 *******/
/***********************************************/
else if ( info->position.x >= 405 && info->position.y < 405 && info->position.y > 95)
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[4] > 0)
{
direction=MangerGommesZone(info,"zone5");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[5] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[5] == 0)
{
/* aller vers la zone 4 */
direction=MangerGommesZone(info,"zone4");
}
else if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[5] > 0)
{
/* aller vers la zone 6 */
direction=MangerGommesZone(info,"zone6");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[5] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[6] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[7] > 0) || (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[7] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[7] == 0)
{
/* aller vers zone 4 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[7] > 0)
{
/* aller vers zone 6 */
direction=-M_PI_2;
}
}
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[6] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[6] == 0)
{
/* aller vers la zone 4 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[6] > 0)
{
/* aller vers la zone 6 */
direction=-M_PI_2;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 6 *******/
/***********************************************/
else if ( info->position.x >= 405 && info->position.y >= 405)
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[5] > 0)
{
direction=MangerGommesZone(info,"zone6");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[4] > 0 && perso->nbre_gomme_zone[6] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[4] > 0 && perso->nbre_gomme_zone[6] == 0)
{
/* aller vers zone 5 */
direction=MangerGommesZone(info,"zone5");
}
else if (perso->nbre_gomme_zone[4] == 0 && perso->nbre_gomme_zone[6] > 0)
{
/* aller vers zone 7 */
direction=MangerGommesZone(info,"zone7");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[4] == 0 && perso->nbre_gomme_zone[6] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[7] == 0 && perso->nbre_gomme_zone[3] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[2] > 0) || (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[2] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[2] == 0)
{
/* aller vers zone 7 */
direction=.0;
}
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[2] > 0)
{
/* aller vers zone 5 */
direction=M_PI_2;
}
}
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[7] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[3] > 0 && perso->nbre_gomme_zone[7] == 0)
{
/* aller vers la zone 5 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[3] == 0 && perso->nbre_gomme_zone[7] > 0)
{
/* aller vers la zone 7 */
direction=.0;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 7 *******/
/***********************************************/
else if ( info->position.x > 95 && info->position.x < 405 && info->position.y >= 405 )
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[6] > 0)
{
direction=MangerGommesZone(info,"zone7");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[5] > 0 && perso->nbre_gomme_zone[7] > 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[5] > 0 && perso->nbre_gomme_zone[7] == 0)
{
/* aller vers zone 6 */
direction=MangerGommesZone(info,"zone6");
}
else if (perso->nbre_gomme_zone[5] == 0 && perso->nbre_gomme_zone[7] > 0)
{
/* aller vers zone 8 */
direction=MangerGommesZone(info,"zone8");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[5] == 0 && perso->nbre_gomme_zone[7] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[4] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[3] > 0) || (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[3] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[3] == 0)
{
/* aller vers zone 8 */
direction=.0;
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[3] > 0)
{
/* aller vers zone 6 */
direction=M_PI;
}
}
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[4] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[0]> 0 && perso->nbre_gomme_zone[4] == 0)
{
/* aller vers la zone 8 */
direction=.0;
}
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[4] > 0)
{
/* aller vers la zone 6 */
direction=M_PI;
}
}
}
/***********************************************/
/******** Si le ploucman est dans zone 8 *******/
/***********************************************/
else if ( info->position.y >= 405 && info->position.x <= 95)
{
/* si il y a des gommes dans la zone on les manges */
if (perso->nbre_gomme_zone[7] > 0)
{
direction=MangerGommesZone(info,"zone8");
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a (ou qu'il n'y en a pas) dans les deux zones adjacentes alors on se dirige vers la zone la plus proche */
else if (perso->nbre_gomme_zone[6] > 0 && perso->nbre_gomme_zone[0]> 0)
{
direction=ZonePlusPres(info);
}
/* si il n'y a plus de gommes dans la zone et qu'il y en a dans une des zones adjacentes alors on se dirige vers celle-ci*/
else if (perso->nbre_gomme_zone[6] > 0 && perso->nbre_gomme_zone[0]== 0)
{
/* aller vers zone 7 */
direction=MangerGommesZone(info,"zone7");
}
else if (perso->nbre_gomme_zone[6] == 0 && perso->nbre_gomme_zone[0]> 0)
{
/* aller vers zone 1 */
direction=MangerGommesZone(info,"zone1");
}
/* si il n'y a pas de gommes dans les deux zones adjacentes on regarde les zones suivantes*/
else if (perso->nbre_gomme_zone[0]== 0 && perso->nbre_gomme_zone[6] == 0)
{
/* test des zones suivantes pour savoir si il y a des gommes dedans */
if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[5] == 0)
{
/* si il n'y en a pas on test les deux zones suivantes */
if ((perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[4] > 0) || (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[4] == 0))
{
/* si il n'y en a pas on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
else if (perso->nbre_gomme_zone[2] > 0 && perso->nbre_gomme_zone[4] == 0)
{
/* aller vers zone 1 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[2] == 0 && perso->nbre_gomme_zone[4] > 0)
{
/* aller vers zone 7 */
direction=M_PI;
}
}
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[5] > 0)
{
/* si il n'y en a pas ou qu'il y en a dans les deux zones on se dirige vers la zone la plus proche */
direction=ZonePlusPres(info);
}
/* si il y a des gommes dans une des zones suivantes on va dans la direction de cette zone */
else if (perso->nbre_gomme_zone[1] > 0 && perso->nbre_gomme_zone[5] == 0)
{
/* aller vers la zone 1 */
direction=M_PI_2;
}
else if (perso->nbre_gomme_zone[1] == 0 && perso->nbre_gomme_zone[5] > 0)
{
/* aller vers la zone 7 */
direction=M_PI;
}
}
}
/*****************************************************/
/******** Si le ploucman est dans zone central *******/
/*****************************************************/
else
{
/* si la vitesse du plouc est inférieure à celle des montres on prend les gommes les plus proches */
if (info->vitesse < 1.3)
{
direction=MangerGommes(info);
}
else
{
/* sinon on se dirige vers la zone la plus proche pour prendre de la vitesse */
direction=ZonePlusPres(info);
}
}
return(direction);
}
/********************************************************************************/
/**********************************Zone plus pres********************************/
/********************************************************************************/
Direction ZonePlusPres(Info * info)
{
Direction direction;
/* Si le ploucman est dans la zone 1 */
if( info->position.x <= 95 && info->position.y < 405 && info->position.y > 95 )
{
if (info->position.y > 250)
{
/*puts("zone 1 plouc bas");*/
direction=-M_PI_2;
}
else
{
/*puts("zone 1 plouc haut");*/
direction=M_PI_2;
}
}
/* Si le ploucman est dans zone 2 */
else if (info->position.y <= 95 && info->position.x <= 95)
{
/* separation de la zone par la diagonale */
if (info->position.x - 0 /* carre left */ > info->position.y - 0 /* carre top */)
{
/*puts("zone 2 plouc haut");*/
direction=M_PI;
}
else
{
/*puts("zone 2 plouc bas");*/
direction=-M_PI_2;
}
}
/* Si le ploucman est dans zone 3 */
else if (info->position.x > 95 && info->position.x < 405 && info->position.y <= 95 )
{
if (info->position.x > 250)
{
/*puts("zone 3 plouc droite");*/
direction=M_PI;
}
else
{
/*puts("zone 3 plouc gauche");*/
direction=.0;
}
}
/* Si le ploucman est dans zone 4 */
else if ( info->position.x >= 405 && info->position.y <= 95)
{
/* separation de la zone par la diagonale */
if (info->position.x - 500 /* carr�right */ > info->position.y - 405 /* carr�back */)
{
/*puts("zone 4 plouc bas");*/
direction=.0;
}
else
{
/*puts("zone 4 plouc haut");*/
direction=-M_PI_2;
}
}
/* Si le ploucman est dans zone 5 */
else if ( info->position.x >= 405 && info->position.y < 405 && info->position.y > 95)
{
if (info->position.y > 250)
{
/*puts("zone 5 plouc bas");*/
direction=-M_PI_2;
}
else
{
/*puts("zone 5 plouc haut");*/
direction=M_PI_2;
}
}
/* Si le ploucman est dans zone 6 */
else if ( info->position.x >= 405 && info->position.y >= 405)
{
/* separation de la zone par la diagonale */
if (info->position.x - 405 /* carr�left */ > info->position.y - 405 /* carr�top */)
{
/*puts("zone 6 plouc haut");*/
direction=M_PI_2;
}
else
{
/*puts("zone 6 plouc bas");*/
direction=.0;
}
}
/* Si le ploucman est dans zone 7 */
else if ( info->position.x > 95 && info->position.x < 405 && info->position.y >= 405 )
{
if (info->position.x > 250)
{
/*puts("zone 7 plouc droite");*/
direction=M_PI;
}
else
{
/*puts("zone 7 plouc gauche");*/
direction=.0;
}
}
/* Si le ploucman est dans zone 8 */
else if ( info->position.y >= 405 && info->position.x <= 95)
{
/* separation de la zone par la diagonale */
if (info->position.x - 0 /* carr�right */ > info->position.y - 500 /* carr�back */)
{
/*puts("zone 8 plouc bas");*/
direction=M_PI;
}
else
{
/*puts("zone 8 plouc haut");*/
direction=M_PI_2;
}
}
/* Si le ploucman est dans la zone central */
else
{
/* separation de la zone par la diagonale */
if (info->position.x - 96 /* carré left */ > info->position.y - 96 /* carré top */)
{
/* reseparation de la zone par la diagonale */
if (info->position.x - 0 > 500 - info->position.y)
{
/*puts("zone central plouc droite");*/
direction=M_PI;
}
else
{
/*puts("zone central plouc haut");*/
direction=M_PI_2;
}
}
else
{
/* reseparation de la zone par la diagonale */
if (500 - info->position.x > info->position.y)
{
/*puts("zone central plouc gauche");*/
direction=.0;
}
else
{
/*puts("zone central plouc bas");*/
direction=-M_PI_2;
}
}
}
return(direction);
}
/********************************************************************************/
/**************************Fonction manger gommes zone***************************/
/********************************************************************************/
Direction MangerGommesZone(Info * info, char * zone)
{
Direction direction;
int i;
float tmpx;
float tmpy;
double finalx;
double finaly;
double longueur;
double longueurfinale;
Perso * perso;
/* raccourci pratique */
perso = (Perso*) info->perso;
longueurfinale = (double)(info->xmax*sqrt(2));
for(i=0;i<info->n_cibles;i++)
{
if(info->cibles[i] == 0)
{
/* Si le ploucman est dans la zone 1 */
if (( zone == "zone1" ) && ( info->pos_cibles[i].x <= 95 && info->pos_cibles[i].y < 405 && info->pos_cibles[i].y > 95 ))
{
/*puts("zone 1 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 2 */
else if (( zone == "zone2") && (info->pos_cibles[i].y <= 95 && info->pos_cibles[i].x <= 95))
{
/*puts("zone 2 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 3 */
else if (( zone == "zone3") && (info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y <= 95) )
{
/*puts("zone 3 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 4 */
else if ((zone == "zone4") && ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y <= 95))
{
/*puts("zone 4 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 5 */
else if (( zone == "zone5") && ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y < 405 && info->pos_cibles[i].y > 95))
{
/*puts("zone 5 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 6 */
else if ((zone == "zone6") && ( info->pos_cibles[i].x >= 405 && info->pos_cibles[i].y >= 405))
{
/*puts("zone 6 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 7 */
else if (( zone == "zone7" ) && ( info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y >= 405 ))
{
/*puts("zone 7 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si le ploucman est dans zone 8 */
else if ((zone == "zone8") && ( info->pos_cibles[i].y >= 405 && info->pos_cibles[i].x <= 95))
{
/*puts("zone 8 plouc mange");*/
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si gomme dans zone central droite */
else if ((zone == "droite") && info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 > info->pos_cibles[i].y - 96) && (info->pos_cibles[i].x - 0 > 500 - info->pos_cibles[i].y))
{
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si gomme dans zone central haut */
else if ((zone == "haut") && info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 > info->pos_cibles[i].y - 96) && (info->pos_cibles[i].x - 0 < 500 - info->pos_cibles[i].y))
{
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si gomme dans zone central gauche */
else if ((zone == "gauche") && info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 < info->pos_cibles[i].y - 96) && (500 - info->pos_cibles[i].x > info->pos_cibles[i].y))
{
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
/* Si gomme dans zone central bas */
else if ((zone == "bas") && info->pos_cibles[i].x > 95 && info->pos_cibles[i].x < 405 && info->pos_cibles[i].y > 95 && info->pos_cibles[i].y < 405 && (info->pos_cibles[i].x - 96 < info->pos_cibles[i].y - 96) && (500 - info->pos_cibles[i].x < info->pos_cibles[i].y))
{
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
}
}
direction = atan2(finaly,finalx);
return (direction);
}
/********************************************************************************/
/******************Fonction nettoyer gommes dans zone central********************/
/********************************************************************************/
Direction NettoyerZoneCentral(Info * info)
{
Direction direction;
Perso * perso;
/* raccourci pratique */
perso = (Perso*) info->perso;
if (info->position.x <= 95 && info->position.x >= 405 && info->position.y <= 95 && info->position.y >= 405)
{
/* si on est pas dans la zone central on va vers elle */
direction=MangerGommes(info);
}
else
{
/* separation de la zone par la diagonale */
if (info->position.x - 96 /* carré left */ > info->position.y - 96 /* carré top */)
{
/* reseparation de la zone par la diagonale */
if (info->position.x - 0 > 500 - info->position.y)
{
/*puts("zone central plouc droite");*/
if (perso->nbre_gomme_zone[8]> 0 )
{
direction=MangerGommesZone(info,"droite");
}
else
{
direction=MangerGommes(info);
}
}
else
{
/*puts("zone central plouc haut");*/
if (perso->nbre_gomme_zone[9]> 0 )
{
direction=MangerGommesZone(info,"haut");
}
else
{
direction=MangerGommes(info);
}
}
}
else
{
/* reseparation de la zone par la diagonale */
if (500 - info->position.x > info->position.y)
{
/*puts("zone central plouc gauche");*/
if (perso->nbre_gomme_zone[10]> 0 )
{
direction=MangerGommesZone(info,"gauche");
}
else
{
direction=MangerGommes(info);
}
}
else
{
/*puts("zone central plouc bas");*/
if (perso->nbre_gomme_zone[11]> 0 )
{
direction=MangerGommesZone(info,"bas");
}
else
{
direction=MangerGommes(info);
}
}
}
}
return(direction);
}
/********************************************************************************/
/**********************Fonction manger gommes la plus proche*********************/
/********************************************************************************/
Direction MangerGommes(Info * info)
{
Direction direction;
int i;
float tmpx;
float tmpy;
double finalx;
double finaly;
double longueur;
double longueurfinale;
Perso * perso;
/* raccourci pratique */
perso = (Perso*) info->perso;
longueurfinale = (double)(info->xmax*sqrt(2));
for(i=0;i<info->n_cibles;i++)
{
if(info->cibles[i] == 0)
{
tmpx = (double)(info->position.x - info->pos_cibles[i].x);
tmpy = (double)(info->position.y - info->pos_cibles[i].y);
longueur = sqrt((tmpx)*(tmpx) + (tmpy)*(tmpy));
if(longueur < longueurfinale)
{
longueurfinale = longueur;
finalx = tmpx;
finaly = tmpy;
}
}
}
direction = atan2(finaly,finalx);
return (direction);
}
void libere_perso(void * perso) {
/* à personnaliser si besoin */
if (perso)
free(perso);
}
/* ne pas modifier cette fonction */
char * identification(void) {
char * ident,* courant;
ident = malloc(100);
sprintf(ident,"Groupe %s (%s)",GROUPE,NOMS);
courant = ident;
while ((courant = (strchr(courant,'_'))))
*courant = ' ';
return ident;
}