Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro Na movimentação do fantasma

Estou com erro na movimentação do fantasma, toda vez que eu seleciono a tecla de movimentação ex. "D", oque movimenta é a linha horizontal do mapa ao inves dos fantasma

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

fogefoge.c

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

//Variavel que permite eu agrupar outras variaveis dentro dela
 MAPA m;
 POSICAO heroi;

 //Fazendo o fantasma andar para um lado
 void Fantasmas() {
    MAPA copia;

    Copiamapa(&copia, &m);

    for(int i = 0; i < copia.linhas; i++) {
        for(int j = 0; j < copia.colunas; j++) {
            if(copia.matriz[i][j] == FANTASMA) {
                if(Ehvalida(&m, i, j+1) && Ehvazia(&m, i, j+1)) {
                    Andanomapa(&m, i, j, i, j+1);
                }
                return;
            }
        }
    }

    Liberamapa(&copia);
}

int acabou() {
    return 0;
 }

 // Variavel para caso se o usuario apertar a tecla errado

 int Ehdirecao(char direcao) {
    return direcao == ESQUERDA ||
            direcao == CIMA||
            direcao == BAIXO ||
            direcao == DIREITA;
 }

 void move(char direcao) {


    //Variavel chamada caso o usuario chame a tecla erra
        if(!Ehdirecao(direcao))
                return;

    // Variaveis de validação para o Pacman andar
    int proximox = heroi.x;
    int proximoy = heroi.y;

    // Permite que eu selecione o lado que eu desejo ir
    switch(direcao) {
        
    // se eu apertar a seta para a esquerda mostra o pac man um pouco para a esquerda    
    case ESQUERDA:
            proximoy--;
            break;

     case CIMA:
        proximox--;
        break;

     case BAIXO:
       proximox++;
        break;

     case DIREITA:
        proximoy++;
        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() {

    //Chamando a função para ler o mapa
    Lemapa(&m);
    Encontramapa(&m, &heroi, HEROI);

    do {

        imprimemapa(&m);

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

    } while (!acabou());
    
    //Liberação de memoria s
   Liberamapa(&m);

}

 
Mapa.C

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

//Variavel e função criada para criada para o mapa auxiliar
void Copiamapa(MAPA* destino, MAPA* origem) {
    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;

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

        //função que recebe um array de chaves
        strcpy(destino->matriz[i], origem->matriz[i]);    
    
    }
}

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

    char personagem = m->matriz[xorigem][yorigem];
    m->matriz[xdestino][ydestino] = personagem;
    m->matriz[xorigem][yorigem] = VAZIO;
}

int Ehvalida(MAPA* m, int x, int y) {
     //Metodo que não permite o Pacman passar das limitações do mapa
    if(x >= m->linhas)
        return 0;
    
    if(y >= m->colunas)
        return 0;

        return 1;
}

int Ehvazia(MAPA* m, int x, int y) {
     return m->matriz[x][y] = VAZIO;       
}

void Encontramapa(MAPA* m, POSICAO* p, char c) {
    
    // Metodo que  acha a posição do pac man OBs: Porem ele guarda uma posição fixa
    for( int i = 0; i < m->linhas; i++) {
        for(int j = 0; j < m->colunas; j++) {
            if(m->matriz[i][j] == 'c') {
                p->x = i;
                p->y = j;
                break;
            }
        }
    }
 
}
int Liberamapa(MAPA* m) {

         for(int i = 0; i < m->linhas; i++) {
        free(m->matriz[i]);
    }

        free(m->matriz);
    }
    void Alocamapa(MAPA* m) {

     // Tornando o mapa mais flexivel
    m->matriz = malloc(sizeof(char*) * m->linhas);
    for(int i = 0; i < m->linhas; i++) {
        m->matriz[i] = malloc(sizeof(char) * (m->colunas +1));
        }   

    }
    void Lemapa(MAPA* m) {
        
        //Ponteiro de arquivos
    FILE* f;
    f = fopen("mapa.txt", "r");
    if(f == 0) {
        printf("Erro na leitura do mapa\n");
        exit(1);
    }
   
    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));

    Alocamapa(m);

    for(int i = 0; i < 5; i++) {
        fscanf(f, "%s", m->matriz[i]);
    }

    //Fechando o arquivo
    fclose(f);

}
void imprimemapa(MAPA* m) {

  
    for(int i = 0; i < 5; i++) {
        printf("%s\n", m->matriz[i]);
    }

}
3 respostas
MAPA.H

#define HEROI '@'
#define FANTASMA 'F'
#define VAZIO '.'
#define PAREDE_VERTICAL '|'
#define PAREDE_HORIZONTAL '-'

struct mapa {
    char** matriz;
    int linhas;
    int colunas;
};

typedef struct mapa MAPA;

struct posicao {
    int x;
    int y;
};

typedef struct posicao POSICAO;

int Liberamapa(MAPA* m);
void Lemapa(MAPA* m);
void Alocamapa(MAPA* m);
void imprimemapa(MAPA* m);
void Encontramapa(MAPA* m, POSICAO* p, char c);
int Ehvalida(MAPA* m, int x, int y);
int Ehvazia(MAPA* m, int x, int y);
int Andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino);
void Copiamapa(MAPA* destino, MAPA* origem);

Fogefoge.H

//Criação de constancias
#define CIMA 'w'
#define BAIXO 's'
#define DIREITA 'd'
#define ESQUERDA 'a'

void move(char direcao);
int acabou();
int Ehdirecao(char direcao);
void Fantasma();


solução!

Oii, Marcelo! Tudo bem?

O problema na movimentação do fantasma pode estar relacionado com a função Fantasmas(). Nela, é verificado se a posição à direita do fantasma é válida e vazia, e caso seja, você move o fantasma para essa posição, porém, é retornado logo após mover o fantasma, o que faz com que apenas o primeiro fantasma seja movido.

Como sugestão, seria alterar a estrutura da função Fantasmas() para um loop que percorra todos os fantasmas no mapa e mova cada um deles. Dessa forma, todos os fantasmas serão movidos corretamente, um por vez.

Espero que a sugestão seja um bom ponto de partida.

Continue interagindo no fórum compartilhando suas dúvidas, projetos e sugestões.

Bons estudos, Marcelo!

Boa Noite estou bem sim e a Senhora?

Consegui arrumar, eu tinha errado duas letras.

Obrigado pelo seu tempo