Array de múltiplas dimensões (GM não tem)

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Sex 03 Ago 2012, 14:14

manual escreveu:You can use 1- and 2-dimensional arrays in GML.
Mas e se eu quiser uma array de 3, 4 ou mais dimensões?

É que estou pensando a respeito de jogos de cartas. A maioria das regras envolve naipes e cores das cartas, algumas usam vários decks de baralhos. Minha idéia inicial foi fazer uma array com várias dimensões.
carta[deck, cor, naipe, valor]
Mas tentei e o GM só suporta duas dimensões mesmo.

Claro que posso colocar as cores e naipes em ordem, de forma que eu tenha como calcular alguma coisa, mas... sério que tem que fazer assim?
Por exemplo, se eu coloco os seguintes índices:
0 a 12 - paus (preta)
13 a 25 - espadas (preta)
26 a 38 - copas (vermelha)
39 a 51 - ouros (vermelha)
e quero verificar se a cartaNaMesa sobre a qual estou colocando essa que está na minha mão é um valor acima e de cor invertida (como a maioria das paciências), teria que fazer algo assim:
Código:
if (indice >= 0 && indice < 13){ //paus
   if ((cartaNaMesa . indice == indice + 1 + 26) or (cartaNaMesa . indice == indice + 1 + 39)){ // se é um valor e dois ou três naipes acima
      // movimento permitido
      }
      else {
         //movimento proibido
         }
   }
else if (indice >= 12 && indice < 26){ //espadas
   if ((cartaNaMesa . indice == indice + 1 + 13) or (cartaNaMesa . indice == indice + 1 + 26)){ // se é um valor e um ou dois naipes acima
      // movimento permitido
      }
      else {
         //movimento proibido
         }
   }
else if (indice >= 26 && indice < 39){
   if ((cartaNaMesa . indice == indice + 1 - 13) or (cartaNaMesa . indice == indice + 1 - 26)){ // se é um valor acima e um ou dois naipes abaixo
      // movimento permitido
      }
      else {
         //movimento proibido
         }
   }
else if (indice >= 39 && indice < 52){
   if ((cartaNaMesa . indice == indice + 1 - 26) or (cartaNaMesa . indice == indice + 1 - 39)){ // se é um valor acima e dois ou três naipes abaixo
      // movimento permitido
      }
      else {
         //movimento proibido
         }
      }

Meio chato de programar assim, não é? Alguém teria uma forma mais eficiente de organizar (indexar) as cartas?

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por un00brn em Sex 03 Ago 2012, 14:29

Você já tentou criar scripts ?
Tente deixar os códigos divididos por scripts
só assim você não iria precisar de ficar repetindo os códigos deixando seu jogo mais pesado!
Acho que essa seria uma lógica mais correta! Boa sorte com a programação =D

un00brn

Número de Mensagens : 117
Idade : 18
Data de inscrição : 18/06/2012
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://www.djurielrn.blogspot.com

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por KinKing em Sex 03 Ago 2012, 14:34

Fiquei com a impressão de que com o que você quer, duas dimensões seriam o suficientes!

Criemos as constantes COR = 0, NAIPE = 1 e VALOR = 2.

Então temos o deck, que é a array em si.

Quanto a primeira das cartas do deck[], deck[0,COR] dá a cor... deck[0,NAIPE] dá o naipe... e deck[0,VALOR] invoca o valor!

Imagine:

IND |COR|NAIP|NUM|
_________________
0 | 2 | 2 | 13 |
_________________
1 | 2 | 2 | 12 |

Sendo que são as duas primeiras cartas do deck[]. Em cor e naipe, ambos são de Copas. Só que a carta 0 é o Rei e a 1 é a Dama!

Você pode trabalhar com constantes pra facilitar também.

Acredito que usar ambos cor e naipe são redundantes?

E se você achar as funções da array limitadas, tente usar ds_grid, que é a mesma coisa só que mais dinâmico!

KinKing

Número de Mensagens : 416
Data de inscrição : 29/05/2008
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://felipejoys.webnode.com

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Jiraya em Sex 03 Ago 2012, 14:36

eu uso o seguinte script
Código:

//vector(x,y,z)
return(argument0*1000*1000+argument1*1000+argument2) div 32000;

após isso, você poderá usar arrays de até 6 dimensões
ex:
Código:

array[vector(0,0,0),vector(0,0,0)]="Hello"
array[vector(0,4,8),vector(0,120,0)]="World"

show_message(array[vector(0,0,0),vector(0,0,0)]+array[vector(0,4,8),vector(0,120,0)]);

carta[vector(deck,cor,naipe)]=valor;


Spoiler:

ainda não testei, mas talves seja possivel usar 18 dimensões
array[vector(vector(x1,y1,z1),vector(x2,y2,z2),vector(x3,y3,z3),vector(x4,y4,z4),vector(x5,y5,z5),vector(x6,y6,z6),vector(x7,y7,z7),vector(x8,y8,z8),vector(x9,y9,z9)),vector(vector(x10,y10,z10),vector(x11,y11,z11),vector(x12,y12,z12),vector(x13,y13,z13),vector(x14,y14,z14),vector(x15,y15,z15),vector(x16,y16,z16),vector(x17,y17,z17),vector(x18,y18,z18))];


Jiraya

Ranking : Nota A
Número de Mensagens : 1134
Data de inscrição : 20/03/2010
Notas recebidas : A+A
Reputação : 108
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

https://www.facebook.com/seito.washiro.7

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por vinians em Sex 03 Ago 2012, 15:47

Jiraya escreveu:eu uso o seguinte script
Código:

//vector(x,y,z)
return(argument0*1000*1000+argument1*1000+argument2) div 32000;

após isso, você poderá usar arrays de até 6 dimensões
ex:
Código:

array[vector(0,0,0),vector(0,0,0)]="Hello"
array[vector(0,4,8),vector(0,120,0)]="World"

show_message(array[vector(0,0,0),vector(0,0,0)]+array[vector(0,4,8),vector(0,120,0)]);

carta[vector(deck,cor,naipe)]=valor;


Spoiler:

ainda não testei, mas talves seja possivel usar 18 dimensões
array[vector(vector(x1,y1,z1),vector(x2,y2,z2),vector(x3,y3,z3),vector(x4,y4,z4),vector(x5,y5,z5),vector(x6,y6,z6),vector(x7,y7,z7),vector(x8,y8,z8),vector(x9,y9,z9)),vector(vector(x10,y10,z10),vector(x11,y11,z11),vector(x12,y12,z12),vector(x13,y13,z13),vector(x14,y14,z14),vector(x15,y15,z15),vector(x16,y16,z16),vector(x17,y17,z17),vector(x18,y18,z18))];

Excelente solução! Não pude deixar de comentar, gosto muito de usar este tipo de coisa quando programo em C, pois mesmo tendo suporte a arrays multidimensionais, eu as vezes prefiro fazer desse jeito, pois programava muito acesso direto em tela SVGA $A0000000 e fazia este tipo de mapeamento usando uma função para simular o x e y em um array de uma dimensão (tela). Otimo!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Sex 03 Ago 2012, 16:10

un00brn escreveu:
Você já tentou criar scripts ?
Tente deixar os códigos divididos por scripts
só assim você não iria precisar de ficar repetindo os códigos deixando seu jogo mais pesado!
Acho que essa seria uma lógica mais correta! Boa sorte com a programação =D
Olá, un00brn, obrigado pela participação.
O que eu postei é só um exemplo de como seria mais fácil programar se tivéssemos muitas dimensões na array. Repare que o código não se repete, apenas segue o mesmo raciocínio - mas se tivermos valores diferentes, precisaremos de códigos diferentes, aí não dá pra generalizar.

KinKing escreveu:Fiquei com a impressão de que com o que você quer, duas dimensões seriam o suficientes!

Criemos as constantes COR = 0, NAIPE = 1 e VALOR = 2.

Então temos o deck, que é a array em si.

Quanto a primeira das cartas do deck[], deck[0,COR] dá a cor... deck[0,NAIPE] dá o naipe... e deck[0,VALOR] invoca o valor!

Imagine:

IND |COR|NAIP|NUM|
_________________
0 | 2 | 2 | 13 |
_________________
1 | 2 | 2 | 12 |

Sendo que são as duas primeiras cartas do deck[]. Em cor e naipe, ambos são de Copas. Só que a carta 0 é o Rei e a 1 é a Dama!

Você pode trabalhar com constantes pra facilitar também.

Acredito que usar ambos cor e naipe são redundantes?

E se você achar as funções da array limitadas, tente usar ds_grid, que é a mesma coisa só que mais dinâmico!
Acho que não entendi muito bem o que você quis dizer ou então você fez alguma confusão com as arrays. Eu queria algo como
baralho0 = 0; baralho1 = 1;
preto = 0; vermelho = 1;
paus = 0; espadas = 1;
copas = 0; ouros = 1;
carta[baralho0, preto, paus, 0] = ás de paus;
carta[baralho1, vermelho, copas, 12] = rei de copas;
//por aí vai

Não vejo como fazer essa diferenciação quando COR, NAIPE e VALOR são índices da mesma dimensão da array.

A cor e naipe são importantes porque há momentos em que o jogo acontece em função da cor (organização decrescente, na mesa) e momentos em que acontece em função do naipe (empilhamento crescente, no monte).

Jiraya escreveu:eu uso o seguinte script
Código:

//vector(x,y,z)
return(argument0*1000*1000+argument1*1000+argument2) div 32000;
Jiraya, você vai ter que me explicar melhor esse script! Porque div 32000? Eu entendo que qualquer trio de argumentos vai dar um valor diferente, mas... fiquei confuso com o script. Quando eu paro pra pensar, minha cabeça insiste que o certo seria div 1000, aí eu lembro que existem 3 argumentos e me perco completamente. Pergunta: isso não iria superpopular a array? Lembre-se que existe um limite para o tamanho delas (exatamente o 1000 * 1000... aí tem que ter alguma relação que eu não estou entendendo!)

...

Eu não tinha pensado em div, ainda... acaba que é possível organizar uma array unidimensional e puxar as informações da carta a partir do índice, usando div!
cartaSorteada = carta[irandom(numero_de_cartas)]; //eu vou usar ds_lists, se for fazer um jogo de verdade
baralho = cartaSorteada div 52;
cor = (cartaSorteada - 52 * baralho) div 26; // 0 = preto, 1 = vermelho
naipe = (cartaSorteada - 52 * baralho) div 13; //0 = paus, 1 = espadas, 2 = copas, 3 = ouros
valor = cartaSorteada mod 13; //ás a rei

Com isso no início de cada evento, eu altero um pouco o estilo de programação e checo diretamente pelo valor dessas variáveis, ao invés de extrair o índice delas. Na verdade, acho que essa abordagem é até mais simples. Agora que cheguei nesses cálculos, não lembro mais o que eu queria fazer antes.

Assim que o Jiraya me explicar esse script, o tópico estará resolvido.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por KinKing em Sex 03 Ago 2012, 16:22

saim escreveu:
KinKing escreveu:Fiquei com a impressão de que com o que você quer, duas dimensões seriam o suficientes!

Criemos as constantes COR = 0, NAIPE = 1 e VALOR = 2.

Então temos o deck, que é a array em si.

Quanto a primeira das cartas do deck[], deck[0,COR] dá a cor... deck[0,NAIPE] dá o naipe... e deck[0,VALOR] invoca o valor!

Imagine:

IND |COR|NAIP|NUM|
_________________
0 | 2 | 2 | 13 |
_________________
1 | 2 | 2 | 12 |

Sendo que são as duas primeiras cartas do deck[]. Em cor e naipe, ambos são de Copas. Só que a carta 0 é o Rei e a 1 é a Dama!

Você pode trabalhar com constantes pra facilitar também.

Acredito que usar ambos cor e naipe são redundantes?

E se você achar as funções da array limitadas, tente usar ds_grid, que é a mesma coisa só que mais dinâmico!
Acho que não entendi muito bem o que você quis dizer ou então você fez alguma confusão com as arrays. Eu queria algo como
baralho0 = 0; baralho1 = 1;
preto = 0; vermelho = 1;
paus = 0; espadas = 1;
copas = 0; ouros = 1;
carta[baralho0, preto, paus, 0] = ás de paus;
carta[baralho1, vermelho, copas, 12] = rei de copas;
//por aí vai

Não vejo como fazer essa diferenciação quando COR, NAIPE e VALOR são índices da mesma dimensão da array.

A cor e naipe são importantes porque há momentos em que o jogo acontece em função da cor (organização decrescente, na mesa) e momentos em que acontece em função do naipe (empilhamento crescente, no monte).

Acho que há alguma confusão aí.

Você pode indicar que a 1a carta de um baralho é um ás de paus assim:
meuBaralho[0,0] = "preto"
meuBaralho[0,1] = "paus"
meuBaralho[0,2] = 1

Enquanto que a 8a carta do meuBaralho é um valete vermelho de ouros assim:
meuBaralho[8,0] = "vermelho"
meuBaralho[8,1] = "ouros"
meuBaralho[8,2] = 11

COR (0), NAIPE (1) E VALOR (2) são todos valores que correspondem a carta do primeiro índice (0-29 para um baralho de 30 cartas)

KinKing

Número de Mensagens : 416
Data de inscrição : 29/05/2008
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://felipejoys.webnode.com

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Jiraya em Sex 03 Ago 2012, 16:29


Excelente solução! Não pude deixar de comentar, gosto muito de usar este tipo de coisa quando programo em C, pois mesmo tendo suporte a arrays multidimensionais, eu as vezes prefiro fazer desse jeito, pois programava muito acesso direto em tela SVGA $A0000000 e fazia este tipo de mapeamento usando uma função para simular o x e y em um array de uma dimensão (tela). Otimo!
vlw Happy!
vou dar uma pesquisada sobre SVGA, parece interessante...



