A downloadable project

Projeto Poker


Introdução

A disciplina de Estrutura de Dados, ministrada pelo professor Marcelo Dornbusch Lopes, no curso de Design de Games, tem como objetivo proporcionar o aprendizado de como organizar, armazenar e manipular dados de forma eficiente dentro do desenvolvimento de códigos, tendo em vista que entender estruturas de dados é essencial para um estudante do curso citado.

A disciplina utiliza da metodologia de aprendizagem baseada em projetos, onde os alunos são desafiados a resolver problemas por meio do desenvolvimento de soluções na prática. Essa abordagem promove aos estudantes um processo de aprendizagem centralizado em si, e favorece a integração entre teoria e prática.

O projeto tem como temática o reconhecimento das dez mãos de poker, onde fizemos códigos em C# para identificação de cada mão, levando em consideração a  modalidade de poker “Texas Hold’em”, que foi a modalidade escolhida pelo professor,

O problema a ser resolvido consistia em identificar corretamente as combinações de cartas, a partir do conjunto presente entre cartas comunitárias e cartas individuais. O objetivo principal foi criar um sistema capaz de classificar as mãos de pôquer, utilizando as estruturas de dados adequadas.

Entre os objetivos específicos do projeto, destacam-se:

  • Aplicar o conteúdo visto de estruturas de dados em C#;
  • Criar códigos para identificar cada uma das dez possíveis mãos de poker;
  • Traduzir a modalidade de poker “Texas Hold’em” para código.;
  • Utilizar dos arrays e listas fornecidos pelo professor para armazenar e organizar cartas;
  • Simular diferentes cenários de jogo para validar a eficiência do sistema.

O desenvolvimento deste projeto é altamente relevante para a formação acadêmica dos alunos do curso de Design de Games, pois promove o pensamento computacional, o raciocínio lógico e o domínio de estruturas utilizadas em diversos sistemas de jogos, especialmente em lógica de gameplay.

As etapas do projeto incluíram: uma pesquisa inicial sobre as regras do Texas Hold'em e formas de representação computacional das cartas no código já estabelecido pelo professor; o desenvolvimento dos algoritmos e das estruturas de dados em linguagem de programação; a testagem e depuração do código; e por fim, a documentação e apresentação dos resultados.

Entre os critérios de avaliação para o trabalho, estavam: corretude dos algoritmos (se chegam no resultado desejado, se respeitam as estruturas base, se existem comentários, se existe representação nos indicadores e se as regras de implementação foram seguida) e documentação (se segue o modelo e regras indicadas, se todo o conteúdo foi abordado, se todos os algoritmos e ilustrações foram apresentados e discutidos e se as referências são indicadas)

Com o projeto, pode-se desenvolver habilidades como abstração, análise de problemas, implementação de soluções computacionais, trabalho em equipe e comunicação. Espera-se que esses conhecimentos contribuam significativamente para futuros desafios no desenvolvimento de jogos digitais.

Nos próximos capítulos iremos apresentar a fundamentação teórica embasada em referências, o desenvolvimento dos códigos e as considerações finais individualizadas dos estudantes.



Tipos de Dados

“Os dados utilizados em um programa de computador, ou armazenados em um banco de dados, são classicados de acordo com os seus tipos a partir de suas particularidades e limitações. Esses tipos são necessários para definir de forma eficiente o seu processo de armazenamento e manipulação.” (Pinto et al., 2019)

Tipos homogêneos são estruturas de dados que armazenam elementos do mesmo tipo, ou seja, todos os valores contidos nela compartilham da mesma natureza (inteiros, strings, booleanos, etc.). Esses tipos de dados facilitam operações em massa;

Por exemplo:

nome = "Jogador1"  # Sequência de caracteres (todos do tipo 'char' ou string)

Dados heterogêneos permitem armazenar elementos de tipos diferentes na mesma estrutura, sendo úteis para representar entidades complexas com múltiplas propriedades.

Por exemplo:

item = {"nome": "Espada", "dano": 15, "equipável": True}  # Chaves com tipos variados

Tipos abstratos são um modelo matemático que define comportamento sem especificar como ele seria implementado. Ele encapsula dados e operações em uma interface lógica.

Por exemplo:

