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

Sign in to follow this  
TheOne

Dúvida - Trabalho de Universidade - Jogo

Recommended Posts

TheOne

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

Share this post


Link to post
Share on other sites
pmg

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 */
/* ...*/


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
TheOne

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

Share this post


Link to post
Share on other sites
pmg

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.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
TheOne

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

Share this post


Link to post
Share on other sites
TheDark

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


Desaparecido.

Share this post


Link to post
Share on other sites
TheOne

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...

Share this post


Link to post
Share on other sites
pmg

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 :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
TheOne

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

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.