C# Poker - Estruturas de Dados - M3
A downloadable game
1. Introdução
O presente projeto se trata de uma simulação da variante do jogo de poker chamada Texas hold 'em, programado em C# com a ajuda do professor Marcelo Dornbusch Lopes, para a matéria de Estruturas de Dados do terceiro período do curso de Design de Jogos da Univali.
O objetivo do projeto é implementar parte da lógica de um jogo de poker. Para tanto, aplicou-se os conhecimentos obtidos na disciplina, como estruturas de dados e programação orientada a objetos.
Inicialmente, para compor a média 1, os acadêmicos estudaram as diferentes mãos de poker, e produziram as descrições narrativas para a lógica do reconhecimento das respectivas combinações pelo programa.
Para a média 2, utilizou-se uma base de código escrita pelo professor para colocar em prática os algoritmos de reconhecimento das mãos.
Como parte da média 3, criou-se a presente página do Itch.io para publicar o projeto, e implementou-se parte da lógica para uma partida de poker entre 2 jogadores.
Quanto aos métodos empregados para a produção do código, utilizou-se a ajuda do professor durante as aulas e recursos da Internet como o site de referência da Microsoft (Microsoft, 2024).
2. Desenvolvimento
Na M1, as descrições narrativas foram desenvolvidas com base nas regras do poker, conforme descritas no site do World Series of Poker (WSOP, 2024). Essas descrições narrativas foram apresentadas em sala, junto com um tipo de estrutura de dados específica (como. por exemplo, a Hash Table).
Para a M2, o site de referência da Microsoft foi uma referência indispensável (Microsoft, 2024), e além disso procurou-se utilizar os 4 pilares da programação orientada a objetos, quais sejam: Abstração, Encapsulamento, Herança e Polimorfismo (Henrique, 2023). O progresso foi reportado em sala em uma apresentação criada no site Canva.com.
Quanto à M3, implementou-se a lógica para uma simulação de jogo entre dois jogadores, sendo que todas as possibilidades de mãos teriam de ser avaliadas, e o então deveria ser declarado o vencedor dentre os jogadores.
A ferramenta Chat GPT foi utilizada principalmente na M2 e M3, principalmente de duas formas. A primeira, foi na etapa de análise do código fornecido pelo professor, onde foi pedido para a IA explicar a funcionalidade de determinados trechos de código. Exemplo.
A segunda forma foi para perguntar para a IA por que determinado trecho de código criado pelos acadêmicos não estava funcionando como o esperado, sendo que em mais de uma oportunidade o feedback fornecido pela IA foi útil para a solução do problema. Exemplo.
2.1 Conceito
Texas hold 'em é uma das variantes mais populares do poker. Se joga com um baralho tradicional de 52 cartas, com 2 ou mais jogadores (geralmente de 2 a 10). Nessa variante, cada jogador recebe 2 cartas, e pode compor sua mão com as cartas da mesa, comuns a todos. Assim, no final, a mão será formada de 5 cartas, dentre as 7 disponíveis (2 do jogador, e 5 cartas comunitárias) (Wikipedia, 2024).
2.2 Programação
O projeto foi programado utilizando-se da linguagem C#, no editor Visual Studio Code. As cartas são instâncias da classe Card, que possuem 3 atributos abstraídos das cartas reais: Rank (valor), Suit (naipe) e Owner (o dono da carta).
As cartas são criadas, embaralhadas e distribuídas pela figura do croupier ou dealer. As cartas em jogo com o valor owner igual a zero são as cartas comunitárias, que podem ser usadas por qualquer jogador.
Há 10 classes com os nomes das mãos de poker, sendo que 8 foram desenvolvidas pelos acadêmicos, e 2 foram fornecidas pelo professor (High Card e Royal Flush). Essas classes servem para detectar as respectivas mãos ao analisar um conjunto de 7 cartas.
Para facilitar a identificação das demais mãos, também foi providenciado uma base de código já implementado, onde é possível, por exemplo, distribuir cartas de um baralho aleatoriamente, e organizar um conjunto de cartas em um histograma. Nesse histograma, as cartas ficam organizadas do menor para o maior valor numérico.
Durante a M3, criou-se a uma classe chamada Game.cs para lidar com a lógica da simulação de um jogo disputado entre dois jogadores. Essa classe recebe um histograma de objetos da classe Card no seu construtor. A classe Game.cs contém um método chamado evaluate_hand(), que analisa esse histograma.
Para tanto, ele aplica o método check() de cada uma das classes de reconhecimento de mãos em sequência, da mão mais valiosa (Royal Flush) para a menos valiosa (High Card). Ao final, o método dá uma pontuação de 2 e 100 para a mão, a fim de comparar com as mãos dos demais jogadores.
2.3 Discussão dos Resultados
Uma das tarefas era assegurar que, para que uma mão seja validada, pelo menos uma carta que compõe a respectiva combinação esteja na mão do jogador, isso requer um cuidado especial na hora de escrever o código.
Apesar de existir um par de 7 disponíveis, o jogador 2 não valida esse par, pois nenhuma das cartas são do jogador.
Pensando nisso, o professor incluiu um método para facilitar essa tarefa. Contudo, na implementação, o grupo optou por implementar essa validação manualmente, bastando checar se a propriedade "owner" de uma das cartas era maior que zero, o que indica que a carta está na posse de um dos jogadores.
Nos métodos de reconhecimento das mãos Flush e Straight Flush, optou-se por utilizar pilhas para reorganizar as cartas, dividindo-as por naipe, e ao mesmo tempo invertendo a ordem, sendo que as cartas de maior valor são verificadas primeiro.
Quanto às limitações do trabalho, nota-se que não se implementou uma visualização das cartas de cada jogador e as comunitárias, separadamente, nem mesmo a visualização da melhor mão possível para cada jogador, que poderia ser mostrada de maneira isolada.
Por estar fora do escopo do projeto, não implementou-se um método de desempate para a maioria das mãos, embora o presente grupo tenha optado por fazê-lo para a mão High Card. Para tanto, bastou converter o valor da maior carta de jogador para a pontuação da mão (utilizou-se a mesma ideia de colocar tais cartas em uma pilha, para tanto.
Caso no futuro se resolva implementar critérios de desempate para as demais mãos, possivelmente seria útil aumentar a margem de diferença de pontos de cada mão, que no momento está em 10, para 100, para que seja possível dar mais do que 10 pontuações diferentes para cada combinação.
Também estava fora do escopo do projeto e por isso não foram implementadas: A participação de mais do que dois jogadores, assim como rodadas onde as cartas comunitárias são reveladas (inicialmente 3, depois a quarta, e então a quinta carta), possibilidade de trocas de cartas do jogador, nem rodadas de apostas, possibilidade de fold, etc.
3. Conclusão
O presente projeto foi desafiador, principalmente na M2, onde procurou-se entender o código fornecido pelo professor, e também se desenvolveu a lógica de detecção das diferentes mãos. Dessa forma, foi uma ótima oportunidade de aprendizado. Colocou-se em prática os conceitos aprendidos na matéria de Estrutura de Dados, como as estruturas clássicas e os pilares da programação orientada a objetos.
O grupo ficou satisfeito com o resultado, pois embora a simulação tenha suas limitações, considera-se que está funcionando adequadamente para o que se propõe. Além disso, houve oportunidades de resolver certos problemas de maneiras criativas (como no caso do uso das pilhas) e de ir além do desafio proposto (critério de desempate das mãos High Card).
Referências
MICROSOFT. C# language reference. Disponível em: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/. Acesso em 4 jun 2024.
HENRIQUE, JOÃO. Programação orientada a objetos e programação estruturada. Disponível em: https://www.alura.com.br/artigos/poo-programacao-orientada-a-objetos. Acesso em 4 jun 2024.
WSOP. How To Play | Hand Ranking. Disponível em: https://www.wsop.com/poker-hands/. Acesso em 4 jun 2024.
WIKIPEDIA. Texas hold 'em. Disponível em: https://en.wikipedia.org/wiki/Texas_hold_'em. Acesso em 4 jun 2024.
----
Ficha completa da equipe:
Bruno Cechetto Mazzolli - mazzotron.itch.io
Alice Vieira da Rosa - alially.itch.io
Bernardo Mello Foés - bmellofoes.itch.io
Isabel Dias Danielewicz - isawcz.itch.io
Alessandra Borges Regis - ales9119.itch.io
----
Marcelo Dornbusch Lopes - Professor - m4rc3lo
----
Universidade do Vale do Itajaí - UNIVALI
Cesar Albenes Zeferino | Diretor Escola Politécnica
Giorgio Gilwan | Coordenador do Curso de Design de Jogos
Rafael Kojiio | Coordenador Gamelab UNIVALI
----
Projeto desenvolvido como requisito parcial para obtenção de aprovação na disciplina: Estruturas de Dados - Professor Marcelo Dornbusch Lopes.
Status | In development |
Authors | Bruno C. Mazzolli, bmellofoes, Ally, ales9119, Isawcz |
Genre | Card Game |
Comments
Log in with itch.io to leave a comment.
FTW!
https://portal.univali.br/sites/biblioteca/normas-e-procedimentos/Paginas/default.aspx