Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Duvida]Evitar cartas repetidas em um baralho.
5 participantes
Página 1 de 1
[Duvida]Evitar cartas repetidas em um baralho.
Boa noite, estou estudando a mecanica de jogos de cartas, e queria fazer um pôquer bem simples, aonde surgiria cinco cartas dentro da room e ele mostrasse o nome das combinações, porém, ja estou tendo dificuldades para evitar que as cartas se repitam, não sei se usei o array de forma errada ali embaixo, abaixo tem os detalhes do projeto.
Versão do software: Game Maker Studio Free Edition v1.1.1044
Edit: Troquei o while pelo repeat e continua repetindo as cartas.
Sprites que estou utilizando no projeto:
Para as cartas: playingcards_strip54
Para o baralho de onde ira surgir as cartas: backs_strip10
Dentro do projeto:
Sprites:
Objetos:
Versão do software: Game Maker Studio Free Edition v1.1.1044
Edit: Troquei o while pelo repeat e continua repetindo as cartas.
Sprites que estou utilizando no projeto:
Para as cartas: playingcards_strip54
Para o baralho de onde ira surgir as cartas: backs_strip10
Dentro do projeto:
Sprites:
- Sprites:
spr_cards(playingcards_strip54)
spr_card_back(backs_strip10)
Ambos tem como sua origem, o centro(x=55/y=75).
Objetos:
- Objetos:
obj_card(spr_cards):
Create:- Create:
- Código:
i=0; //Contador para o array
global.imagecard[i]=54; //Array que ira verificar se ja existe a carta no jogo
repeat(global.imagecard[i]==image_index || i==54){ //While que ira continuar rodando até sair uma carta diferente
image_index=random(53); //Escolhe uma das imagens para ser a carta
i=+1; //Contador do array
}
obj_deck(spr_card_back)
Create:- Create:
- Código:
image_speed=0;
image_index=0;
create_local=0;
- Step:
- Código:
if mouse_check_button_pressed(mb_left)&& distance_to_point(mouse_x,mouse_y)==0{
if create_local==0 {instance_create(165,75,obj_card);}
if create_local==1 {instance_create(330,75,obj_card);}
if create_local==2 {instance_create(495,75,obj_card);}
if create_local==3 {instance_create(165,225,obj_card);}
if create_local==4 {instance_create(495,225,obj_card);}
create_local+=1;
}
Scare- Data de inscrição : 06/03/2012
Reputação : 1
Número de Mensagens : 10
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
nunca tentei isso, mais acho que as arrays e o comando for podem te ajudar, vou te passar minha ideia:
são 13 cartas de cada nipe, 2 coringas , e são 4 nipes
seria algo assim:
1: ouro
2: copa
3: espada
4: pé de pinto
Carta[NIPE,NUMERO DA CARTA]
Carta[1,1]=0//nesse caso a carta A de ouro esta desativada em Jogo
Carta[1,1]=1//nesse caso a carta A de ouro esta ativada em Jogo
para inicializar, seria algo assim:
for(i=1; i<13; i+=1){
Carta[1,i]=0
Carta[2,i]=0
Carta[3,i]=0
Carta[4,i]=0
}
o coringa eu não adicionei, mais acho que se você intender essa funcionalidade você consegue adc os coringas, flwz
são 13 cartas de cada nipe, 2 coringas , e são 4 nipes
seria algo assim:
1: ouro
2: copa
3: espada
4: pé de pinto
Carta[NIPE,NUMERO DA CARTA]
Carta[1,1]=0//nesse caso a carta A de ouro esta desativada em Jogo
Carta[1,1]=1//nesse caso a carta A de ouro esta ativada em Jogo
para inicializar, seria algo assim:
for(i=1; i<13; i+=1){
Carta[1,i]=0
Carta[2,i]=0
Carta[3,i]=0
Carta[4,i]=0
}
o coringa eu não adicionei, mais acho que se você intender essa funcionalidade você consegue adc os coringas, flwz
Re: [Duvida]Evitar cartas repetidas em um baralho.
Tentarei aplicar isso e ja venho com a resposta.
Scare- Data de inscrição : 06/03/2012
Reputação : 1
Número de Mensagens : 10
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
Parece que descobri a lógica, eu fiz algo parecido com o que tu me falou.
Primeiro criei um um novo objeto, obj_control, a função dele é dar valor as arrays, mas além de usar matriz, apenas usei vetor, o valor das cartas usarei uma outra variavel que usarei futuramente.
Esse obj_control possui apenas um create, pois dara o valor ao array apenas uma vez, o código é o seguinte:
Agora o problema parece estar no comando de repetição, toda vez que tem uma carta repetida, além dele verificar de novo como pede a condição do loop, ele coloca a image53, e quando tiro aquele "image_index=53", o programa da erro falando que existe um conflito. Perdão o doublepost.
@Edit: Fiz a seguinte alteração no create do obj_card, só que invés de repetir, agora esta retornando image0.
Primeiro criei um um novo objeto, obj_control, a função dele é dar valor as arrays, mas além de usar matriz, apenas usei vetor, o valor das cartas usarei uma outra variavel que usarei futuramente.
Esse obj_control possui apenas um create, pois dara o valor ao array apenas uma vez, o código é o seguinte:
- Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
- Código:
card=0;
image_speed=0;
image_index=53;
//Contador
card=round(random(53));
repeat (global.imagecard[card]==0){
image_index=card;
global.imagecard[card]=1;
}
Agora o problema parece estar no comando de repetição, toda vez que tem uma carta repetida, além dele verificar de novo como pede a condição do loop, ele coloca a image53, e quando tiro aquele "image_index=53", o programa da erro falando que existe um conflito. Perdão o doublepost.
@Edit: Fiz a seguinte alteração no create do obj_card, só que invés de repetir, agora esta retornando image0.
- Código:
card=0;
image_speed=0;
//Contador
card=round(random(53));
while (global.imagecard[card]==0){
if global.imagecard[card]==1{
card=round(random(53));
}else{
image_index=card;
global.imagecard[card]=1;}
}
Scare- Data de inscrição : 06/03/2012
Reputação : 1
Número de Mensagens : 10
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
o erro ta aqui:
- Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
Re: [Duvida]Evitar cartas repetidas em um baralho.
Quando eu me meti a fazer um jogo de cartas, eu fiz o seguinte:
- Ao invés de uma array, usei uma ds_list. De uma dimensão, apenas. Cada carta recebia um "valor" igual à posição na ds_list.
- As cartas eram alinhadas nessa ds_list. Os naipes e valores eram definidos em função da posição na list (naipe := posição div 13; valor := posição mod 13; cor := posição div 26).
- Quando ia começar o jogo, eu criava uma cópia da ds_list original e embaralhava ela. A cada carta, eu tirava o primeiro valor da ds_list embaralhada e eliminava ele da ds_list.
Nunca terminei o jogo, então pode ser que surjam problemas a partir dessa lógica. Mas isso de eliminar a carta que já foi distribuída da ds_list garante que as cartas não se repitam sem ter que verificar pelos índices que já foram sorteados.
- Ao invés de uma array, usei uma ds_list. De uma dimensão, apenas. Cada carta recebia um "valor" igual à posição na ds_list.
- As cartas eram alinhadas nessa ds_list. Os naipes e valores eram definidos em função da posição na list (naipe := posição div 13; valor := posição mod 13; cor := posição div 26).
- Quando ia começar o jogo, eu criava uma cópia da ds_list original e embaralhava ela. A cada carta, eu tirava o primeiro valor da ds_list embaralhada e eliminava ele da ds_list.
Nunca terminei o jogo, então pode ser que surjam problemas a partir dessa lógica. Mas isso de eliminar a carta que já foi distribuída da ds_list garante que as cartas não se repitam sem ter que verificar pelos índices que já foram sorteados.
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
Se tiver dificuldade com ds_list, pode usar strings mesmo.
Só que o número 10 precisa ser trocado por uma letra qualquer. Vamos usar 'X'.
Ao sair uma carta, adicione-a na variável.
Exemplos:
Para ver se uma carta ainda não foi jogada:
Só que o número 10 precisa ser trocado por uma letra qualquer. Vamos usar 'X'.
- Código:
cartas = "";
Ao sair uma carta, adicione-a na variável.
Exemplos:
- Código:
cartas += "AZ"; // A de zap
cartas += "XC"; // 10 de copas
cartas += "KE"; // K de espadilha
cartas += "5O"; // 5 de ouros
Para ver se uma carta ainda não foi jogada:
- Código:
if (!string_pos('AZ', cartas))
{
//ainda não foi lançada na mesa a carta A de zap
}
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: [Duvida]Evitar cartas repetidas em um baralho.
Tentei e da a mesma coisa. "/Isaque Onix escreveu:o erro ta aqui:ao invéz de colocar 54, coloque 55 e tenta de novo
- Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
No caso, eu teria que criar 53 ifs encadeados?PedroX escreveu:Se tiver dificuldade com ds_list, pode usar strings mesmo.
Só que o número 10 precisa ser trocado por uma letra qualquer. Vamos usar 'X'.
- Código:
cartas = "";
Ao sair uma carta, adicione-a na variável.
Exemplos:
- Código:
cartas += "AZ"; // A de zap
cartas += "XC"; // 10 de copas
cartas += "KE"; // K de espadilha
cartas += "5O"; // 5 de ouros
Para ver se uma carta ainda não foi jogada:
- Código:
if (!string_pos('AZ', cartas))
{
//ainda não foi lançada na mesa a carta A de zap
}
saim escreveu:Quando eu me meti a fazer um jogo de cartas, eu fiz o seguinte:
- Ao invés de uma array, usei uma ds_list. De uma dimensão, apenas. Cada carta recebia um "valor" igual à posição na ds_list.
- As cartas eram alinhadas nessa ds_list. Os naipes e valores eram definidos em função da posição na list (naipe := posição div 13; valor := posição mod 13; cor := posição div 26).
- Quando ia começar o jogo, eu criava uma cópia da ds_list original e embaralhava ela. A cada carta, eu tirava o primeiro valor da ds_list embaralhada e eliminava ele da ds_list.
Nunca terminei o jogo, então pode ser que surjam problemas a partir dessa lógica. Mas isso de eliminar a carta que já foi distribuída da ds_list garante que as cartas não se repitam sem ter que verificar pelos índices que já foram sorteados.
Essa ds_list funciona como um banco de dados? Cada ds_list funcionara como uma tabela, ou seja, em um ds_list posso armazenar uma linha de informação(No caso o numero e naipe da carta?), e ao decorrer do jogo posso escolher a linha que quero excluir?
Scare- Data de inscrição : 06/03/2012
Reputação : 1
Número de Mensagens : 10
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
No caso, eu teria que criar 53 ifs encadeados?
Não. Você deverá colocar algo assim:
- Código:
while (1)
{
a = choose('A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'Q', 'J', 'K');
b = choose('Z', 'C', 'E', 'O');
if (!string_pos(a+b, cartas)) {cartas+=a+b; break;}
}
Isso fará com que uma carta que ainda não tenha sido sorteada seja gerada.
No meu teste, gerou: 'JO', ou seja J de ouros.
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: [Duvida]Evitar cartas repetidas em um baralho.
Bom, primeiro tentarei o ds_list, ja que pesquisei por ele e achei interessante eu dominar esse sistema, mas a lógica do PedroX é interessante e pretendo estuda-la futuramente.
Bom, as alterações fiz em base de ds_list, o projeto se encontra assim:
obj_control:
Create:
obj_card
Create
obj_deck
Create
Step
Mas agora retorna o seguinte erro:
Bom, as alterações fiz em base de ds_list, o projeto se encontra assim:
obj_control:
Create:
- Código:
- Create escreveu:card = ds_list_create();
ds_list_add(card,"0");
ds_list_add(card,"1");
ds_list_add(card,"4");
ds_list_add(card,"5");
ds_list_add(card,"6");
ds_list_add(card,"7");
ds_list_add(card,"8");
ds_list_add(card,"9");
ds_list_add(card,"10");
ds_list_add(card,"11");
ds_list_add(card,"12");
ds_list_add(card,"13");
ds_list_add(card,"14");
ds_list_add(card,"15");
ds_list_add(card,"16");
ds_list_add(card,"17");
ds_list_add(card,"18");
ds_list_add(card,"19");
ds_list_add(card,"20");
ds_list_add(card,"21");
ds_list_add(card,"22");
ds_list_add(card,"23");
ds_list_add(card,"24");
ds_list_add(card,"25");
ds_list_add(card,"26");
ds_list_add(card,"27");
ds_list_add(card,"28");
ds_list_add(card,"29");
ds_list_add(card,"30");
ds_list_add(card,"31");
ds_list_add(card,"32");
ds_list_add(card,"33");
ds_list_add(card,"34");
ds_list_add(card,"35");
ds_list_add(card,"36");
ds_list_add(card,"37");
ds_list_add(card,"38");
ds_list_add(card,"39");
ds_list_add(card,"40");
ds_list_add(card,"41");
ds_list_add(card,"42");
ds_list_add(card,"43");
ds_list_add(card,"44");
ds_list_add(card,"45");
ds_list_add(card,"46");
ds_list_add(card,"47");
ds_list_add(card,"48");
ds_list_add(card,"49");
ds_list_add(card,"50");
ds_list_add(card,"51");
ds_list_add(card,"52");
ds_list_add(card,"53");
obj_card
Create
- Código:
- Código:
card_random=round(random(53));
ds_list_shuffle(card);
while ds_list_find_index(card,-1){
ds_list_find_index(card,card_random);
if !ds_list_find_index(card,-1){
image_index=card_random;
ds_list_delete (card, card_random);
}else{
card_random=round(random(53));
}
}
obj_deck
Create
- Spoiler:
- Código:
image_speed=0;
image_index=0;
create_local=0;
Step
- Spoiler:
- Código:
if mouse_check_button_pressed(mb_left)&& distance_to_point(mouse_x,mouse_y)==0{
if !ds_list_empty(card){
c=instance_create(165,75,obj_card);
c.depth=create_local;
create_local-=1;
}
}
Mas agora retorna o seguinte erro:
- Código:
############################################################################################
FATAL ERROR in
action number 1
of Step Event0
for object obj_deck:
Push :: Execution Error - Variable Get -1.card(100001, 0)
at gml_Object_obj_deck_Step_0 (line 7) - if !ds_list_empty(card){
############################################################################################
Scare- Data de inscrição : 06/03/2012
Reputação : 1
Número de Mensagens : 10
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
Eu acho que o jeito mais fácil é usar um array simples (unidimensional) com um número específico pra cada carta.
As cartas seriam de 0 a 12 para Ouros, 13 a 25 para Espadas, 26 a 38 para Paus e 39 a 51 para Copas. O naipe seria o número da carta dividido pela quantidade de cartas em cada naipe, que é 13 (de 0 a 12). Então, ficaria fácil assim:
- Código:
carta := numero mod 13; // Valor da carta
naipe := carta div 13; // 0 = Ouros, 1 = Espadas, 2 = Paus, 3 = Copas
Acho que 'ds_list' é uma boa se você usar com um 'ds_queue' (ou ds_stack) pra regrar o jogo. Você pode usar a função 'ds_list_shuffle' pra embaralhar os valores das cartas ou então retirar cartas do deck com 'ds_list_delete'. Com 'ds_queue' você pode verificar as jogadas e saber quais cartas estão dentro ou fora da jogada ou do deck.
Dê uma pesquisada no fórum sobre 'ds_list' e 'ds_queue' (ou ds_stack). Abraços.
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
Quase isso, brendan, mas as cores dos naipes devem estar juntas também. Em muitos jogos, a cor estar intercalada é importante, independente do naipe, portanto é uma informação relevante. Aí,
As cartas seriam de 0 a 12 para Ouros, 13 a 25 para Copas, 26 a 38 para Paus e 39 a 51 para Espadas.
E
Muda para:brendan604 escreveu:As cartas seriam de 0 a 12 para Ouros, 13 a 25 para Espadas, 26 a 38 para Paus e 39 a 51 para Copas.
As cartas seriam de 0 a 12 para Ouros, 13 a 25 para Copas, 26 a 38 para Paus e 39 a 51 para Espadas.
E
- Código:
carta := numero mod 13; // Valor da carta
naipe := carta div 13; // 0 = Ouros, 1 = Espadas, 2 = Paus, 3 = Copas
- Código:
carta := numero mod 13; // Valor da carta
naipe := numero div 13; // 0 = Ouros, 1 = Copas, 2 = Paus, 3 = Espadas
cor := numero div 26; // 0 = vermelha, 1 = preta
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Duvida]Evitar cartas repetidas em um baralho.
Tem razão! Eu não tinha lido tudo, mas agora vi que a sua ideia também era essa, além de incluir os naipes no cálculo. Eu nunca fiz um jogo de cartas, mas penso que usar essa forma seria bem mais simples do que grids, por exemplo...
Num jogo tipo "paciência", talvez ficasse fácil coordenar em qual coluna cada carta entra usando um ds_stack. Já com os queues facilitaria pôr ou retirar cartas da jogada e funcionaria como regra de jogo para entrar com o valor no ds_stack.
Talvez, com o mesmo projeto, fosse possível fazer vários outros jogos apenas mudando as regras do queue. Mas eu só conheço 'paciência'...
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos