Entrar
Últimos assuntos
» Servidor de Discord do fórum?por Super Games Sáb 18 maio 2024, 01:27
» Problemas com a caixa de diálogo, ela é pequena e as letras não cabem dentro
por Rukasu777 Qui 16 maio 2024, 18:10
» Problemas com particulas
por RastaMaan Dom 12 maio 2024, 17:03
» Problema ao entrar por uma porta e voltar por ela
por aminaro Seg 06 maio 2024, 10:08
» Alguém aqui já ganha dinheiro com seus games?
por theguitarmester Ter 30 Abr 2024, 11:43
» Colisões não funcionando
por theguitarmester Ter 30 Abr 2024, 10:16
» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Sex 26 Abr 2024, 16:45
» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18
» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30
» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07
» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45
» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51
» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31
» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11
» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39
» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
[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
Tópicos semelhantes
» evitar o player bater nas pontas de objectos
» Cartas repetidas
» Evitar movimento para a mesma GRID
» Um modo de evitar decompilers?
» como evitar bug no meu jogo
» Cartas repetidas
» Evitar movimento para a mesma GRID
» Um modo de evitar decompilers?
» como evitar bug no meu jogo
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|