Jiraya, você vai ter que me explicar melhor esse script! Porque div 32000?
o gm tem um limite de 32000, isso evita que a array estoure esse limite.
ou seja, o limite do vector é 32000/3~10000
por isso, o 1000*1000, serve como um separador entre cada valor, sendo assim é perfeitamente possivel fazer operação reversa com raiz quadrada e pegar o x,y,z que você colocou nos parametros, como um make_color_rgb ~mas isso não vem ao caso.

Jiraya

Ranking : Nota A
Número de Mensagens : 1134
Data de inscrição : 20/03/2010
Notas recebidas : A+A
Reputação : 108
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

https://www.facebook.com/seito.washiro.7

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Sex 03 Ago 2012, 17:02

Espere... tem uma sintaxe estranha nesse script, só notei agora!
primeiro, ele retorna as somas e multiplicações e, depois, tira o div 32000!
Isso foi testado e tem uma sintaxe nova pra eu aprender ou teve um erro de digitação?

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por vinians em Sex 03 Ago 2012, 17:14

saim escreveu:Espere... tem uma sintaxe estranha nesse script, só notei agora!
primeiro, ele retorna as somas e multiplicações e, depois, tira o div 32000!
Isso foi testado e tem uma sintaxe nova pra eu aprender ou teve um erro de digitação?
Amigo, eu acho que o "div" neste caso está garantindo o que o código gerado (uma espécie de hash code que o Jiraya fez) se mantenha dentro do limite de 32000.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Seg 06 Ago 2012, 10:21

(Eu tive que pesquisar o que quer dizer hash code...)

Sim, sim, mas esse div não deveria estar antes, ou melhor, dentro do return? Depois do return, tanto faz se ele excede os 32000 ou não. (certo?)

Veja um exemplo:
Código:
vector(1, 1, 1);
isso vai me retornar 10001001. Depois de retornado, esse valor seria divado (qual o verbo que se usa aqui?) por 32000 SE o return não encerrasse o script. Mas como encerra, o valor nem sequer será divado. Então ou eu entendi errado, ou tem pelo menos um engano na digitação (não estou reclamando, só tentando entender). Da forma que eu vejo a sintaxe, o div jamais chegará a ser executado.

Agora, um hash code, pelo que entendi nas minhas pesquisas, pode retornar o mesmo valor pra diversas entradas, o que não é o que procuramos. Embora o script tenha pouca probabilidade de fazer isso, não é impossível (vector(0, 1, 0) = vector(0, 0, 1000)). No caso do jogo de cartas, eu jamais chegaria a tantas cartas, mas o script parece transceder a demanda. Por exemplo, eu poderia armazenar informações de cada inimigo eliminado pelo jogador, usando vector(tipo, defesa, hp inicial) e armazenando, na posição resultante da array, a id do objeto. Inútil, eu sei, mas é só um exercício pra entender o script. Em código:
Código:
derrotados[vector(tipo, defesa, hp_inicial)] = id;
Assim, um inimigo do tipo "0", defesa "0" e de hp inicial 1024 PODERIA ter sua id sobreposta à do inimigo do tipo "0", defesa "1" e hp inicial "24".
derrotados[vector(0, 0, 1024)] = 1000; //primeira id
-> derrotados[1024] = 1000;
derrotados[vector(0, 1, 24)] = 1001; //segunda id
-> derrotados[1024] = 1001; //sobrescrevendo o valor anterior

Não sei. Estou com a impressão que algo está aqui, na minha cara, e eu não estou vendo.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Kabeção em Seg 06 Ago 2012, 14:21

Acho que o Jiraya confundiu mod com div.
No caso div vai retornar o resto da divisão e o mod que é usado para escalar o numero de acordo com um limite.

Se "vector(0, 1, 0) = vector(0, 0, 1000)" então 0 a 999 deve ser o limite para cada argumento, mas que isso parece retornar valores conflitantes como é o caso do exemplo.
É a primeira vez que vejo essa técnica, bem interessante.

O algoritmo parece ser algo do tipo:
32000 é o limite, então posso usar 3 casas de 0, assim 3 argumentos de 1000 posições
Código:
limite = 32000;
c = 1000;
((argument0*c*c+argument1*c+argument2) mod limite);

Se fosse 320000
Código:
limite = 320000;
c = 10000;
((argument0*c*c*c+argument1*c*c+argument2*c+argument3) mod limite);
4 argumentos de 10000 posições.

Se fosse 5
( (argument0*c*c*c*c) + (argument1*c*c*c) + .... mod limite )


Última edição por Kabeção em Seg 06 Ago 2012, 14:50, editado 1 vez(es)

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Seg 06 Ago 2012, 14:43

Ah, agora entendi! Então há mesmo um limite a ser observado em cada parâmetro! Era isso que estava me matando!
Porém fico na dúvida entre mod e div. vector(4, 0, 0), usando mod, é igual a vector (0, 0, 0). E vector(1, 0, 0) é igual a vector(0, 0, 31) usando div (se bem que mudar só o último argumento demora um bocado pra fazer alguma diferença com div, isso faz o argumento de que deve-se usar mod ganhar força).
O Jiraya já explicou, acho que estou com problemas em interpretar a resposta dele.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Kabeção em Seg 06 Ago 2012, 14:51

Usando div a formula retorna valores errados.

Código:
// com div
vector(0, 0, 0) = 0
vector(0, 0, 1) = 0
vector(0, 0, 2) = 0
vector(0, 0, n) = 0 // qualquer valor de 0 a 999 é sempre 0

// com mod
vector(0, 0, 0) = 0
vector(0, 0, 1) = 1
vector(0, 0, 2) = 2
....
Mod retorna valores não conflitantes e crescentes de (0,0,0) = 0 a (999,999,999) = 31249.

Para mim vector(4,0,0) retorna 125 e vector(0,0,0) retorna 0 com mod...
Algo esta errado ai do seu lado. Razz

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Seg 06 Ago 2012, 16:36

É, foi isso o que eu quis dizer com o comentário entre parênteses.

Mas vector(4, 0, 0) retorna 125 se você usar div. Usando mod retorna 0, mesmo. Mas eu cheguei nesse exemplo na base da tentativa-e-erro. vector(0, 32, 0) também TEM que retornar 0, usando mod, porque (x mod x)=0.

E vector(0, 31, 249) também seria igual a vector(999, 999, 999) - só que, no meu teste, vector(999, 999, 999) é igual a 31999... (que é 1 unidade menor que o limite! Coincidência?)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por itallo em Seg 06 Ago 2012, 17:42

acho que não heim, pelo que me lembro e faço o "mod" retorna o resto e o div retorna o valor inteiro.

show_message(string(10 div 3))

itallo

Ranking : Sem avaliações
Número de Mensagens : 969
Idade : 24
Data de inscrição : 26/08/2009
Reputação : 12
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   :
   :

http://www.zuluhotel.com.br

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Ter 07 Ago 2012, 09:30

É isso mesmo...
Gozado, fui verificar no excell se está havendo algum problema no cálculo, obtive mais um resultado diferente. Acho que vou ter que usar lápis e papel pra tirar a dúvida...
No excell, 999.999.999 / 32.000 = 31250; o que de cara, pelos últimos algarismos da equação, sabemos que não pode ser verdade
. Ah, não, quando eu mando mostrar muitas casas decimais, dá 31249,99996875, o que chegaria ao valor mostrado pelo kabeção, se ao invés de simplesmente dividir, eu usasse um "div".

Estranho, os meus resultados estarem diferentes... vou verificar mais uma vez, espere um minutinho.

Ah, não, vocês me confundiram todo! O conceito está certo, mod retorna o "resto" e div retorna o "inteiro", mas os resultados estão trocados.
999.999.999 div 32000 é 31249
999.999.999 mod 32000 é 31999
o que faz com que
999.999.999 / 32000 seja QUASE 31250
devaneio do saim:

Um número dividido por ele mesmo dá resto zero, sempre. Por isso (x mod x = 0). Na verdade, qualquer múltiplo de um número, se dividido por ele dá resto zero, então (a*x mod x = 0).
Já com div, podemos dizer que (a*x div x = a).

Se explodirmos um número qualquer na equação n=a*x+b, onde "x" é o valor pra ser usado nas divisões via mod e div, podemos dizer que:
n mod x = a*x+b mod x = b
n div x = a*x+b div x = a
//achei melhor colocar isso dentro de um spoiler, esse tópico é uma pergunta, não um tutorial.
Mas estou devaneando aqui. A questão é que tanto com mod quanto com div, o script pode retornar resultados iguais pra entradas diferentes, mesmo dentro dos limites de 999 por argumento. Vamos raciocinar com mod, porque eu concordo que mod demora mais pra repetir os resultados. Pequemos vector (0, 32, 0); vector(0, 0, 0); vector(0, 0, 0) e vector(1, 24, 0); (esse último eu tive que calcular). Todos eles vão retornar o mesmo resultado: 0. Adicione o quanto quiser no último argumento de todos os exemplos pra ter resultados diferentes, mas iguais entre si.
Por isso estou com dificuldades pra entender o script. Como o vinians disse, parece ser um hash code. Mas um hash code pode, de fato, retornar resultados iguais pra entradas diferentes, é como dar uma organizada meio geralzona nos argumentos, só pra acelerar a pesquisa.
Eu escolhi alguns poucos exemplos que retornam 0, existem mais alguns. Mas são muito menos que 32000. Se eu quiser procurar um entre 32000 elementos, encontrar entre aqueles cujos argumentos retornam 0 é muito mais rápido que procurar de um a um.
Só que isso serve pra acelerar a pesquisa, não pra aumentar o número de dimensões da array - e é aí que eu me embanano, eu acho que dá, sim, pra aumentar o número de dimensões. Mas tem esses resultados iguais pra argumentos diferentes que me avacalham.