Comportamento: LIFO (Last-In, First-Out).

Operações: push() (inserir), pop() (remover), peek() (consultar topo).

“Os tipos de dados e as estruturas de dados são utilizados pelo programa para armazenar as informações por meio de operações específicas escritas em linguagem de programação. Para o programador, pode ser mais interessante trabalhar com as estruturas de dados pelas operações suportadas por elas, e não pela maneira como é feita a sua implementação. Quando uma estrutura de dados é definida dessa maneira, ela configura um TAD” (Vetorazzo et al.,  2018)


Estruturas de Dados

Arranjos unidimensionais são estruturas que armazenam uma coleção de elementos do mesmo tipo em uma única sequência linear. Cada elemento é acessado por um índice único, geralmente iniciando em 0. São úteis para armazenar e manipular conjuntos homogêneos e ideais para situações em que o tamanho dos dados é fixo e conhecido antecipadamente, como em cálculos matemáticos.

“Um arranjo é uma variável estruturada, formada pelo agrupamento de variáveis de mesmo tipo (inteiro, real, etc.). As variáveis que integram um arranjo compartilham um único nome e são identificadas individualmente por um índice, que é o valor que indica sua posição no agrupamento.” (Edelweiss, 2014)

Arranjos multidimensionais são extensões dos unidimensionais, organizando elementos em duas ou mais dimensões. São amplamente usados para representar dados tabulares, imagens ou grades de jogos, tendo como principal vantagem a organização lógica de dados complexos, permitindo operações eficientes em áreas como banco de dados.

Estruturas clássicas incluem pilhas, filas e listas.

  • Pilhas seguem o princípio "Último a entrar, primeiro a sair", usada em chamada de funções, fundo e avaliação de expressões.

“Pilhas são estruturas de dados do tipo last in,  first out (LIFO), ou seja, o último elemento a ser inserido na estrutura, será o primeiro a ser retirado da estrutura. Podemos fazer uma comparação com uma pilha de pratos, em que, se quisermos adicionar um prato na pilha, devemos colocá-lo no topo, e, para pegar um prato da pilha, retiramos o do topo. Dessa forma, temos que retirar o prato do topo para ter acesso ao próximo prato” (Vetorazzo et al.,  2018)

  • Filas operam no esquema "primeiro a entrar, primeiro a sair", aplicadas em agendamentos de processos, buffers de impressão e algoritmos BFS

“A fila é uma estrutura de dados de alocação dinâmica que permite armazenar dados utilizando a regra FIFO. A sigla FIFO significa que o primeiro elemento que entrará na fila será o primeiro a sair (em inglês, first in first out). Mas o que isso quer dizer? Vamos pensar em uma fila de um banco. Sempre teremos pessoas entrando na fila e essas pessoas entram no final dela, o que faz com que ela aumente, no entanto, as pessoas, ao serem atendidas, estão saindo no início da fila. A fila de um banco é uma fila do tipo FIFO” (Cury et al., 2018) Listas são coleções ordenadas que permitem inserções e remoções flexíveis em qualquer posição, sendo úteis na implementação de dicionários, playlists ou gerenciamento dinâmico de memória



Projeto Base

O professor forneceu uma estrutura inicial contendo definições básicas das structs Card e Histogram. Esse projeto base serviu como ponto de partida para o desenvolvimento do sistema completo.

O projeto base foi essencial para orientar a modelagem das soluções. A partir dele, foi possível focar no desenvolvimento dos algoritmos de verificação das combinações e na realização de testes para validar o funcionamento do sistema.

Realizamos, então, a implementação das funções de detecção das mãos, aprimorando e complementando o código inicial. O sistema final foi capaz de identificar as seguintes mãos: Sequência Real, Sequência de Mesmo Naipe, Quadra, Full House, Flush, Sequência, Trinca, Dois Pares, Par e Carta Alta



Desenvolvimento

Com o objetivo de identificar as mãos por meio do C#, nessa seção serão apresentados dez códigos relativos às possibilidades de mãos de poker na modalidade Texas Hold’em.

Como base de nosso código utilizamos a estrutura Card, apresentada na figura 1. Essa estrutura define os atributos que uma carta poderá ter nesse código, que serão naipe (suit), número (value) e se está na mesa (on_table, true se está na mesa, false se está na mão do jogador).

