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

kaos

Distribuir cartas

11 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora