1
resposta

[Dúvida] O personagem nao se movimenta igual na aula

#include <stdio.h>
#include <stdlib.h>
#include "foge_fogeBiblioteca.h"//biblioteca local se inclui com aspas duplas


//variaveis de escopo aberto ou variaveis globais .
char** mapa;
int linhas;
int colunas;
int i,j;

void liberaMapa();
void lemapa();
void alocamapa();
void imprimeMapa();
int acabou();
void move(char direcao);

int main (){
/*Alocacao estatica*/

 lemapa();
    do
    {

        imprimeMapa();

        char comando;

        scanf(" %c",&comando);

        move(comando);

    } while (!acabou());




   liberaMapa();

}

void liberaMapa(){

    for ( i = 0; i < linhas; i++)
    {
        free(mapa[i]);
    }

    free(mapa);
}
void alocamapa(){

     mapa = malloc(sizeof(char*) * linhas);

    for ( i = 0; i < linhas; i++)
    {
       mapa[i] = malloc( sizeof( char ) * ( colunas + 1 ) );
    }

};

void lemapa(){

    FILE* f;
    f = fopen("mapa.txt","r");

    if(f == 0){
        printf("Erro ao carregar o mapa");
        exit(1);
    }   

    fscanf(f, "%d %d" ,&linhas,&colunas);//recebe o valor de linhas e colunas do arquivo mapa.txt e armazena nas variaveis correspondentes 
    printf("Linhas %d ,Colunas %d\n",linhas,colunas);

    ///////////////////////////////-Alocaçao dinamica-/////////////////////////////////
   alocamapa();

    ///////////////////////////////////////////////////////////////////////////////////

    for ( i = 0; i < 4; i++)
    {
            fscanf(f, "%s",mapa[i]);
    }
 fclose(f);

}

void imprimeMapa(){
    for ( i = 0; i < 4; i++)
    {
        printf(" %s\n",mapa[i]);
    }
}

int acabou(){

    return 0;

}

void move(char direcao){
    int x;
    int y;

    for ( i = 0; i < linhas; i++)
    {
       for ( j = 0; j < colunas; j++)
       {
            if (mapa[i][j] == '@')
            {
                x = i;
                y = j;
                break;
            }

       }

    }

    switch (direcao)
    {
        case 'a':
            mapa[x][y-1] = '@';
            break;
        case 'w':
            mapa[x-1][y] = '@';
            break;
        case 's':
            mapa[x+1][y] = '@';
            break;
        case 'd':
            mapa[x][y+1] = '@';
            break;
    }



}
1 resposta

Olá, Daniel! Tudo bem?

No código tem um probleminha na função move(). Ela apenas atualiza o mapa com o símbolo @ nas novas coordenadas, mas não remove o símbolo da posição anterior do personagem. Isso faz com que ele pareça não se mover.

Para corrigir isso, você precisa definir a posição anterior do personagem para um símbolo diferente (por exemplo, um espaço em branco) antes de atualizar sua posição com o novo símbolo. Algo assim:

switch (direcao)
{
    case 'a':
        mapa[x][y] = ' '; // remove o personagem da posição anterior
        mapa[x][y-1] = '@'; // atualiza a nova posição do personagem
        break;
    case 'w':
        mapa[x][y] = ' ';
        mapa[x-1][y] = '@';
        break;
    case 's':
        mapa[x][y] = ' ';
        mapa[x+1][y] = '@';
        break;
    case 'd':
        mapa[x][y] = ' ';
        mapa[x][y+1] = '@';
        break;
}

Veja se isso soluciona o erro. Estou à disposição para ajudar :)

Abraços e ótimos estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software