1
resposta

[Projeto] Continuando o jogo

FogeFoge.c

#include <stdio.h>
#include <stdlib.h>
#include "FogeFoge.h"
#include "Mapa.h"

MAPA m;
POSICAO heroi;

int acabou ()
{
    return 0;
}

void move(char direcao)
{
    m.matriz[heroi.x][heroi.y] = '.';

    switch(direcao)
    {
        case 'a':
            m.matriz[heroi.x][(heroi.y)-1] = '@';
            heroi.y--;
            break;
        case 'w':
            m.matriz[(heroi.x)-1][heroi.y] = '@';
            heroi.x--;
            break;
        case 's':
            m.matriz[(heroi.x)+1][heroi.y] = '@';
            break;
            heroi.x++;
        case 'd':
            m.matriz[heroi.x][(heroi.y)+1] = '@';
            heroi.y++;
            break;

    }
   
}

int main()
{
    lemapa(&m);
    encontramapa(&m, &heroi, '@');
    do
    {
        imprimemapa(&m);

        char comando;
        scanf(" %c", &comando);
        move(comando);
    }
    while (!acabou());
   
    liberamapa(&m);

}

FogeFoge.h

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

Mapa.c

#include <stdio.h>
#include <stdlib.h>
#include "Mapa.h"


void encontramapa(MAPA* m, POSICAO* p, char c)
{
     for(int i = 0; i < (m->linhas); i++) //posição do FOGE-FOGE
    {
        for(int j = 0; j < (m->colunas); j++)
        {
            if(m->matriz[i][j] == c)
            {
                p->x = i;
                p->y = j;
                break;
            }
        }
    }
}



void liberamapa(MAPA* m)
{
    //liberando variavel //tem que usar 'for' primeiro para liberar cada item da matriz
    for(int i = 0; i < (m->linhas); i++) // -> ponteiro de MAPA* m
    {
        free(m->matriz[i]);
    }
    free(m->matriz);
}

void alocamapa(MAPA* m)
{
    /*função malloc aloca um bloco de memória dinâmicamente // função sizeof da o tamanho de bytes do que estive dentro do ()
    para ponteiro e array que são ponteiros // ** para matrizes que são ponteiros de ponteiros*/
    (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\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]);
   }
    fclose(f);
}

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

Mapa.h

struct mapa //estrtutura de variáveis //agrupa variáveis
{
    char** matriz;
    int linhas;
    int colunas;
}; //atenção a o ; no final
typedef struct mapa MAPA; //Função typedef possibilita dar apelidos - definir, escrevendo primeiro o que voce tem e depois o apelido

struct posicao
{
    int x;
    int y;
};
typedef struct posicao POSICAO;

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

mapa.txt

5 10
|--------|
|...|..-.|
|..-|.@..|
|......-.|
|--------|
1 resposta

Olá, Matheus! Tudo bem?

Parece que você está progredindo bem com o projeto Foge-Foge.

No entanto, eu notei um pequeno erro no seu código que pode estar causando problemas. Na função move, no caso 's', você colocou a linha heroi.x++; depois do break;. Isso significa que essa linha de código nunca será executada. O correto seria:

case 's':
    m.matriz[(heroi.x)+1][heroi.y] = '@';
    heroi.x++;
    break;

Bons 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