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?