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

Erro na execução.

Olá. O meu código está compilando normalmente, mas quando tento executar o windows encerra o programa automaticamente logo após eu dar o primeiro comando. Alguém pode me ajudar, por que aparentemente está tudo igual ao que o Maurício está fazendo

O fogefoge.c é esse até agora.

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

MAPA m;
POSICAO heroi;

int paraondeofastasmavai(int xatual, int yatual,
 int* xdestino, int* ydestino) {

    int opcoes[4][2] = {
        { xatual, yatual +1 },
        { xatual +1, yatual },
        { xatual, yatual -1 },
        { xatual -1, yatual }
    };

    srand(time(0));
    for(int i = 0; i < 5; i++){
        int posicao = rand() % 4;

        if(podeandar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1])) {

            *xdestino = opcoes[posicao][0];
            *ydestino = opcoes[posicao][1];

            return 1;
        }
    }

    return 0;

}

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.matriz[i][j] == FANTASMA){

                    int xdestino;
                    int ydestino;

                    int encontrou = paraondeofastasmavai(i, j, &xdestino, &ydestino);

                    if(encontrou){
                        andanomapa(&m, i, j, xdestino, ydestino);
                    }

            }
        }
    }

    liberamapa(&copia);

}

int acabou(){
    POSICAO pos;

    int perdeu = !encontramapa(&m, &pos, HEROI);
    int ganhou = !encontramapa(&m, &pos, FANTASMA);

    return ganhou || perdeu;

}

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

void move(char direcao) {

    if(!ehdirecao(direcao))
        return;

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

    switch(direcao){
        case ESQUERDA:
            proximoy--;
            break;
        case DIREITA:
            proximoy++;
            break;
        case CIMA:
            proximox--;
            break;
        case BAIXO:
            proximox++;
            break;
    }

    if(!podeandar(&m, HEROI, proximox, proximoy))
        return;

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

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

int main(){

    lemapa(&m);
    encontramapa(&m, &heroi, HEROI);

    do{

        imprimemapa(&m);

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

    }while(!acabou());



    liberamapa(&m);
}
``
9 respostas

Ola tudo bom? O que eu entendi, posso não estar certo, pois não pude compilar o código eu mesmo por falta do header file e da definição da função encontramapa, é que na sua função acabou:

int acabou(){
    POSICAO pos;

    int perdeu = !encontramapa(&m, &pos, HEROI);
    int ganhou = !encontramapa(&m, &pos, FANTASMA);

    return ganhou || perdeu;

}

Você esta declarando uma POSICAO pos, que creio ser uma estrutura com coordenadas x,y e passando esta para sua função encontramapa procurar o HEROI e FANTASMA, no entanto 'pos' ainda não foi populada, por tanto os valores de x e y são seus endereços, então o HEROI e o FANTASMA realmente nunca serão encontrados pois então sendo procurados numa posição que não existe,por tanto acabou() irá retornar 1, encerrando o jogo.

Populada, como assim ?

Oi Otávio,

Esse código parece estar correto. Entretanto ele depende do mapa.c, que por sua vez depende do mapa.txt. O problema pode estar nesses arquivos. Consegue postar eles aqui pra gente dar uma olhada? Com os arquivos do professor junto com seu código, tudo funciona.

Oi Gabriel,

Posso sim, aqui está 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; origem->linhas; i++){
        strcpy(destino->matriz[i], origem->matriz[i]);
    }

}

void andanomapa(MAPA* m, int xorigem, int yorigem, int destinox, int destinoy) {

    char personagem = m->matriz[xorigem][yorigem];
    m->matriz[destinox][destinoy] = personagem;
    m->matriz[xorigem][yorigem] = VAZIO;
}

int ehvalida(MAPA* m, int x, int y) {
    if(x >= m->linhas)
        return 0;
    if(y >= m->colunas)
        return 0;

    return 1;
}

int ehparede(MAPA* m, int x, int y) {
     return 
        m->matriz[x][y] == PAREDE_VERTICAL ||
        m->matriz[x][y] == PAREDE_HORIZONTAL;
}

int ehpersonagem(MAPA* m, char personagem, int x, int y) {
    return
        m->matriz[x][y] == personagem;
}

int podeandar(MAPA* m, char personagem, int x, int y) {
    return
        ehvalida(m, x, y) &&
        !ehparede(m, x, y) &&
        !ehpersonagem(m, personagem, x, y);
}

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

    free(m->matriz);
}
void alocamapa(MAPA* m) {
    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) {

    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 < m->linhas; i++){
        fscanf(f, "%s", m->matriz[i]);
    }

    fclose(f);

}

void imprimemapa(MAPA* m){

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

int encontramapa(MAPA* m, POSICAO* p, char c) {

    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;
                return 1;

            }
        }
    }
    return 0;
}

E o mapa.txt :

5 10
|--------|
|.F.|....|
|..-|.@..|
|.F......|
|--------|

Populada significa que não foi atribuída nenhum valor a ela, por exemplo:

int x;

Ao fazer isto você esta declarando um um inteiro, porém a este não foi atribuído valor algum, não foi populado. Se você ainda estiver tendo problemas com o código, por favor poste todos o arquivos .c e .h necessários para compilação para que possa analisar melhor o código.

Oi Guilherme, ainda não consegui encontrar o problema. Então vou postar abaixo os arquivos .h . O mapa.c e o fogefoge.c eu já postei, então não irei colocá-los aqui novamente.

fogefoge.h :

#define CIMA 'w'
#define BAIXO 's'
#define DIREITA 'd'
#define ESQUERDA 'a'

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

int ehdirecao(char direcao);

void fantasmas();

int paraondeofastasmavai(int xatual, int yatual, int* xdestino, int* ydestino);

mapa.h :

#define HEROI '@'
#define VAZIO '.'
#define FANTASMA 'F'
#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;

void liberamapa(MAPA* m);
void lemapa(MAPA* m);
void alocamapa(MAPA* m);
void imprimemapa(MAPA* m);
int encontramapa(MAPA* m, POSICAO* p, char c);

int ehvalida(MAPA* m, int x, int y);
int ehparede(MAPA* m, int x, int y);
void andanomapa(MAPA* m, int xorigem, int yorigem, int destinox, int destinoy);

void copiamapa(MAPA* destino, MAPA* origem);
int podeandar(MAPA* m, char personagem, int x, int y);

int ehpersonagem(MAPA* m, char personagem, int x, int y);
solução!

Na sua função "copiamapa":

void copiamapa(MAPA* destino, MAPA* origem) {
    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;

    alocamapa(destino);
    for(int i = 0; origem->linhas; i++){ //<- erro
        strcpy(destino->matriz[i], origem->matriz[i]);
    }

}

Está faltando um limite no loop. Assim deve funcionar:

void copiamapa(MAPA* destino, MAPA* origem) {
    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;

    alocamapa(destino);
    for(int i = 0; i < origem->linhas; i++){ //<- corrigido
        strcpy(destino->matriz[i], origem->matriz[i]);
    }

}

Olá pessoa, mais um problema surgiu e ñ consigo identificar o erro. Quando tento compilar o código, o seguinte erro está aparecendo :

mapa.c: In function 'void alocamapa(MAPA*)':
mapa.c:61:20: error: invalid conversion from 'void*' to 'char**' [-fpermissive]
  m->matriz = malloc(sizeof(char*) * m->linhas);
                    ^
mapa.c:64:25: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
    m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));

Após feito a correção citada anteriormente o código deveria funcionar. Se você mudou o código além da correção, por favor poste as alterações ou crie um novo tópico.