Пример #1
0
//objet sous le mur (0=rien, 1=bombe,2= deto,3=puissance,10=bombe posée) 
void Perso::action(Map *carte)
{
	int j = (mPosY + 22) / 45;
	int i = (mPosX + 22) / 45;

	switch (act)
	{
	case 0: break;
	case 1: poseBombe(carte);  break;
	case 2: actdeto(carte); break;
	}
	switch ((*((*carte).getij(i, j))).getob())
	{
	case 0:break;
	case 1: ramBomb(); break;
	case 2:ramDeto(); break;
	case 3:ramPuiss(); break;
	}
	if ((*((*carte).getij(i, j))).getob() != 10)
	{
		(*((*carte).getij(i, j))).pObjet(0);
	}
}
Пример #2
0
int prochaineCase(Square** carte, Position actuelle, Perso* joueur, SDL_Window* window, SDL_Surface* screenSurface)
{
    int i,j, dir, hopDone=0, enDanger=0, cpt_caseSafe=0;
    CaseIA caseSafe[61];                                                /*Tableau qui va stocker les cases safe dans le range de pas de l'IA*/
    CaseIA parcourue;                                                   /*On va stocker toutes les cases safes dans un tableau, logiquement les premières seront donc les plus proches */
    for(i=0; i<61; ++i)
        caseSafe[i].hopNb =-1;                                          /*Si le hopNb est à -1, on saura que la case n'a pas été initialisée et n'est pas safe. On utilise un compteur pour savoir où on en est dans le tableau*/

    if(carte[actuelle.x][actuelle.y].danger==1)
        enDanger=1;

    CaseIA** tab_path = (CaseIA**)malloc(longueur_map*sizeof(CaseIA*));     /*Carte des déplacements de l'IA avec un "rayon" de tant de pas*/
    for(i=0; i<longueur_map; i++)
        tab_path[i] = (CaseIA*)malloc(hauteur_map*sizeof(CaseIA));

     for(i=0; i<longueur_map; ++i)                                          /*On rempli le tablea avec les valeurs par défaut*/
         for(j=0; j<hauteur_map; ++j)
         {
             tab_path[i][j].hopNb = -1;
             tab_path[i][j].posCase.x = i;
             tab_path[i][j].posCase.y = j;
             tab_path[i][j].posCasePrec.x = tab_path[i][j].posCasePrec.y = -1;
         }
    i=j=0;
    tab_path[actuelle.x][actuelle.y].hopNb=0;                               /*On met le pas à 0 pour la case où est le joueur*/

    while(hopDone<5)                                                        /*Tant qu'on a pas fait 5 sauts*/
    {
        ++hopDone;
        for(i=0; i<longueur_map; ++i)                                       /*On parcourt la dimension longueur du tableau*/
        {
            dir=0;
            for(j=0; j<hauteur_map; ++j)                                    /*On parcourt la dimension hauteur du tableau*/
            {
                if(tab_path[i][j].hopNb == hopDone-1)                       /*Si la case vaut le nombre de pas auquels on en est -1*/
                {
                    /*printf("i+1: %d, lMap: %d, typeBloc: %d, radius %d", i+1, longueur_map, carte[i+1][j].bloc.type, carte[i+1][j].bombe.radius);*/
                    if(i+1<longueur_map && carte[i+1][j].bloc.type==0 && carte[i+1][j].bombe.radius==0 && tab_path[i+1][j].hopNb==-1) /*On regarde la case de droite et on la stocke dans tab_path: DROITE*/
                    {
                        tab_path[i+1][j].hopNb=hopDone;
                        tab_path[i+1][j].posCasePrec.x=i;
                        tab_path[i+1][j].posCasePrec.y=j;

                        if(carte[i+1][j].danger == 0)           /**/
                        {
                            caseSafe[cpt_caseSafe].hopNb=hopDone;
                            caseSafe[cpt_caseSafe].posCase.x = i+1;
                            caseSafe[cpt_caseSafe].posCase.y = j;
                            caseSafe[cpt_caseSafe].posCasePrec.x=i;
                            caseSafe[cpt_caseSafe].posCasePrec.y=j;
                            ++cpt_caseSafe;
                        }

                    }
                    if(i-1>0 && carte[i-1][j].bloc.type==0 && carte[i-1][j].bombe.radius==0 && tab_path[i-1][j].hopNb==-1) /*On regarde la case de gauche: GAUCHE*/
                    {
                        tab_path[i-1][j].hopNb=hopDone;
                        tab_path[i-1][j].posCasePrec.x=i;
                        tab_path[i-1][j].posCasePrec.y=j;

                        if(carte[i-1][j].danger == 0)
                        {
                            caseSafe[cpt_caseSafe].hopNb=hopDone;
                            caseSafe[cpt_caseSafe].posCase.x = i-1;
                            caseSafe[cpt_caseSafe].posCase.y = j;
                            caseSafe[cpt_caseSafe].posCasePrec.x=i;
                            caseSafe[cpt_caseSafe].posCasePrec.y=j;
                            ++cpt_caseSafe;
                        }
                    }
                    if(j+1<longueur_map && carte[i][j+1].bloc.type==0 && carte[i][j+1].bombe.radius==0 && tab_path[i][j+1].hopNb==-1)   /*On regarde la case du dessous: BAS*/
                    {
                        tab_path[i][j+1].hopNb=hopDone;
                        tab_path[i][j+1].posCasePrec.x=i;
                        tab_path[i][j+1].posCasePrec.y=j;

                        if(carte[i][j+1].danger == 0)
                        {
                            caseSafe[cpt_caseSafe].hopNb=hopDone;
                            caseSafe[cpt_caseSafe].posCase.x = i;
                            caseSafe[cpt_caseSafe].posCase.y = j+1;
                            caseSafe[cpt_caseSafe].posCasePrec.x=i;
                            caseSafe[cpt_caseSafe].posCasePrec.y=j;
                            ++cpt_caseSafe;
                        }
                    }
                    if(j-1>0 && carte[i][j-1].bloc.type==0 && carte[i][j-1].bombe.radius==0 && tab_path[i][j-1].hopNb==-1)   /*On regarde la case du dessus: HAUT*/
                    {
                        tab_path[i][j-1].hopNb=hopDone;
                        tab_path[i][j-1].posCasePrec.x=i;
                        tab_path[i][j-1].posCasePrec.y=j;

                        if(carte[i][j-1].danger == 0)
                        {
                            caseSafe[cpt_caseSafe].hopNb=hopDone;
                            caseSafe[cpt_caseSafe].posCase.x = i;
                            caseSafe[cpt_caseSafe].posCase.y = j-1;
                            caseSafe[cpt_caseSafe].posCasePrec.x=i;
                            caseSafe[cpt_caseSafe].posCasePrec.y=j;
                            ++cpt_caseSafe;
                        }
                    }
                }
            }
        }
    }

    /*On a fini de remplir les deux tableaux */
    /*printf de test*/
    /*printf("Tableau Path:\n");
    for(i=0; i<hauteur_map; ++i)
    {
        for(j=0; j<longueur_map; ++j)
        {
            if(tab_path[j][i].hopNb==-1)
                printf("%d", tab_path[j][i].hopNb);
            else
                printf(" %d", tab_path[j][i].hopNb);
        }

        printf("\n");
    }
    printf("\nLOLELOLELOL\n");

    afficherSafety(carte);

    printf("\nSUPERCLAPIER\n");
    for(i=0; caseSafe[i].hopNb!=-1; ++i)
        printf("case numero %d: hop %d, XSafe %d, Ysafe %d\n", i, caseSafe[i].hopNb, caseSafe[i].posCase.x, caseSafe[i].posCase.y);*/
    /*fin printf de test*/

    /*On va enfin commencer à chercher la case où on vas se déplacer*/
    hopDone=6; /*Je sais même pas pouquroi je fais ça mais j'ose pas l'enlever vu que ça fonctionne*/

    if(enDanger)       /*Si on est en danger, on cherche la case safe la plus proche*/
    {
        if(caseSafe[0].hopNb!=-1)       /*On va à la case safe la plus proche*/
        {

            parcourue = caseSafe[0];
            while(parcourue.hopNb >=1)
            {
                if(parcourue.hopNb==1) /*On cherche la direction où il faut aller*/
                {
                    if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y-1)
                        return HAUT;
                    else if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y+1)
                        return BAS;
                    else if(parcourue.posCase.x == actuelle.x-1 && parcourue.posCase.y == actuelle.y)
                        return GAUCHE;
                    else if(parcourue.posCase.x == actuelle.x+1 && parcourue.posCase.y == actuelle.y)
                        return DROITE;


                }
                parcourue = tab_path[parcourue.posCasePrec.x][parcourue.posCasePrec.y];
            }
        }
        /*Si aucune case safe à moins de 5 cases, l'IA accepte son destin*/
        return -1;
    }
    else /*Si n'est pas en danger*/ /*Gère la pose de bombe*/
    {
        int bCpt=0;
        int caseRand, tRand=0;
        while(caseSafe[tRand].hopNb !=-1 && caseSafe[tRand].hopNb==1)
            ++tRand;

        /*On va chercher si dans le tableau des cases safes, il y a une case qui n'est pas soit sur le même x ni le même y*/
        /*Si il en existe une on va essayer "d'y aller": si on passe par des cases de danger, on break et on fait le mouvement random*/
        if(rand() %4 ==1)   /*Une chance sur 4 de poser une bombe en cas de de possibilité sinon random*/
        {
            while(caseSafe[bCpt].hopNb != -1)
            {
                if(caseSafe[bCpt].posCase.x != actuelle.x && caseSafe[bCpt].posCase.y != actuelle.y)
                {
                    parcourue = caseSafe[bCpt];
                      while(1)
                      {
                            if(carte[parcourue.posCasePrec.x][parcourue.posCasePrec.y].danger == 1)
                                break;

                            if(parcourue.hopNb==1) /*On cherche la direction où il faut aller*/
                            {
                                i=0;
                                j=1;
                                int trucAtaper=0;
                                while(i<4)  /*On va chercher si une des case autour est explosable ou s'il y a un joueur auquel cas trucAtaper vayt 1 et on pose une bombe*/
                                {

                                    while(j<joueur->radius+1)
                                    {
                                        switch(i)
                                        {
                                            case 0:
                                                if(actuelle.y-j <0)
                                                    j=joueur->radius;
                                                else
                                                {
                                                    if(carte[actuelle.x][actuelle.y-j].bloc.type >0 || (carte[actuelle.x][actuelle.y-j].idJoueur!=-1 && carte[actuelle.x][actuelle.y-j].idJoueur!=joueur->id))
                                                    {
                                                        trucAtaper=1;
                                                        j=joueur->radius;
                                                        i=5;
                                                    }

                                                }
                                                break;
                                            case 1:
                                                if(actuelle.y+j >hauteur_map-1)
                                                    j=joueur->radius;
                                                else
                                                {
                                                    if(carte[actuelle.x][actuelle.y+j].bloc.type >0 || (carte[actuelle.x][actuelle.y+j].idJoueur!=-1 && carte[actuelle.x][actuelle.y+j].idJoueur!=joueur->id))
                                                    {
                                                        trucAtaper=1;
                                                        j=joueur->radius;
                                                        i=5;
                                                    }
                                                }
                                                break;
                                            case 2:
                                                if(actuelle.x-j <0)
                                                    j=joueur->radius;
                                                else
                                                {
                                                    if(carte[actuelle.x-j][actuelle.y].bloc.type >0 || (carte[actuelle.x-j][actuelle.y].idJoueur!=-1 && carte[actuelle.x-j][actuelle.y].idJoueur!=joueur->id))
                                                    {
                                                        trucAtaper=1;
                                                        j=joueur->radius;
                                                        i=5;
                                                    }
                                                }
                                                break;
                                            default:
                                                if(actuelle.x+j >longueur_map-1)
                                                    j=joueur->radius;
                                                else
                                                {
                                                    if(carte[actuelle.x+j][actuelle.y].bloc.type >0 || (carte[actuelle.x+j][actuelle.y].idJoueur!=-1 && carte[actuelle.x+j][actuelle.y].idJoueur!=joueur->id))
                                                    {
                                                        trucAtaper=1;
                                                        j=joueur->radius;
                                                        i=5;
                                                    }
                                                }
                                                break;
                                        }
                                        ++j;
                                    }
                                    j=1;
                                    ++i;
                                }

                                if(trucAtaper)
                                    poseBombe(carte, joueur, window, screenSurface);

                                if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y-1)
                                    return HAUT;
                                else if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y+1)
                                    return BAS;
                                else if(parcourue.posCase.x == actuelle.x-1 && parcourue.posCase.y == actuelle.y)
                                    return GAUCHE;
                                else if(parcourue.posCase.x == actuelle.x+1 && parcourue.posCase.y == actuelle.y)
                                    return DROITE;
                            }
                            parcourue = tab_path[parcourue.posCasePrec.x][parcourue.posCasePrec.y];
                      }
                }
                ++bCpt;
            }
        }

        /*mouvement random: par défaut*/
        if (tRand !=0)
        {
            caseRand = rand() % (tRand);
            parcourue = caseSafe[caseRand];
        }
        if(parcourue.hopNb==1) /*On cherche la direction où il faut aller*/
        {
            if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y-1)
                return HAUT;
            else if(parcourue.posCase.x == actuelle.x && parcourue.posCase.y == actuelle.y+1)
                return BAS;
            else if(parcourue.posCase.x == actuelle.x-1 && parcourue.posCase.y == actuelle.y)
                return GAUCHE;
            else if(parcourue.posCase.x == actuelle.x+1 && parcourue.posCase.y == actuelle.y)
                return DROITE;


        }
        return -1;


    }

    for(i=0; i<longueur_map; i++)
        free(tab_path[i]);

    free(tab_path);

    return 0;               /*Retourne BAS, HAUT, GAUCHE, DROITE*/
}