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

Sign in to follow this  
kaos

Distribuir cartas

Recommended Posts

kaos

Registei-me hoje neste fórum e no primeiro post é logo com uma duvida :confused:

Bem pessoal, ando aqui a pensar nisto à uns tempos e não consigo mesmo ter uma ideia.

Desenvolvi como projecto numa cadeira de Inteligência Artificial um jogador de sueca ( sim , o jogo de cartas mesmo ). Já tive a discussão, já saiu a nota etc etc. Mas gostava de fazer uns melhoramentos para tornar isto um pouco mais eficiente.

Muito rapidamente, o programa funciona desta maneira: Sabemos as nossas cartas logo sabemos as restantes, são realizados N jogos baralhando as cartas pelos outros jogadores e calcula em média qual a melhor jogada.

Até aqui tudo bem, mas nós quando jogamos à sueca, gostamos de memorizar quando um jogador não assiste ao naipe, é porque já não tem mais cartas desse mesmo naipe. Tenho já a guardar numa matriz quais os naipes que cada um jogador tem.

O PROBLEMA

Se já existirem muitas restrições, ao baralhar e distribuir as cartas pelos jogadores tendo em conta os naipes que cada um já não possui, pode calhar nas ultimas atribuições de cartas só existirem cartas dos naipes que o jogador já não possui. Como resolver isto?

Se não tiver dado para perceber, avisem que tento explicar um pouco melhor.

Já andei a pensar e a pensar sobre isto e não está fácil de arranjar uma solução. Alguém faz ideia?

Não preciso de código, apenas dumas luzinhas

Cumprimentos.

Share this post


Link to post
Share on other sites
Tharis

Eu não me dedico à Sueca, mas quando se joga à Sueca, baralha-se, distribuem-se as cartas por 4 e joga-se. Depois do jogo acabar, voltam-se a dar e volta-se a jogar. Quando um jogador não assiste, isso só conta para esse jogo e não para o próximo, me guesses.

Share this post


Link to post
Share on other sites
kaos

obrigado pela resposta mas acho que não percebeste bem a minha duvida. é a seguinte:

o objectivo não foi fazer a gui do jogo mas sim 1 jogador, ou seja, a inteligência artificial. O jogador está já feito (através de árvores de procura) mas o problema está nisto (meramente para optimização):

imagina que tens uma matriz com os naipes que cada jogador tem, e queres  distribuir as cartas restantes para previsão de jogadas (realizando N jogos). tendo em conta as restrições, existe o problema de quando estás a distribuir as ultimas cartas, o jogador já não poder possuir essas cartas pois já não possui esses naipes e já não existirem mais cartas para receber, ou seja entra em deadlock. é aqui que está o meu problema

Share this post


Link to post
Share on other sites
pedrosorio

O jogador da A.I. pode ainda saber quais as cartas que já foram jogadas e obviamente as cartas que ele tem.

Nesse caso, uma hipótese seria talvez gerar uma árvore com todas as distribuições de cartas possíveis (i.e. começavas com o nó em que nenhuma carta estava distribuída e depois ias criando nós em que cada um definia a carta que o jogador recebia). Os níveis congruentes a n mod 3 seriam correspondentes às cartas que o n-ésimo jogador "real" recebia (com n=0,1 ou 2). Se entrasse em contradição com as cartas já distribuídas eliminavas esse nó.

Não sei porquê mas isto está a parecer-me uma ideia muito parva por isso não vou escrever mais =X -> dormir


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
kaos

mas as árvores, funções de avaliação e isso já está tudo feito ... o problema está é em conseguir distribuir as cartas por vários jogadores tendo em conta os naipes que cada um tem :confused:

Share this post


Link to post
Share on other sites
Edo

Sinceramente não percebi o que queres fazer.

O PROBLEMA

Se já existirem muitas restrições, ao baralhar e distribuir as cartas pelos jogadores tendo em conta os naipes que cada um já não possui, pode calhar nas ultimas atribuições de cartas só existirem cartas dos naipes que o jogador já não possui. Como resolver isto?

Mas as restrições não são aplicadas depois das cartas estarem distribuídas? Enquanto estás a jogar é que vais marcando a tabela de naipes que determinado jogador já não tem.

Share this post


Link to post
Share on other sites
pmg

Se, antes de distribuires as cartas, definires a distribuição mínima e máxima para cada jogador, acho que esse problema desaparece.

       Espadas |  Copas |   Paus |  Ouros
A.I.    3 .. 3 | 2 .. 2 | 4 .. 4 | 1 .. 1 (baseado nas cartas recebidas)
Jog. A  0 .. 7 | 0 .. 8 | 0 .. 6 | 0 .. 9
Jog. B  0 .. 7 | 0 .. 8 | 0 .. 6 | 0 .. 9
Jog. C  0 .. 7 | 0 .. 8 | 0 .. 6 | 0 .. 9

Agora pegas numa carta livre qualquer, atribuis essa carta a um jogador que a possa receber e actualizas os outros, por exemplo: Ás de Paus para o jogador A

       Espadas |  Copas |   Paus |  Ouros
A.I.    3 .. 3 | 2 .. 2 | 4 .. 4 | 1 .. 1
Jog. A  0 .. 7 | 0 .. 8 | 1 .. 6 | 0 .. 9 (Ás de Paus)
Jog. B  0 .. 7 | 0 .. 8 | 0 .. 5 | 0 .. 9 (ficam 5 Paus "livres")
Jog. C  0 .. 7 | 0 .. 8 | 0 .. 5 | 0 .. 9

etc ...

a certa altura da distribuição poderás ter qualquer coisa como

       Espadas |  Copas |   Paus |  Ouros
A.I.    3 .. 3 | 2 .. 2 | 4 .. 4 | 1 .. 1 (10 cartas)
Jog. A  2 .. 2 | 2 .. 2 | 3 .. 3 | 3 .. 3 (10 cartas)
Jog. B  4 .. 4 | 3 .. 3 | 0 .. 1 | 2 .. 2 (9 cartas)
Jog. C  1 .. 1 | 3 .. 3 | 2 .. 2 | 3 .. 4 (9 cartas)

Onde te falta atribuir um Pau e um Ouro. O Pau tem que ser para o Jogador B e o Ouro para o Jogador C.

... Agora implementar isto é que pode ser trabalhoso :confused:


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrosorio

Não parece ser muito trabalhoso =)

Basta teres um vector/lista com as cartas que ainda faltam dar, manter essa tabela actualizada que é simples e para cada carta que seleccionares aleatoriamente verificar os jogadores que a podem receber, guardar essa informação e gerar um número aleatório entre 1 e n (em que n pode ser 1,2 ou 3 conforme o número de jogadores que podem receber a carta) e atribuir a carta ao jogador que calhar.

Já agora, achas que é mesmo preciso manter o mínimo de cartas de um dado naipe que um jogador pode receber?


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
kaos

Obrigado desde já pelas respostas :confused:

pedrosorio, não chega guardar apenas o vector com as cartas restantes, dessa maneira é como tenho feito agora. Distribui as cartas por todos os jogadores mas a meio do jogo quando sabes que o jogador X ou Y não tem um certo naipe (não assistiu), ao fazer os baralhos na próxima rodada para previsão não está a ter isso em conta.

pmg, realmente por aí acho que chego lá, tendo em conta que o jogador X já não tem um certo naipe, basta meter com a distribuição máxima 0 nesse naipe e depois fazer umas ou outras condições para que tenha sempre uma carta para receber.

vou ver o que consigo fazer e já vos digo qualquer coisa  :cheesygrin:

cumprimentos

Share this post


Link to post
Share on other sites
pmg

achas que é mesmo preciso manter o mínimo de cartas de um dado naipe que um jogador pode receber?

Hmmm ... não, de facto não.

Estava a "confundir" com a minha versão (nunca feita, só pensada) do mesmo problema: a minha versão era (é ... vai ser ... lol) para bridge em vez de sueca; e em bridge, o mínimo de cartas pode ser importante.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrosorio

pedrosorio, não chega guardar apenas o vector com as cartas restantes, dessa maneira é como tenho feito agora. Distribui as cartas por todos os jogadores mas a meio do jogo quando sabes que o jogador X ou Y não tem um certo naipe (não assistiu), ao fazer os baralhos na próxima rodada para previsão não está a ter isso em conta.

Não percebeste. Eu estava a referir-me à implementação da ideia do pmg. Guardar as cartas que restam num vector (para as ir distribuindo aleatoriamente) é a primeira parte da implementação. A segunda parte é ter uma matriz com o máximo de cartas de um dado naipe que cada jogador ainda pode ter que vai sendo actualizada à medida que distribuis as cartas .


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.