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

diiogofernandes

Ajuda em Trabalho

12 mensagens neste tópico

Boas pessoal...é assim tenho de fazer um jogo para duas disciplinas de Algoritmos e Programação sendo programação em C

e estou com umas certas dificuldades numa parte do jogo  :down: e é o seguinte eu tenho uma matriz imaginemos uma matriz de [10] por [10]

e eu tenho uma posição dessa matriz que quero que haja deslocação! as deslocações possíveis são 8 posições sem contar como é óbvio na posição que já está ou seja pode haver deslocação em volta dessa posição de uma casa! o movimento é feito através de um random e esse random só pode devolver valores entre -1 e 1 ou seja (-1 ou 0 ou 1) e o problema é que não consigo fazer o random de números negativos alguém sabe como se faz????

a ideia é se tiver matriz[linha][coluna]

faço um random supostamente entre -1 e 1 e outro random (random2) entre -1 e 1 então ficaria

matriz[linha + random][coluna + random2] e assim ele só pode movimentar-se entre as posições a sua volta certo???

alguém me ajuda no random ou alguém tem outra sugestão para fazer isto?

Obrigado desde já  :wallbash:

                 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O teu problema é com o -1?

Se for podes fazer entre 0 e 2 e subtrair 1 no fim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não te esqueças de testar se podes fazer a soma (ou subtracção)

matriz[0-1][5+1] é inválido

matriz[7-1][9+1] também é inválido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado aos dois!!

Não te esqueças de testar se podes fazer a soma (ou subtracção)

matriz[0-1][5+1] é inválido

matriz[7-1][9+1] também é inválido

sim vou ter que validar as somas e subtracções

pmg só não percebi o segundo exemplo que mostras-te porque é que é inválida, ou me está a escapar algo ou não estou mesmo a ver....

no primeiro exemplo a matriz [-1][6] a posição -1 não existe na matriz logo é inválido, agora o segundo exemplo matriz[6][10] se for uma matriz [10][10] está contida e pode haver movimento para essa posição....ou o que é que me está a escapar.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a dimensão é 10, os índices variam de 0 até 9, logo matriz[7-1][9+1], ou seja, matriz [6][10] vai aceder a uma posição de memória que não faz parte da matriz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pessoal aqui com um novo problema com o random ao principio pareceu-me que tava a funcionar mas agora reparei que afinal não está (não faz aquilo que quero) mas também não estou a perceber bem se é do random se é dos ciclos for...tou um pouco baralhado com isto tudo....

deixo aqui o código:

for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            for (k=0; k < 1; k++){
                deslocamento = rand() % 2  ;
                deslocamento1 = rand() % 2 ;
                deslocamento = deslocamento -1;
                deslocamento1= deslocamento1 - 1;
                
                   if (matriz[i][j]== 'x'){
                        if (matriz[i+ deslocamento][j + deslocamento1] == ' '){
                            matriz[i + deslocamento][j + deslocamento] = 'x';
                            matriz[i][j] = ' ';
                        }
                    }
            }
            printf("%c", matriz[i][j]);
        }
        printf("\n");
        
    }

o que estarei eu a fazer mal ?? é que as vezes não há deslocação o que é normal mas outras vezes desloca-se para posições que eu não quero por exemplo deixo aqui uma imagem feita no paint a pressa mas penso que dá para perceber os 'x' a verde é para onde se pode deslocar caso não haja lá nada os 'x' a vermelho não pode se deslocar para lá pelo menos numa vez a segunda por exemplo se movimentar da sua posição para baixo a segunda vez já pode ir para o vermelho mas a primeira não...só que quando faz o printf ele muitas vezes já está no vermelho.....será dos ciclos for??? não estou a perceber bem isto, estou um pouco confuso.....

semttulosa8.jpg

http://img255.imageshack.us/my.php?image=semttulosa8.jpg

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a referir matriz como se fosse um array e isso está mal. Provavelmente o que tu queres é isto:

