1
resposta

[Bug] O jogo crasha ao inserir o comando.

O código funciona até a parte de exibir o mapa e receber a entrada do comando, mas após pressionar uma das teclas (w, a, s ou d), o jogo crasha e o windows exibe uma mensagem de erro "pacman.exe parou de funcionar".

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Incluir arquivos de cabeçalho
#include "functions.h"

// Cria uma matriz para guardar o mapa
int linhas, colunas;
char **mapa; // Armazena na forma de ponteiro de ponteiros (**)

void carregarMapa()
{
    // Importa o arquivo contendo o mapa
    FILE *f = fopen("mapa.txt", "r");

    // Verifica erros
    if (f == NULL)
    {
        printf("Não foi possível carregar o mapa\n");
        exit(1);
    }

    // Obtém a quantidade de linhas e colunas (especificada na primeira linha do arquivo)
    fscanf(f, "%d %d", &linhas, &colunas);

    alocaMapa();

    // Para cada linha, armazena os caracteres dessa linha na linha correspondente a ela na matriz
    for (int i = 0; i < linhas; i++)
    {
        // Passar apenas a primeira dimensão da matriz irá acessar a linha por completo
        fscanf(f, "%s", mapa[i]);
    }

    fclose(f);
}

void alocaMapa()
{
    // Cria uma matriz do tamanho do mapa usando alocação de memória dinâmica
    //  Aloca para o mapa a memória dos ponteiros correspontes às linhas (primeira dimensão da matriz)
    mapa = malloc(sizeof(char *) * linhas);
    // Para cada linha alocada, aloca o espaço dos colunas (segunda dimensão da matriz)
    for (int i = 0; i < linhas; i++)
    {
        mapa[i] = malloc(sizeof(char) * (colunas + 1)); // +1 devido ao caractere terminador \0
    }
}

void liberaMapa()
{
    // Libera a memória de cada linha
    for (int i = 0; i < linhas; i++)
    {
        free(mapa[i]);
    }
    // Libera a memória do ponteiro maior
    free(mapa);
}

void imprimeMapa(){
    for (int i = 0; i < linhas; i++)
    {
        // Passar apenas a primeira dimensão da matriz irá acessar a linha por completo
        printf("%s\n", mapa[i]);
    }
}

int acabou(){
    return 0;
}

void mover(char comando){
    int x, y;

    // Varre toda a matriz do mapa para encontrar as atuais coordenadas do player
    for(int i = 0; i > linhas; i++){
        for(int j = 0; j < colunas; j++){
            if(mapa[i][j] == '@'){
                x = i;
                y = j;

                break;
            }
        }
    }

    // De acordo com a direção inserida, muda a posição do player
    int novoX, novoY;
    switch(comando)
    {
        case 'a':
            novoY = y - 1;
            break;
        case 'w':
            novoX = x - 1;
            break;
        case 's':
            novoX = x + 1;
            break;
        case 'd':
            novoY = y + 1;
            break;
    }

    // Apaga o player na posição anterior ao movimento
    mapa[novoX][novoY] = '@';
    mapa[x][y] = '.';
}

int main()
{
    carregarMapa();

    do{
        imprimeMapa();

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

        mover(comando);

    } while(!acabou());

    liberaMapa();
}

O problema está no código ou é algo relacionado ao sisitema?

1 resposta

Olá Isaac,

Ajuste de "for(int i = 0; i > linhas; i++){" para "for(int i = 0; i <= linhas; i++){"

Aqui "for(int j = 0; j < colunas; j++){" mude para "for(int j = 0; j <= colunas; j++){"

Dessa forma deverá cobrir todas as linhas e colunas.