Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] bug na movimentação do fantasma

estou com alguns problemas, o primeiro é que só um dos fantasmas esta se movendo, só não tenho certeza se é um bug ou sera resolvido em outro video da aula 3, e o segundo é que mesmo chamando a função ehvazia(&m, i, j+1) dentro do if que verifica se o fantasma pode andar ele simplesmente ignora o ehvazia e passa direto pela parede.

fogefoge.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fogefoge.h"
#include "mapa.h"

MAPA m;

POSIÇÃO heroi;

void fantasmas(){

    MAPA copia;

    copiamapa(&copia, &m);

    for(int i = 0; i <= m.linhas; i++){

        for(int j = 0; j < m.colunas; j++){

            if(copia.mapa[i][j] == FATASMA){

                if(ehvalida(&m, i, j+1) && ehvazia(&m, i, j+1)){

                    andanomapa(&m, i, j, i, j+1);
                }
                return;
            }
        }
    }

    liberamapa(&copia);
}

void encontraheroi(){

    for(int i = 0; i < m.linhas; i++){

        for(int j = 0; j < m.colunas; j++){

            if(m.mapa[i][j] == HEROI){

                heroi.x = i;
                heroi.y = j;
                break;
            }
        }
    }
}


int acabou(){

    return 0;
}



int ehdirecao(char direção){

    return direção == ESQUERDA ||
           direção == DIREITA ||
           direção == CIMA ||
           direção == BAIXO;
}

void move(char direção){

    if(!ehdirecao(direção))
        return;

    int proximox = heroi.x;
    int proximoy = heroi.y;
    

    switch (direção){

        case ESQUERDA:
            proximoy--;
            break;

        case DIREITA:
            proximoy++;
            break;
        
        case BAIXO:
            proximox++;
            break;

        case CIMA:
            proximox--;
            break;
    }

    if(!ehvalida(&m, proximox, proximoy))
        return;

    if(!ehvazia(&m, proximox, proximoy))
        return;

    andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
    heroi.x = proximox;
    heroi.y = proximoy; 
}

int main(){

    lemapa(&m);
    encontraheroi();
    
    do{

        desenhamapa(&m);

        char comando;
        scanf(" %c", &comando);

        move(comando);
        fantasmas();

    }while (!acabou());
    

    liberamapa(&m);


}    

fogefoge.h :

#define CIMA 'w'
#define BAIXO 's'
#define ESQUERDA 'a'
#define DIREITA 'd'
#define PAREDE_H '-'
#define PAREDE_V '|'
#define HEROI '@'
#define FATASMA 'F'

void move(char direção);
int acabou();
void encontraheroi();

int ehdirecao(char direção);
void fantasmas();

struct ffposição{

    int y;
    int x;
};

typedef struct ffposição POSIÇÃO;

mapa.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mapa.h"


void copiamapa(MAPA* destino, MAPA* origem){

    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;

    alocamapa(destino);
    
    for(int i = 0; i < origem->linhas; i++){

        strcpy(destino->mapa[i], origem->mapa[i]);
    }
}

int ehvalida(MAPA* m, int x, int y){

    if(x >= m->linhas)
        return 0;
    if(y >= m->colunas)
        return 0;

    return 1;
}

int ehvazia(MAPA* m, int x, int y){

    return m->mapa[x][y] == VAZIO;
}

void alocamapa(MAPA* m){

    m->mapa = malloc(sizeof(char*) * m->linhas);
    for(int i = 0; i < m->linhas; i++){

        m->mapa[i] = malloc(sizeof(char) * (m->colunas + 1));
    }
}

void lemapa(MAPA* m){

    FILE* fmap;
    fmap = fopen("ffmap.txt", "r");
    
    if(fmap == 0){

        printf("mapas não encontrados");
        exit(1);
    }

    fscanf(fmap, "%d %d", &(m->linhas), &(m->colunas));

    alocamapa(m);

    for(int i = 0; i < 7; i++){

        fscanf(fmap, "%s", m->mapa[i]);
    }

    fclose(fmap);
}

void desenhamapa(MAPA* m){

    system("cls");
    for(int i = 0; i < 7; i++){

        printf("%s\n", m->mapa[i]);
    }
    
}

void liberamapa(MAPA* m){

    for(int i = 0; i < m->linhas; i++){

        free(m->mapa[i]);
    }
    free(m->mapa);    
}

void andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino){

    char personagem = m->mapa[xorigem][yorigem];
    m->mapa[xdestino][ydestino] = personagem;
    m->mapa[xorigem][yorigem] = '.';
}

mapa.h :

#define VAZIO '.'


struct smapa{

    char** mapa;
    int linhas;
    int colunas;
};

typedef struct smapa MAPA;

void liberamapa(MAPA* m);
void lemapa(MAPA* m);
void desenhamapa(MAPA* m);
void alocamapa(MAPA* m);
void andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino);
int ehvalida(MAPA* m, int x, int y);
int ehvazia(MAPA* m, int x, int y);
void copiamapa(MAPA* destino, MAPA* origem);
1 resposta
solução!

Olá, Kelvyn! Tudo bem?

Como uma parte da estrutura do seu código vai acabar mudando ao decorrer dos outros vídeos dessa aula, indico-lhe que continue a assistir elas, já que esses problemas que você comentou vão acabar sendo resolvidos até o fim desse modulo.

Contudo, caso ainda esteja com algum problema ao chegar no fim desse modulo, peço que venha novamente ao fórum pedindo ajuda e compartilhando o seu código.

No mais, bons estudos!