1
resposta

Programa para de executar após um comando

Olá, o programa compila sem erros e executa, mas quando tento movimentar o personagem o programa fecha.

pacman.c

#include <stdio.h>
#include <stdlib.h>
#include "time.h"
#include "pacman.h"
#include "mapa.h"
#include "ui.h"

MAPA m;
POSICAO heroi;
int tempilula = 0;

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 == ESQUERDA || direcao == CIMA || direcao == BAIXO || direcao == DIREITA;
}

void move(char direcao) {

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

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

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

  if(ehpersonagem(&m, PILULA, proximox, proximoy)) {
    tempilula = 1;
  }

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

int praondeofantasmavai(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 < 10; 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 < copia.linhas; i++) {
    for(int j = 0; i < copia.colunas; j++) {
      if(copia.matriz[i][j] == FANTASMA) {

        int xdestino;
        int ydestino;

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

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

void explodepilula() {
  if(!tempilula) return;

  explodepilula2(heroi.x, heroi.y, 0, 1, 3);
  explodepilula2(heroi.x, heroi.y, 0, -1, 3);
  explodepilula2(heroi.x, heroi.y, 1, 0, 3);
  explodepilula2(heroi.x, heroi.y, -1, 0, 3);
  tempilula = 0;
}

void explodepilula2(int x, int y, int somax, int somay, int qtd) {
  if(qtd == 0) return;

  int novox = x + somax;
  int novoy = y + somay;
  if(!ehvalida(&m, novox, novoy)) return;
  if(ehparede(&m, novox, novoy)) return;

  m.matriz[novox][novoy] = VAZIO;
  explodepilula2(novox, novoy, somax, somay, qtd-1);
}

int main() {
  lemapa(&m);
  encontramapa(&m, &heroi, HEROI);

  do {
    printf("Tem pílula: %s\n", (tempilula ? "SIM" : "NÃO"));
    imprimemapa(&m);

    char comando;
    scanf(" %c", &comando);
    if(ehdirecao(comando)) move(comando);
    if(comando == BOMBA) explodepilula();

    fantasmas();
  } while(!acabou());
  liberamapa(&m);
}

mapa.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mapa.h"

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 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 copiamapa(MAPA* destino, MAPA* origem) {
    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;
    alocamapa(destino);
    for(int i = 0; i < origem->linhas; i++) {
    strcpy(destino->matriz[i], origem->matriz[i]);
    }}

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

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;
}

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

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

return 1;
}

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

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

void andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino) {
    char personagem = m->matriz[xorigem][yorigem];
    m->matriz[xdestino][ydestino] = personagem;
    m->matriz[xorigem][yorigem] = VAZIO;
}
1 resposta

Olá Étor!

Pelo código que você compartilhou, é possível identificar alguns possíveis problemas que podem estar causando o encerramento do programa ao tentar movimentar o personagem. Vou listar algumas sugestões de verificação:

  1. Verifique se o arquivo "mapa.txt" está no mesmo diretório do seu programa. Caso contrário, você precisará fornecer o caminho correto para o arquivo na função lemapa() do arquivo "mapa.c".

  2. Verifique se o mapa está sendo lido corretamente. Certifique-se de que o arquivo "mapa.txt" está no formato esperado, com as dimensões do mapa seguidas pelas linhas do mapa. Qualquer desvio nesse formato pode causar problemas na leitura do mapa.

  3. Verifique se as posições do personagem estão sendo encontradas corretamente. A função encontramapa() no arquivo "mapa.c" é responsável por encontrar a posição do personagem no mapa. Certifique-se de que ela está retornando as coordenadas corretas para o personagem.

  4. Verifique se as condições para movimentação do personagem estão sendo satisfeitas. No código fornecido, a função move() é responsável por movimentar o personagem. Verifique se as condições dentro dessa função estão corretas, como a verificação de se o personagem pode andar na posição desejada.

  5. Verifique se as funções relacionadas aos fantasmas estão funcionando corretamente. No código fornecido, as funções fantasmas() e praondeofantasmavai() são responsáveis por controlar o movimento dos fantasmas. Verifique se essas funções estão sendo chamadas corretamente e se estão movendo os fantasmas de acordo com as regras do jogo.

Essas são apenas algumas sugestões de verificação com base no código fornecido. Caso nenhuma dessas sugestões resolva o problema, seria interessante fornecer mais detalhes sobre o erro ou compartilhar mais trechos de código para que possamos ajudar de forma mais precisa.

Espero ter ajudado e 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