if (matriz[i][j]== 'x'){
                        if (matriz[i+ deslocamento][j + deslocamento1] == ' '){
                            matriz[i + deslocamento][j + deslocamento] = 'x';
                            matriz[i][j] = ' ';
                        }
                    }
            }
            printf("%c", matriz[i][j]);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tense [deslocamento] em vez de [deslocamento1] na linha onde afectas com 'x'.

rand() % 2 vai dar-te um número entre 0 e 1, não entre 0 e 2.

Não experimentei, mas penso que problema que notaste é causado pelo seguinte:

Imagina que tens o seguinte na matriz:

_| | |_

| |x|_

| | |_

| | |

os ciclos for passam a 1ª linha e não alteram nada; passam a 2ª linha e movem o x para a linha de baixo, assim:

_| | |_

| | |_

| |x|_

| | |

depois vão passar a 3ª linha e encontram de novo o x, e voltam a movê-lo para a linha de baixo:

_| | |_

| | |_

| | |_

| |x|

E pronto, numa passagem o x movimentou-se 2 casas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a referir matriz como se fosse um array e isso está mal. Provavelmente o que tu queres é isto:

if (matriz[i][j]== 'x'){
                        if (matriz[i+ deslocamento][j + deslocamento1] == ' '){
                            matriz[i + deslocamento][j + deslocamento] = 'x';
                            matriz[i][j] = ' ';
                        }
                    }
            }
            printf("%c", matriz[i][j]);

tao mas esse código ta igual ao que eu postei....

Tense [deslocamento] em vez de [deslocamento1] na linha onde afectas com 'x'.

Já tinha reparado depois de postar e já tinha corrigido no programa :thumbsup:

rand() % 2 vai dar-te um número entre 0 e 1, não entre 0 e 2.

tao para fazer entre -1 e 1 terei de fazer o seguinte :

deslocamento = rand() % 3  ;

deslocamento1 = rand() % 3 ;

deslocamento = deslocamento - 1 ;

deslocamento1 = deslocamento1 - 1;

assim cobra todas as possibilidades certo?

Não experimentei, mas penso que problema que notaste é causado pelo seguinte:

Imagina que tens o seguinte na matriz:

_| | |_

| |x|_

| | |_

| | |

os ciclos for passam a 1ª linha e não alteram nada; passam a 2ª linha e movem o x para a linha de baixo, assim:

_| | |_

| | |_

| |x|_

| | |

depois vão passar a 3ª linha e encontram de novo o x, e voltam a movê-lo para a linha de baixo:

_| | |_

| | |_

| | |_

| |x|

E pronto, numa passagem o x movimentou-se 2 casas.

penso que seja isso mesmo, o problema é o seguinte eu tenho de correr a matriz para ver onde está o 'x' e movimentar todos os 'x' para a sua volta onde não estiver nada... como é que poderei fazer isso, só estou a ver correr a matriz como estou a fazer e sendo assim vai sempre ou quase sempre saltar várias posições....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tao mas esse código ta igual ao que eu postei....

Como não puseste o código dentro das tags code, o [ i] do if não se via (é a tag de itálico).

tao para fazer entre -1 e 1 terei de fazer o seguinte :

deslocamento = rand() % 3  ;

deslocamento1 = rand() % 3 ;

deslocamento = deslocamento - 1 ;

deslocamento1 = deslocamento1 - 1;

assim cobra todas as possibilidades certo?

Exactamente!

penso que seja isso mesmo, o problema é o seguinte eu tenho de correr a matriz para ver onde está o 'x' e movimentar todos os 'x' para a sua volta onde não estiver nada... como é que poderei fazer isso, só estou a ver correr a matriz como estou a fazer e sendo assim vai sempre ou quase sempre saltar várias posições....

Uma solução passaria por escreveres num array temporário, e no fim copiares os valores desse array para o original. Outra possibilidade era utilizares outro caracter para indicar um x que se tivesse movido, por exemplo y. Depois percorrias de novo o array e substituías os y por x.

Talvez exista uma solução melhor, mas estas foram as que me surgiram mais rapidamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado pela ajuda....vou pensar noutra solução melhor se não, sigo as tuas dicas, obrigado mais uma vez :thumbsup:

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