Última edição por saim em Sex 10 Ago 2012, 09:16, editado 2 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Kabeção em Ter 07 Ago 2012, 10:11

É isso mesmo. Eu que me confundi.

Estamos quebrando a cabeça pra ver se é com mod ou div mas acabei de descobrir que tem que usar os dois em conjunto. Razz
http://gmc.yoyogames.com/index.php?showtopic=414085

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por PedroX em Ter 07 Ago 2012, 18:59

@saim

Você pode usar o Google em vez de entrar no Excel:
Veja o resultado.

É só digitar na barra de pesquisa.

O código do Jiraya aparenta funcionar normalmente. Qual seria o problema?

Pelo código:
return(argument0*1000*1000+argument1*1000+argument2) div 32000;

Dá pra ver que o primeiro argumento resulta em no mínimo 1 milhão, logo você não pode usar valores maiores que 1000 no segundo e terceiro argumentos. Isso geraria mais de um número possível.

Edit: agora vi o problema, é o div. Ele sempre arredonda intervalos de 32000 para um mesmo número. O certo seria usar min() ou algo do tipo. Você pode salvar numa variável primeiro, depois ir testando.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por GameMakerTutoriais em Qui 09 Ago 2012, 01:29


Se você usar um intervalo de números maior que o limite, mesmo sendo div ou mod em algum momento dois números próximos vão retornar índices iguais. Além disso, é mais fácil elevar o número na potência da razão inversa pra fazer esse cálculo.

Se o intervalo é de 32000 pro array unidimensional e você quer dividí-lo em 3 índices, seria 32000 ^ 1/3 = 31. Portanto 31 é o alcance máximo de cada índice. Se o array for bidimensional mas usar 6 índices, o resultado é o mesmo, pois é a mesma proporção (dobrou o intervalo de números e dobrou a quantidade de índices).

Acho que um jeito legal seria dividir uma porção de bits pra cada valor. 32000 usa 15 bits, o que daria pra dividir entre dois números de 7 e o array ficaria com: 4 índices e um alcance um pouco maior que 127 pra cada índice (porque vai sobrar um 1 bit se a gente resolver querer usar). Funcionaria, daria menos trabalho e nem gastaria script.

Por exemplo (com 127):

Código:
array[((n1 << 7) | n2, ((n3 << 7) | n4))] // onde n1, n2, n3 e n4 são números de 0 a 127
.

Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Mr.Brum em Qui 09 Ago 2012, 08:46

Meio chato de programar assim, não é? Alguém teria uma forma mais eficiente de organizar (indexar) as cartas?

Spoiler:
Saim, desculpe a demora mas no dia que vc criou o post,eu te respondi,mas minha net caiu e o post sumiu...fiquei irritado e nem respondi mais...

Eu não axo que um array de 4dimensões vá resolver o seu problema...
já passei por situações parecidas e em todas elas é preciso lidar com os índices das arrays,porque ela é quem vai identificar a carta.
E varrer uma lista de arrays em busca de índices é meio cansativo!
Eu sugiro que você use arrays separadas,unidimensionais mesmo:
-numero[]
-nipe[]
-cor[]
-valor[]

Mas como eu vou saber quem é quem??

Pelo índice! Cada índice é uma carta.
EX:
Um 2 de copa:
numero[0]=2
nipe[0]=copa
cor[0]=vermelho
valor[0]=0

Nessa carta, eu sei que o índice 0 em qualquer uma das arrays representa o 2 de copa.

Você ainda vai ter a possibilidade de trabalhar com elas separadamente, por exemplo, ao querer comparar o valor, você vai usar apenas a array valor[], ou ao querer escrever o número dela na tela, vai usar apenas a array numero[].

Eu uso assim e sempre funciona nos meus jogos de cartas.








Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Qui 09 Ago 2012, 13:55

Oi, mrbrum22!
Acho que você usa uma forma diferente da que eu visualizo, pra se organizar. O que eu penso que se faz pra, por exemplo, embaralhar as cartas, é jogar todas elas numa ds_list e usar ds_list_shuffle.
No seu caso, tenho a impressão de que cada carta recebe um índice de uma array, é isso? Tipo, as cartas são objetos e você as cria através de loops em uma-por-uma das arrays, algo como
Código:
with(instance_create(x, y, objCarta){
numero = 2; naipe = copa; cor = vermelho; valor = 0;
}
Se for isso mesmo, como você faz pra embaralhar as cartas e, ao mesmo tempo, garantir que o baralho não tenha dois ases de espadas?

Na verdade, o problema das cartas já foi resolvido. Cheguei à conclusão que se tivermos um número constante de cartas por naipe (e nós temos), basta definir uma constante crescente pra representar as cartas e calcular as variáveis , quando necessário, usando div e mod. Acho que um script assim resolveria:
Código:
carta = argument0;
baralho = carta div 52; //52 cartas/baralho, sem curingas.
cor = (carta - 52 * baralho) div 26; //26 cartas/cor em cada baralho
naipe = (carta - 52 * baralho) div 13; //13 cartas/naipe em cada baralho
valor = carta mod 13; //13 valores pra dividir entre as cartas
Ai, preto = 0; vermelho = 1;
paus = 0; espadas = 1; copas = 2; ouros = 3;
Ás = 0; "2" = 1; "3" = 2; ... ; valete = 10; dama = 11; rei = 12;
Dá pra incluir curingas, também, com algumas modificações mais chatinhas, se colocarmos eles no final do baralho.

Depois que cheguei nessa conclusão, o tópico perdeu o sentido, mas antes disso surgiu o script do Jiraya, que promete tornar possível criar arrays multidimensionais. Mesmo que não seja útil agora, certamente é interessante...

@Kabeção: ainda não consegui ver o link (a yoyogames é bloqueada aqui), por isso ainda não respondi. Mas estou curioso.

@Pedrø: Notou, né? Tanto o div quanto o mod (ver minha última mensagem) apresentam esse problema.
Agora, não entendi suas sugestões. Como usar min, nesse caso? E que tipo de teste eu poderia fazer?

@Ninja8086: Você e seus binários... eu ainda estou tentando entender o que você fez, eu não raciocino em binário com muita velocidade. Tenho que jogar tudo no papel, testar valores, reler os conceitos e operações, etc. Mas eu vou entender, não esquente.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por vinians em Qui 09 Ago 2012, 14:10

Amigos, o mod é um operador que retorna o resto da divisão. É classico utiliza-lo como uma forma fácil de evitar a extrapolação de limites de um número qualquer. Isso é muito utilizado pois teoricamente uma operação inteira de divisão é mais rapida do que utilizar algum IF da vida para verificar o limite.

Por exemplo se eu quero que um resultado, não importando o tamanho que ele gere sempre seja menor ou igual a 10 basta fazer isso, veja o exemplo:
resultado = (10 * irandom(100) * alguma_coisa) mod 10;
resultado = (100000) mod 10;
resultado = (meu_super_calculo * 10) mod 10;
tudo será menor ou igual a 10.
Ou seja o RESTO de uma divisão por 10 nunca vai ser maior que 10. Foi para isso que o nosso amigo Jiraya colocou o DIV, na verdade ele queria colocar o MOD e se enganou.
Agora quanto ao fato do cálculo gerar valores repetidos comprometendo a utilização do método para usar pseudo arrays multidimensionais ai já outra história.
Mas como diz um amigo meu, uma coisa é uma coisa, outra coisa é outra coisa.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Mr.Brum em Qui 09 Ago 2012, 15:20

@saim
Acho que vc não etendeu corretamente...
Eu crio as cartas através de arrays "abstratas",não uso nenhum objeto pra fazer isso.
Spoiler:
Quando eu estou com preguiça eu sigo o método dos objetos que você descreveu!!
No início do jogo, provavelmente em algum create, eu crio as cartas,através de laços de for aninhados.
EX:
cartas=0
for(i=0;i<=10;i+=1){
for(j=0;j<=4;j+=1){
nipe[cartas]=j
}}
*pra cada nipe,teria 4números de cartas.

O modo de sorteio que eu uso é justamente esse da list.
Eu jogo todos os ids de cartas(provavelmente de 0a39) na lista.
Sorteio a lista.
E vou puxando os valores na medida que eu preciso.





Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por saim em Sex 10 Ago 2012, 16:09

@kabeção: Eu vi o link. Não fui a fundo na teoria, mas deu pra ver que é mais complexo do pensávamos, a princípio. Acho que, com esforço, dá pra refazer, se partirmos do princípio dos limites pra cada argumento, mas... agora bateu aquela preguiça, sabe?

@Ninja8086: Consegui entender a teoria. Tive que rascunhar uma calculadora no GM mesmo, porque o excell não tem os operadores bitwise, mas consegui compreender. Se deixarmos de lado a simetria, podemos ter um limite de (quase) 127 pra um argumento e de 255 pro outro, mas isso excede um pouco os 32000 (dá 32767). Eu imaginei que os 32000 pudessem ser um arredondamento do manual, mas não, realmente dá erro usar esse índice.
Já que 32000 é 1111101 00000000 (125 << Cool, podemos usar o primeiro argumento com limite de 124 (11111100) e o segundo com limite de 255 (11111111), perdendo apenas um índice do limite.
array[n1 << 8 | n2, n3 << 8 | n4]
Mas não dá pra inverter os limites.

@mrbrum22: acho que você quiz dizer:
Código:
for(i=0;i<=10;i+=1){
for(j=0;j<4;j+=1){
nipe[i]=j
}}
certo? (é que não aparece, no código, o que significa "cartas").
Ou, talvez, algo como
Código:
nCartas = 10; //número de cartas por naipe
for(i=0;i<nCartas;i+=1){
for(j=0;j<4;j+=1){
nipe[i + nCartas * j]=j
}}
Aí, nesse caso, os índices da array "nipe" variariam de 0 a 39, sendo que os resultados seriam
nipe[0 a 9] = 0;
nipe[10 a 19] = 1;
nipe[20 a 29] = 2;
nipe[30 a 39] = 3;

É isso? Se for, é mais ou menos a mesma coisa que eu fiz, só que ao contrário. As cartas seriam só índices, ou seja, valores inteiros (abstratos, como você disse), e as cores, naipes e baralhos de onde elas vêm seriam determinados em função da distribuição desses valores dentro dos limites.

Hmm.., talvez dê pra modificar aquele script que eu passei, pra determinar o valor de cada índice da array...
Código:
for(i = 0; i < 52; i += 1){
defineCarta(i)
}
Código:
// script defineCarta
carta = argument0;
baralho[carta] = carta div 52; //52 cartas/baralho, sem curingas.
cor[carta] = (carta - 52 * baralho) div 26; //26 cartas/cor em cada baralho
naipe[carta] = (carta - 52 * baralho) div 13; //13 cartas/naipe em cada baralho
valor[carta] = carta mod 13; //13 valores pra dividir entre as cartas
Daí, posso fazer isso só uma vez no jogo, sem ter que rodar o script a cada ação. Isso melhora bem a performance! E, nos objetos-carta (se houverem), eu coloco uma variável (tipo "indice_carta") e posso fazer testes como
Código:
var corNaMesa, corNaMão, valorNaMesa, valorNaMao;
corNaMesa = cor[cartaNaMesa.indice_carta];
corNaMão = cor[cartaNaMão.indice_carta];
valorNaMesa = valor[cartaNaMesa.indice_carta];
valorNaMao = valor[cartaNaMão.indice_carta ;
if (corNaMesa  != corNaMão && valorNaMesa == (valorNaMao + 1)) {
//movimento permitido
}
else {
//movimento proibido
}

Taí, agora fiquei satisfeito com os resultados! Por mim, podem trancar o tópico. Acho que ainda tem coisa interessante pra vir por aí, mas tudo o que eu queria já foi resolvido.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Mr.Brum em Sex 10 Ago 2012, 17:58

Não tranquem ainda...

na verdade era aquilo mesmo, mas eu esqueci de incrementar a variável cartas.

Bom esse é o método que eu uso,uma array para cada dado que eu quero recuperar.
Aqui está um código que eu uso no create para criar cartas,com nipe,nome,numero e valor:

Código:
totalcartas=0 //total de cartas

//criando a lista de índice das cartas(40):
cartas=ds_list_create()

//criando as cartas do baralho:
for(i=1;i<=10;i+=1){
for(j=0;j<4;j+=1){
numero[totalcartas]=i
nipe[totalcartas]=j
//adicionando o indice para a lista:
ds_list_add(cartas,totalcartas)
//nomeando as cartas:
if numero[totalcartas]==1 nome[totalcartas]="A"
else if numero[totalcartas]==8 nome[totalcartas]="Q"
else if numero[totalcartas]==9 nome[totalcartas]="J"
else if numero[totalcartas]==10 nome[totalcartas]="K"
else nome[totalcartas]=string(numero[totalcartas])

//pontuando as cartas:
if numero[totalcartas]==1 pontos[totalcartas]=11
else if numero[totalcartas]==7 pontos[totalcartas]=10
else if numero[totalcartas]==8 pontos[totalcartas]=2
else if numero[totalcartas]==9 pontos[totalcartas]=3
else if numero[totalcartas]==10 pontos[totalcartas]=4
else pontos[totalcartas]=0


totalcartas+=1;
}}


ENGINE

Agora sim pode trancar!

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Array de múltiplas dimensões (GM não tem)

Mensagem por Conteúdo patrocinado Hoje à(s) 14:20


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum