[Duvida]Evitar cartas repetidas em um baralho.

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

[Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Scare em Sab 22 Jun 2013, 19:11

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:
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:
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

Número de Mensagens : 10
Data de inscrição : 06/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Isaque Onix em Sab 22 Jun 2013, 20:12

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

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Scare em Sab 22 Jun 2013, 21:54

Tentarei aplicar isso e ja venho com a resposta.

Scare

Número de Mensagens : 10
Data de inscrição : 06/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Scare em Dom 23 Jun 2013, 17:42

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:


Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
Voltei ao objeto obj_card e alterei seu create da seguinte maneira:


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

Número de Mensagens : 10
Data de inscrição : 06/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Isaque Onix em Seg 24 Jun 2013, 09:15

o erro ta aqui: 



Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
 ao invéz de colocar 54, coloque 55 e tenta de novo

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por saim em Seg 24 Jun 2013, 10:26

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.

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por PedroX em Seg 24 Jun 2013, 11:40

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
}

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Scare em Seg 24 Jun 2013, 18:40

Isaque Onix escreveu:o erro ta aqui: 



Código:
for(i=0; i<54; i+=1){
global.imagecard[i]=0;
}
 ao invéz de colocar 54, coloque 55 e tenta de novo
Tentei e da a mesma coisa. "/

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
}
No caso, eu teria que criar 53 ifs encadeados?
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

Número de Mensagens : 10
Data de inscrição : 06/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por PedroX em Seg 24 Jun 2013, 19:04

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.

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Scare em Seg 24 Jun 2013, 23:48

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:
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

Número de Mensagens : 10
Data de inscrição : 06/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por GameMakerTutoriais em Qui 27 Jun 2013, 21:45



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

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por saim em Sex 28 Jun 2013, 09:38

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í,
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.
Muda para:
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
Muda para
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

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por GameMakerTutoriais em Sex 28 Jun 2013, 12:48



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

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: [Duvida]Evitar cartas repetidas em um baralho.

Mensagem por Conteúdo patrocinado Hoje à(s) 06:34


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