MVMT Posted May 5, 2012 at 07:37 PM Report #453328 Posted May 5, 2012 at 07:37 PM Boas, tenho de fazer um jogo de um veiculo que se vai movimentar num tabuleiro .– Uma linha inicial, com dois inteiros que representam as dimens ̃es do tabuleiro; – Uma segunda linha que indica a posição inicial do veiculo; – Uma terceira linha com um inteiro que indica o numero de obstaculos existentes; – Para cada obstaculo, uma linha com a posiçao desse obstaculo; a minha dúvida é que eu define uma variavel DIM 100 como vao puder ver no codigo. E ao inserir as dimensoes do tabuleiro queria que esses valores ficassem na variavel DIM. Até porque os 4 topicos que inseri em cima terao de ser num sistema de menus. #include <stdio.h> #include <stdlib.h> #define DIM 100 #define ESPACO ' ' void dimensoes_tab (char tabuleiro [DIM][DIM]) { int x, y; printf("Introduza o numero de linhas: \n"); scanf("%d", &x); printf("Introduza o numero de colunas: \n"); scanf("%d", &y); } void pos_inicial (char Tabuleiro [DIM][DIM]) { int linha; int coluna; printf("Qual a casa inicial? \n"); scanf("%d%d", &linha, &coluna); if (linha <= DIM && coluna <= DIM) Tabuleiro [linha][coluna] = 'C'; else printf("CASA não existe\n"); } void casas_bloqueadas (char Tabuleiro [DIM][DIM]) { int x,y,linha,coluna; printf("Quantas casas bloqueadas: \n"); scanf("%d", &y); for(x = 1; x <= y; x++) { printf("Qual casa?\n"); scanf("%d%d",&linha, &coluna); Tabuleiro[linha][coluna] = 'x'; } } void inic_tabuleiro (char Tabuleiro [DIM][DIM]) { int linha , coluna; for (linha = 0; linha < DIM; linha++) { for (coluna = 0; coluna < DIM; coluna++) Tabuleiro [linha][coluna] = ESPACO; } } void mostra_tabuleiro (char Tabuleiro [DIM][DIM]) { int linha, coluna; for (linha = 0; linha < DIM; linha++) { putchar ('|'); for (coluna = 0; coluna < DIM; coluna++) printf ("%c %c", Tabuleiro [linha][coluna], coluna == DIM ? ' ': '|'); if (linha != DIM+1) printf ("\n----------------"); putchar ('\n'); } } Edit: GeSHi adicionado (pmg)
pmg Posted May 5, 2012 at 09:17 PM Report #453344 Posted May 5, 2012 at 09:17 PM Não é possível alterar o valor dum #define depois do código compilado. O que precisas de fazer é transformar o código para esse DIM passar a ser uma variável normal. Depois de obteres um valor para a dimensão do tabuleiro, usas esse valor para criar o tabuleiro com malloc e passas o valor para todas as funções que usam o tabuleiro. No fim do programa, não te esqueças de libertar a memória usada para o tabuleiro com free(). 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!
MVMT Posted May 5, 2012 at 09:54 PM Author Report #453351 Posted May 5, 2012 at 09:54 PM Obrigado pela ajuda, vou tentar fazer isso então.
MVMT Posted May 6, 2012 at 01:46 PM Author Report #453394 Posted May 6, 2012 at 01:46 PM typedef struct Tab { int linha; int coluna; } Tabuleiro; Tabuleiro* initStruct() { Tabuleiro *p = (Tabuleiro*) malloc(sizeof(Tabuleiro)); ptr -> linha = 0; ptr -> coluna = 0; return p; } Era assim disto que estavas a falar? Agora não sei é como posso utilizar a variavel estas variaveis nas funçoes :s. Se me puderes explicar agradecia. Edit: GeSHi adicionado (pmg)
bsccara Posted May 6, 2012 at 02:29 PM Report #453397 Posted May 6, 2012 at 02:29 PM Podes fazer assim : typedef struct Tab { int linhas; int colunas; char * casas; } Tabuleiro; Tabuleiro* CriaTabuleiro(int linhas_iniciais, int colunas_iniciais) { Tabuleiro *p = malloc(sizeof(Tabuleiro)); p->linhas = linhas_iniciais; p->colunas = colunas_iniciais; p->casas = malloc(sizeof(char) * linhas_iniciais * colunas_iniciais); return p; } void DestroiTabuleiro(Tabuleiro * tab) { free(tab->casas); free(tab); } int LinhasTabuleiro(Tabuleiro * tab) { return tab->linhas; } int ColunasTabuleiro(Tabuleiro * tab) { return tab->colunas; } char LePosicaoNoTabuleiro(Tabuleiro * tab, int linha, int coluna) { return *(tab->casas + linha * tab->colunas + coluna); } void GravaPosicaoNoTabuleiro(Tabuleiro * tab, int linha, int coluna, char valor) { *(tab->casas + linha * tab->colunas + coluna) = valor; }
MVMT Posted May 6, 2012 at 03:01 PM Author Report #453401 Posted May 6, 2012 at 03:01 PM Muito obrigado pela ajuda e desculpa o incomodo.
MVMT Posted May 8, 2012 at 05:53 PM Author Report #453915 Posted May 8, 2012 at 05:53 PM #include <stdio.h> #include <stdlib.h> #define ESPACO ' ' typedef struct sTabuleiro { int xlinha; int ycoluna; char *casas; } Tabuleiro; Tabuleiro* CriarTabuleiro(int linha_inic, int coluna_inic) { Tabuleiro *ptr = malloc(sizeof(Tabuleiro)); ptr -> xlinha = linha_inic; ptr -> ycoluna = coluna_inic; ptr -> casas = malloc(sizeof(char) * linha_inic * coluna_inic); return ptr; } void DestroiTabuleiro(Tabuleiro * sTabuleiro) { free(sTabuleiro ->casas); free(sTabuleiro); } int LinhasTabuleiro(Tabuleiro * sTabuleiro) { return sTabuleiro -> xlinha; } int ColunasTabuleiro(Tabuleiro * sTabuleiro) { return sTabuleiro -> ycoluna; } char LePosicaoNoTabuleiro(Tabuleiro * sTabuleiro, int linha, int coluna) { return *(sTabuleiro -> casas + linha * sTabuleiro -> ycoluna + coluna); } void GravaPosicaoNoTabuleiro(Tabuleiro * sTabuleiro, int linha, int coluna, char valor) { *(sTabuleiro -> casas + linha * sTabuleiro -> ycoluna + coluna) = valor; } void dimensoes (Tabuleiro *sTabuleiro) { printf("Introduza o numero de linhas: \n"); scanf("%d", *sTabuleiro->xlinha); printf("Introduza o numero de colunas: \n"); scanf("%d", *sTabuleiro->ycoluna); } void pos_inicial (Tabuleiro *sTabuleiro) { int x, y; printf("Qual a casa inicial? \n"); scanf("%d%d", &x, &y); if (((x >= 0) && (x <= *sTabuleiro->xlinha )) && ((y >= 0) && (y <= *sTabuleiro->ycoluna))) *sTabuleiro = 'C'; else printf("CASA não existe\n"); } mudei o nome das variaveis mas fiz como me disses-te. Agora a minha dúvida é como por exemplo na função dimensoes se estou a fazer bem ao utilizar ( *sTabuleiro->xlinha) dentro do scanf. Pois da-me um erro e não sei como o resolver tanto nas funçoes que aqui postei como no resto das funções. O erro que me da é (invalid type argument of unary ‘*’ (have ‘int’)) Edit: GeSHi adicionado (pmg) Le o tutorial para saberes adicionar o GeSHi sem ser preciso a intervencao dum moderador.
pmg Posted May 8, 2012 at 06:01 PM Report #453919 Posted May 8, 2012 at 06:01 PM PreScriptum: Le o tutorial de GeSHi para saberes adiciona-lo sem ser preciso a intervencao dum moderador. Nao estas a fazer bem. Ha dois operadores importantes quando se lida com enderecos: o * e o &. O * faz o contrario do & e vice-versa. No teu codigo, sTabuleiro é um ponteiro, sTabuleiro->xlinha é um int. Para teres o endereco do int, usa o operador & sTabuleiro->xlinha // um int &sTabuleiro->xlinha // endereco dum int Para comparacao, usando o * no sTabuleiro obtens um objecto de tipo struct sTabuleiro. sTabuleiro // endereco dum struct sTabuleiro *sTabuleiro // objecto de tipo struct sTabuleiro 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!
MVMT Posted May 8, 2012 at 06:13 PM Author Report #453923 Posted May 8, 2012 at 06:13 PM Já percebi 😉. Obrigado novamente pela paciencia
HRMT Posted May 23, 2012 at 12:22 PM Report #457577 Posted May 23, 2012 at 12:22 PM Se me pudessem explicar como posso fazer para colocar o caracter no tabuleiro. a minha duvida como esta mencionada no codigo (sTabuleiro = '#'😉. Isso está mal deixei ficar assim para ver se conseguem perceber melhor a minha questão. Deve ser mesmo um pequeno pormenor. Sou do mesmo grupo da pessoa que tem postado por isso a estrutura é a mesma 🙂 . Agradecia se me pudessem ajudar porque em outras funçoes estou a aempancar no mesmo problema. void casas_bloqueadas (Tabuleiro *sTabuleiro) { int x, y, linha, coluna; printf("Quantas casas bloqueadas: \n"); scanf("%d", &x); for (y = 1; y <= x; y++) { printf("Qual casa?\n"); scanf("%d%d",&linha, &coluna); if (((linha >= 0) && (linha <= sTabuleiro->xlinha )) && ((coluna >= 0) && (coluna <= sTabuleiro->ycoluna))) sTabuleiro = '#'; // duvida está aqui... else printf("CASA NAO EXISTE!!!\n"); } }
bsccara Posted May 23, 2012 at 12:44 PM Report #457579 Posted May 23, 2012 at 12:44 PM Primeiro, todos os índices em C são baseados no 0, ou seja, o primeiro é sempre o 0. Portanto o último será a <dimensão do objecto> - 1. No teu código os testes de validação estão a deixar passar índices inválidos (linha <= sTabuleiro->xlinha). Corrige isso. Quanto à dúvida deves usar a função 'GravaPosicaoNoTabuleiro', que me parece óbvia.
HRMT Posted May 23, 2012 at 02:29 PM Report #457627 Posted May 23, 2012 at 02:29 PM obrigado vou fazer isso então. estou a pensar minimamente bem? *sTabuleiro = (grava_Pos_tabuleiro(linha, coluna, '#'));
bsccara Posted May 23, 2012 at 02:36 PM Report #457629 Posted May 23, 2012 at 02:36 PM Não, não estás. GravaPosicaoNoTabuleiro(sTabuleiro,linha,coluna,'#');
HRMT Posted May 23, 2012 at 02:47 PM Report #457636 Posted May 23, 2012 at 02:47 PM Obrigado pela ajuda.
HRMT Posted May 25, 2012 at 12:38 PM Report #458077 Posted May 25, 2012 at 12:38 PM Para movimentar o carro para direita preciso de utilizar a posição casa inicial e somar 1 unidade ao valor da coluna, e depois gravar coma função: GravaPosicaoNoTabuleiro(sTabuleiro,linha, coluna +1 ,'C'); A minha dúvida é como utilizar os valores da posição inicial posso utilizar mesmo a função posicao_inicial ou tenho de fazer uma struct para os guardar e depois os utilizar?
HRMT Posted May 25, 2012 at 02:21 PM Report #458097 Posted May 25, 2012 at 02:21 PM já não é necessario já consegui resolver o problema 🙂
HRMT Posted May 27, 2012 at 05:04 PM Report #458395 Posted May 27, 2012 at 05:04 PM Boas , ao compilar esta-me a dar erro e já o tentei corrigir e não consegui se for possivel me dar umas dicas ou me dizerem o que estou a fazer mal agradecia. void actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c) { if ( strcmp(comando,"VD") == 0) c = roda_direita(c); // (Neta linha e nas seguintes duas da-me o seguinte aviso: assignment makes pointer from integer without a cast) if ( strcmp(comando,"VE") == 0) c = roda_esquerda(c); if ( strcmp(comando,"AV") == 0) c = avanca_posicao(c); else printf("COMANDO ERRADO\n"); } depois na minha função menu ao chamar esta função da-me dois avisos e um erro como podem ver a seguir: case '4': sTabuleiro = actualizar_posicao (sTabuleiro ,carro); break; (aviso: aviso: passing argument 1 of ‘actualizar_posicao’ from incompatible pointer type aviso: passing argument 2 of ‘actualizar_posicao’ from incompatible pointer type erro:too few arguments to function ‘actualizar_posicao’ ) Se me pudessem ajudar agradecia.
pmg Posted May 27, 2012 at 06:59 PM Report #458405 Posted May 27, 2012 at 06:59 PM // 1111111111111, 222222222222222222222, 3333333 void actualizar_posicao (char *comando, Tabuleiro *sTabuleiro, Carro c) ... // actualizar_posicao (2222222222 ,33333); sTabuleiro = actualizar_posicao (sTabuleiro ,carro); Onde esta o primeiro parametro? Alem disso, o retorno da funcao actualizar_posicao e de tipo void. Nao podes atribuir void a uma variavel. 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!
HRMT Posted May 27, 2012 at 07:13 PM Report #458408 Posted May 27, 2012 at 07:13 PM Acho que já percebi a estupidez que estava a fazer. Obrigado
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now