Definida as possibilidades de uma carta, passamos a definição das possibilidades de um baralho, o que é feito pela estrutura Histogram, estrutura que lista o número de cada carta e a quantidade destas presentes, apresentada na figura dois, armazenando a mão por meio desse array.

Na segunda parte do projeto, cada mão tinha 3 arquivos .csv, sendo uma com reconhecimento positivo (tendo ao menos uma carta na mão do jogador) e outras duas de reconhecimento negativo, seja por não ter nenhuma mão específica ou por estar na mesa. Agora, esse arquivo foi adaptado para dois arquivos por jogador, definidos por mesa e mão respectivamente, e numerados por 1 e 2. Por exemplo, se estivermos falando da mesa 1 e jogador 2, seria o equivalente a ‘m1m2’, de forma respectiva. 

No arquivo Program . cs, foi necessário duplicar o código da listagem de cartas e o código que recebe o true e false de cada mão (cujo se baseia no método find). Antes, não se levava em consideração a condição de jogador 1 e jogador 2, no entanto, agora foi preciso definir que existem dois jogadores. Logo, foi preciso duplicar os comandos para a listagem, leitura de cartas e possíveis mãos para a jogada. 

Ademais, foi adicionado o sistema de ranking, a condição na qual define qual dos dois jogadores será o vencedor. Cada mão tem um valor de rank, então o programa atribui um inteiro (int) para contabilizar e armazenar no ranking de cada um de forma independente. No final, o programa compara o ranking de cada jogador para ver qual foi o vencedor e escrever no console.



Testes

Após o desenvolvimento, foram realizados diversos testes utilizando conjuntos de cartas previamente definidos, para validar a eficiência e a precisão dos algoritmos implementados. Os testes abrangeram todas as combinações possíveis, desde a Sequência Real até a Carta Alta, garantindo que o sistema fosse capaz de reconhecer corretamente cada situação.

 Ao executar o programa, o programa solicita ao usuário para escrever o arquivo do jogador 1 e depois o arquivo para o jogador 2. Seguindo a formatação explicada acima (mXmY). Posteriormente, imprime no console o nome da mão correspondente de cada jogador juntamente com as cartas que as constituem. Além do indicativo do resultado entre a competição dos jogadores.

A conclusão que pode ser tirada sobre a execução dos testes é que ele atende o objetivo do projeto, sendo esse a testagem e identificação das mãos de poker com 2 jogadores possuindo um indicativo do vencedor ou empate. Entretanto, ao ser comparado com o jogo na realidade, ele não apresenta o fator aleatoriedade existente no baralho, pois aqui literalmente escolhemos todas as cartas, seja dos jogadores e das mesas.



Considerações Finais


Caju Barreiro Agostini:

Resumo das considerações

Na prática, nessa disciplina fiz dois pseudocódigos, metade dos códigos de reconhecimento de mãos em C# e uma parte do código final.

Fazer tudo isso me ajudou muito a treinar minha lógica de programação e a entender melhor alguns conceitos da POO que ainda não estavam claros, facilitando a programação para jogos no futuro.

Minha maior dificuldade ao longo do semestre foi saber como transformar soluções lógicas em código no C#, pois este foi nosso primeiro grande projeto relacionado a programação.

Apesar de muitas dificuldades no meio do caminho, acredito que chegamos ao final do semestre com soluções satisfatórias para os problemas que nos foram apresentados.


Diogo Kurth Vasconcellos Ferreira:

Resumo das considerações

No começo, tive dificuldade para realizar o pseudocódigo. Eu conhecia o código e como fazê-lo, mas não conseguia trazê-lo para o pseudocódigo. Fiz uma pesquisa e entendi como montá-lo e, com a ajuda do meu grupo para verificar, consegui terminar.

Como não tenho muita familiaridade com a programação, fiquei trabalhando no Itch.io e nas cartas CSV. Tive apenas uma dificuldade em entender como fazer as cartas, por ter várias informações diferentes.


Cecília Blasius Pereira

Resumo das considerações

Fiz as mãos Par e Dois Pares, e no começo tive dificuldade pois ainda não estou acostumada com programação e pseudocódigos. Mas pesquisei para entender melhor e, com a ajuda do grupo, consegui realizar a atividade. O processo me ajudou a aprender mais sobre a matéria e a melhorar meu entendimento do conteúdo visto até então.

O processo de construção das mãos seguindo as regras do pôquer foi um tanto complicada, mas a troca de informações e a colaboração com os colegas de equipe tornaram a tarefa mais fácil.


Julia Willenbring Deboni

Resumo das considerações

Embora minha contribuição nesta última etapa tenha sido menor, sinto que, graças à colaboração dos meus colegas, consegui um avanço no entendimento da matéria. Ainda há muito a aprender, mas cada pequeno progresso é um passo importante.


Isadora Furlani Vignatti

Resumo das considerações

Fiquei responsável por parte do código e documentação. Senti dificuldades no começo por não entender exatamente o funcionamento do pseudocódigo base (especialmente o histograma) e como desenvolver minha parte. Com a ajuda do meu grupo e pesquisas essas questões foram superadas e acredito que esse trabalho contribuiu para evolução do meu conhecimento sobre a matéria.

Tive dificuldade no começo para entender o funcionamento do código no geral, mas depois de estudá-lo muito e conversar com outras pessoas consegui realizar a atividade e acredito que foi uma experiência desafiadora boa que contribuiu para o meu aprendizado.


Yasmin Fornero

Resumo das considerações

O processo para entender mais o conteúdio a fim de desenvolver a M2 rendeu uma compreensão mais do que o esperado para prosseguir com a M3. Entender a lógica para implementar o segundo jogador no código do programa, replicando os comandos de listagem e leitura das cartas para conseguir fazer o programa reconhecer as situações de mãos de pôquer e as condições da mesa, e assim representar de maneira correta e eficiente jogadas; tudo isso se mostrou muito produtivo durante o processo. E além disso, pude entender como funciona e se estrutura o sistema de ranking dentro do código.



Referências

EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação com exemplos em Pascal e C. Porto Alegre: Bookman, 2014. Disponível em: https://biblioteca-a.read.garden/viewer/9788582601907/163

GONÇALVES, G. R. B. Sistemas de informação. Porto Alegre: Sagah, 2017. Disponível em: https://biblioteca-a.read.garden/viewer/9788595022270/17

VETORAZZO, A. S.; et al. Estrutura de dados. Porto Alegre: Sagah, 2018. Disponível em: https://biblioteca-a.read.garden/viewer/9788595023932/capa

PINTO, R. A.; et al. Estrutura de dados. Porto Alegre: Sagah, 2019. Disponível em: https://biblioteca-a.read.garden/viewer/9786581492953/22

CURY, T. E.; et al. Estrutura de dados. Porto Alegre: Sagah, 2018. Disponível em: https://biblioteca-a.read.garden/viewer/9788595024328/capa

FILHO, J. P. Programação orientada a objetos com C#. Editora Senac São Paulo, 2024. Disponível em: https://www.bibliotecadigitalsenac.com.br/#/content/reference/uid/25ccc3e2-af4d-ef11-86c3-00224821b50b/player


Equipe

Diogo Kurth Vasconcellos Ferreira - https://diogokurth.itch.io/

Julia Willenbring Deboni  - https://thebonnie.itch.io/ 

Cecília Blasius Pereira -  https://lzym.itch.io

Caju Barreiro Agostini - https://annoyingcashew.itch.io/ 

Isadora Furlani Vignatti - https://isaaa-43.itch.io 

Yasmin Adria Fornero - https://mimichiii.itch.io

---------------------------------------------------------------------------------------------

Projeto  desenvolvido como requisito parcial para obtenção de aprovação na disciplina: Estruturas de Dados - professor m4rc3lo 

 O conteúdo aqui tem direito reservado e pode conter inconsistências conceituais.

Universidade do Vale do Itajaí - UNIVALI

Cesar Albenes Zeferino | Diretor Escola Politécnica

Giorgio Gilwan | Coordenador do Curso: Design de Games

Rafael Kojiio | Coordenador Gamelab 

Updated 24 days ago
StatusIn development
CategoryOther
Authordiogokurth

Download

Download
Baixar arquivo
External

Leave a comment

Log in with itch.io to leave a comment.