Jump to content

code review -- movimento em tabuleiro


Recommended Posts

Posted (edited)

Boas pessoal, venho novamente pedir a vossa ajuda agora aqui com as listas ligadas.

O que tenho de fazer é : dada uma posição inicial num tabuleiro e uma lista de comandos, determinar a posição final do veiculo desde que o percurso seja valido porque tenho casa bloqueadas. Comecei por fazer uma estrutura para guardar o estado do tabuleiro e depois as funções que executam os comandos (VE - Rodar para esquerda 90ª; VD - Rodar para direita 90º e AV - Avança uma posição) e a função que atualiza.

typedef struct s{
int xli;
int ycol;
struct s *prox;
}*Obs, NodoObs;

char rodar_direita (char *comando, Tabuleiro *sTabuleiro, Carro c)
{
int x, y;
char direcao;

c -> x = x;
c -> y = y;

if (( strcmp(comando,"VD") == 0) && (direcao == 'C'))  grava_pos_tabuleiro (sTabuleiro,x,y,'D'); //  D -> Direita
if (( strcmp(comando,"VD") == 0) && (direcao == 'B'))  grava_pos_tabuleiro (sTabuleiro,x,y,'E'); //  E -> Esquerda
if (( strcmp(comando,"VD") == 0) && (direcao == 'D'))  grava_pos_tabuleiro (sTabuleiro,x,y,'B'); //  B -> Baixo
if (( strcmp(comando,"VD") == 0) && (direcao == 'E'))  grava_pos_tabuleiro (sTabuleiro,x,y,'C'); //  C -> Cima
return grava_pos_tabuleiro(sTabuleiro,x,y,direcao);
}


char rodar_esquerda (char *comando, Tabuleiro *sTabuleiro, Carro c)
{
int x, y;
char direcao;

c -> x = x;
c -> y = y;
if (( strcmp(comando,"VE") == 0) && (direcao == 'C')) grava_pos_tabuleiro (sTabuleiro,x,y,'E');   //  E -> Esqueda
if (( strcmp(comando,"VE") == 0) && (direcao == 'B')) grava_pos_tabuleiro (sTabuleiro,x,y,'D');   //  D -> Direita
if (( strcmp(comando,"VE") == 0) && (direcao == 'D')) grava_pos_tabuleiro (sTabuleiro,x,y,'C');   //  C -> Cima
if (( strcmp(comando,"VE") == 0) && (direcao == 'E')) grava_pos_tabuleiro (sTabuleiro,x,y,'B');   //  b -> Baixo

return grava_pos_tabuleiro(sTabuleiro,x,y,direcao);
}


char avancar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c)
{
int x, y;
char direcao;
c -> x = x;
c -> y = y;
 if (( strcmp(comando,"AV") == 0) && (direcao =='C')) grava_pos_tabuleiro (sTabuleiro,x-1,y,'C');
 if (( strcmp(comando,"AV") == 0) && (direcao =='B')) grava_pos_tabuleiro (sTabuleiro,x+1,y,'B');
 if (( strcmp(comando,"AV") == 0) && (direcao =='D')) grava_pos_tabuleiro (sTabuleiro,x,y+1,'D');
 if (( strcmp(comando,"AV") == 0) && (direcao =='E')) grava_pos_tabuleiro (sTabuleiro,x,y-1,'E');

return grava_pos_tabuleiro(sTabuleiro,x,y,direcao);
}
void *actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c)
{

if ( strcmp(comando,"VD") == 0)   rodar_direita("VD", sTabuleiro, c);

if ( strcmp(comando,"VE") == 0)   rodar_esquerda("VE", sTabuleiro, c);
if ( strcmp(comando,"AV") == 0)   avancar_posicao("AV", sTabuleiro, c);
else
 printf("COMANDO ERRADO\n");

}

A minha dúvida é se estou a pensar bem e a fazer bem. E depois precisava de ajuda de como determinar a posição inicial através dos comandos. Se me pudessem dar algum exemplo ou de como o fazer agradecia imenso.

Edited by pmg
LP adicionada ao GeSHi
Posted

Nas funcoes apresentadas, porque é que chamas a função grava_pos_tabuleiro() duas vezes?

Chamas primeiro com um dos ifs consoante a direcção e a seguir outra vez como parte do return.

Nota: não sei se está bem ou mal (não estudei o teu código suficientemente), mas à primeira vista parece-me, pelo menos, um exagero.

Porque é que o objecto onde guardas os dados do tabuleiro é uma lista ligada?

Não podia ser um array?

Em principio, com um array, as coisas ficam bem mais simples.

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!

Posted

Tens razão o return não está a fazer nada eu é que me esqueci de apagar.

Sim tens razão com um array é bem mais simples.

Obrigado pela ajuda.

Posted

Boas, estou a fazer como tu disses-te mas esta-me a dar uns avisos na strcmp.

Mas era assim que estava s a falar:

char det_posicao_final (char comando [], Tabuleiro *sTabuleiro, Carro c)
{
int i;
printf("Insira a lista de comandos: \n");
scanf("%s", &comando[]);
char matrix [0 .. sTabuliro -> xlinha-1 , 0 .. sTabuleiro -> ycoluna-1];
char matrix [] = pos_inicial(x,y);

 for(i = 0; comando[i] != '\0'; i++)
 {
  if(strcmp(comando[i],"AV")) avancar_posicao ("AV",sTabuleiro,c);
  if(strcmp(comando[i],"VD")) rodar_direita ("VD",sTabuleiro,c);
  if(strcmp(comando[i],"VE")) rodar_esquerda ("VE",sTabuleiro,c);

 }
}
Posted

char det_posicao_final (char comando [], Tabuleiro *sTabuleiro, Carro c)
{
int i;
printf("Insira a lista de comandos: \n");
scanf("%s", &comando[]);

Isto nao é C.

char matrix [0 .. sTabuliro -> xlinha-1 , 0 .. sTabuleiro -> ycoluna-1];

Isto nao é C (o ".."). Além disso, a virgula a separar os argumentos, quando muito, serviria como separador de expressoes e nao como definicao de multiplas dimensoes do array.

char matrix [] = pos_inicial(x,y);

Isto nao é C.

 for(i = 0; comando[i] != '\0'; i++)
 {
  if(strcmp(comando[i],"AV")) avancar_posicao ("AV",sTabuleiro,c);

O "comando[ i ]" é um caracter, nao é uma string. A funcao strcmp funciona com strings.

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!

Posted (edited)

Não estava mesmo a fazer nada de jeito :s.

Podem-me dizer se agora estou a fazer bem? A função só nao está a chamar e a guardar o valor da casa inicial e dentro da função da posição inicial eu tenho lá a direcão do carro. Se me pudessem explicar como posso fazer como usar os valores da posição inicial a gradecia imenso mesmo. E desculpem pelo incomodo.

void pos_inicial (Tabuleiro *sTabuleiro, Carro c)
{
  int x, y;
  char direcao;
printf("Qual a casa inicial? \n");
scanf("%d%d", &x, &y);
c -> x = x;
c -> y = y;
printf("Qual a orientação do carro?\n");
printf("(C-Cima / B-Baixo/ D-Direita / E-Esquerda)\n");
scanf("%c" , &direcao);
if (((x >= 0) && (x <= sTabuleiro->xlinha )) && ((y >= 0) && (y <= sTabuleiro->ycoluna)))
{

 if (direcao == 'C')  grava_pos_tabuleiro (sTabuleiro,x,y,'C');
 if (direcao == 'B') grava_pos_tabuleiro (sTabuleiro,x,y,'B');
 if (direcao == 'D') grava_pos_tabuleiro (sTabuleiro,x,y,'D');
 if (direcao == 'E') grava_pos_tabuleiro (sTabuleiro,x,y,'E');


}
else
	  printf("CASA NÃO EXISTE!!!\n");
}


char det_posicao_final (Tabuleiro *sTabuleiro, Carro c)
{

  char comando [100];
  char *ptr = comando;
  int i;

printf("Insira a lista de comandos: \n");
scanf("%s", comando);


for(i = 0; comando[i] =! '\0'; i++)
{

if( (strcmp(comando,"VD") == 0)) rodar_direita ("VD", sTabuleiro, c);  
if( (strcmp(comando,"VE") == 0)) rodar_esquerda ("VE", sTabuleiro, c);  
if( (strcmp(comando,"AV") == 0)) avancar_posicao ("AV", sTabuleiro, c);  
}


}

}
Edited by Baderous
geshi
Posted (edited)

se eu criar assim uma estrutura para guardar sempre os valores das casas iniciais

}

typedef struct inic
{
int xli_inic;
int ycol_inic;
char *casa_inic;
}Pos;
Pos *defenir_casa_inic (int li_inic, int col_inic)
{
Pos *ptr1 = malloc (sizeof (Pos));
ptr1 -> xli_inic = li_inic;
ptr1 -> ycol_inic = col_inic;
ptr1 -> casa_inic = malloc (sizeof (char) * li_inic * col_inic);
return ptr1;
}
void destruir_casa_inic (Pos *inic)
{
free (inic -> casa_inic);
free ( inic );
}
int linha_inic_tab(Pos *inic)
{
return inic -> xli_inic;
}
int coluna_inic_tab(Pos *inic)
{
return inic -> ycol_inic;
}

Depois para determinar a posição final posso utilizar a xli_inic e ycol_inic.

Estou a pensar bem ou estou a fazer uma estupidez?

Edited by Baderous
geshi

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
×
×
  • Create New...

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.