• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

TheOne

Dúvida - Trabalho de Universidade - Jogo

10 mensagens neste tópico

Boas pessoal, estou com um problema. Tenho de fazer um jogo que junta C e Prolog. C para a parte gráfica e Prolog para por um robot a percorrer o nível sozinho. O robot tem de percorrer o labirinto e levar os "alvos" para a base. A parte gráfica já está tratada, falta a parte do Prolog e uma parte essencial que é ler as configurações dum ficheiro .cfg com o seguinte conteudo:

DimX: 20

DimY: 10

Robot: o

Alvo: *

Base: +

Obstáculo: @

Vazio: .

@@@@@@@@@@@@@@@@@

@.................@.*...............@

@.*..@...@..................@.+.@

@@@@@@..@@@@...@@@@@

@.....................................@

@..@@@@@@@@@@@@@..@

@...........@.......................@

@....@.*..@........@............@

@....@...............@..o.........@

@@@@@@@@@@@@@@@@@

O problema é retirar os dados: dimX, dimY (int), robot, wall, ground, target, base (chars) ...já tentei ler um char de cada vez, com sscanf e com fgets mas não consigo fazê-lo correctamente...já estou desesperado porque sem ter esta parte inicial feita não consigo testar o resto decentemente.

Obrigado pessoal

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para as "palavra chave" e os valores o fgets e o sscanf parecem-me boas escolhas.

Para o "tabuleiro", talvez eu usasse fgets e depois tratar a string caracter a caracter.

/* ... */
/* mas poe aqui o teu codigo para ser mais fácil perceber as tuas dúvidas */
/* ...*/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela ajuda pmg, já consegui sacar os dados. Agora tenho outro problema que não esperava encontrar e não percebo a sua razão que é, eu pretendo guardar o mapa numa matriz char map[dimX][dimY], de modo a ser mais fácil processar os movimentos do robot. O problema é que a compilar diz que é esperado uma constante nas dimensões da matriz...mas eu preciso de utilizar os valores das variáveis dimX e dimY. Há maneira de "declarar" uma matriz utilizando o malloc?

        fscanf(cfg, "DimX: %d\n", &dimX);
fscanf(cfg, "DimY: %d\n", &dimY);
fscanf(cfg, "Robot: %c\n", &robot);
fscanf(cfg, "Alvo: %c\n", &target);
fscanf(cfg, "Base: %c\n", &base);
fscanf(cfg, "Obstáculo: %c\n", &wall);
fscanf(cfg, "Vazio: %c\n", &ground);

char* str = (char*) malloc(dimX*sizeof(char));
char map[dimX][dimY];
int j = 0;

for(i = 0; i < dimY; i++)
{
	fscanf(cfg, "%s\n", str);
	loadMap(map, str, j);
	j++;
}

em que o loadMap(char[][] map, char* str, int j ) é

void loadMap(char map[][], char* str, int j)
{
int i = 0;
while(str[i] != 0)
	map[i][j] = str[i++];
}

Supostamente deveria conseguir ler cada string do mapa e dar ao loadMap que vai colocar cada char numa posição da matriz do mapa.

Thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

char *map;
map = malloc(dimX * dimY);
/* o resto tudo na mesma */
free(map);

Deve funcionar, se calhar precisas de uns casts ou de alterar a definição das funções.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas assim fica um array de  char não é? Eu preferia uma matriz mesmo...mas vou experimentar assim, thanks :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não esquecer que o acesso a map[x][y] terá que ser feito assim map[x*dimX + y].

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela ajuda pmg e TheDark! Já está a começar a ficar como deve ser. Já agora, existe a noção public e private em C? Queria usar variáveis sem ter de andar com elas atrás passando-as de função em função...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, a noção de public e private não existe em C.

Mas tens várias hipóteses de facilitar o "andar com elas atrás passando-as de função em função" :)

1) modularizas o código em ficheiros diferentes

2) usas estruturas e passas ponteiros de função em função

3) (não aconselhado) usas variáveis globais

Também podes misturar os 3 métodos à vontade (mas variáveis globais causam mais problemas que os que resolvem).

Se quiseres uma explicação mais alargada destes métodos, diz :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque dizes que não é aconselhável o uso de variáveis globais? Por acaso optei por esse método, mas também só o estou a usar com 3 ou 4 variáveis..

----//----

TheDark só agora é que reparei que andas no ISEL, eu tb ando ;) 3º semestre de LERCM (redes e multimédia).

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Compara:

Com variavel global

variavel_global = 42;
fx1("quarenta e dois");
/* qual é o valor de variavel_global agora? Pode ser 42 ou outra coisa qualquer */
/*... depende se a função fx1 a alterou ou não */

Sem variavel global

variavel_local = 42;
fx2("quarenta e dois", variavel_local);
/* qual é o valor de variavel_local agora? É 42 */

Lê o que a Wikipedia tem a dizer sobre variáveis globais:

http://en.wikipedia.org/wiki/Global_variable

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora