
Trabalho M2
A downloadable project
Introdução
O presente documento apresenta os princípios ensinados na disciplina de Estruturas de Dados, uma área de conhecimento dentro da computação que visa organizar os dados de códigos de programação de forma que diferentes informações do código sejam separadas por categorias, permitindo assim uma organização mais otimizada, pois não é preciso alterar o código inteiro para ajustar um módulo específico.
Nosso aprendizado da disciplina é a partir do modelo de “aprendizagem baseada em projeto”, uma metodologia que coloca os alunos para trabalhar com atividades que relacionam o conteúdo sendo ensinado com situações do mundo real. A partir disso, os alunos recebem um contato mais direto com a forma de que esses conhecimentos podem ser aplicados em situações práticas da vida real.
O projeto definido pelo professor foi o reconhecimento de mãos em um jogo de cartas, como pôquer, já que é uma situação onde há uma lista de itens (neste caso, as cartas), cada um com suas características (os números e naipes), então é preciso ter pensamento organizacional para classificá-los, o mesmo tipo de pensamento que seria aplicado na programação de códigos com estruturas de dados.
O principal desafio enfrentado neste projeto é desenvolver um sistema capaz de identificar automaticamente cartas válidas, de acordo com regras pré-estabelecidas. Em jogos de cartas como pôquer, buraco ou mesmo jogos originais, é essencial que o código encontre padrões como trincas, sequências, pares e complicações especiais. O objetivo principal do projeto é implementar uma lógica eficiente e escalável que analise a mão do jogador em tempo real e detecte esses símbolos, fornecendo feedback imediato ao sistema de jogo. Essa funcionalidade é crucial para garantir a fluidez da jogabilidade e a integridade das regras durante a partida.
Iremos fazer 10 mãos de pôquer. Para isso, será necessária a implementação de estruturas de dados que armazenam as informações das cartas e mãos, algo feito a partir da introdução de classes que representam os diferentes arranjos possíveis em uma mão de pôquer (como Par, Trinca, Full House, etc.), o desenvolvimento de um sistema de verificação automática das mãos (baseado nas regras do pôquer), a leitura de dados a partir de arquivos CSV, o reconhecimento e comparação das mãos e os testes de validação do sistema com diferentes entradas.
Este tipo de atividade servirá um papel importante em nossa formação acadêmica, pois estaremos exercitando conhecimentos que têm utilidade para o trabalho em áreas que envolvem pensamento computacional e organização de sistemas. Além disso, estamos aprendendo o uso de ferramentas e conceitos muito práticos em diversos sentidos: é prático para os usuários de tecnologia ter acesso a índices que agilizam o processo de encontrar informações, é prático para os programadores ter um código escrito de forma otimizado e é prático para as empresas de Big Tech cortar no tempo de processamento e memória utilizada para suavizar ou custo de execução.
Antes de podermos iniciar a escrita do código em si, primeiramente relatado por uma etapa de pesquisa, buscando aprender como um código com a nossa específica é composto: quais os comandos necessários para executar o algoritmo, qual é a ordem em que eles são postos no código, quais as condições ordinárias para que eles funcionem sem erro, etc.
As equipes serão avaliadas com base tanto na qualidade da escrita deste documento, quanto na correção dos algoritmos criados. É importante que o documento siga as regras condicionais pelo professor e tenha documentação completa, sem esquecer de abordar nenhum detalhe, tanto do conteúdo de aprendizagem, quanto da citação de fontes de pesquisa. Já os algoritmos serão julgados com base em se controlar executar sua tarefa sem erro, seguindo as regras de implementação, se foram feitos comentários junto com o código, se os identificadores ficaram escritos de forma clara e dinâmica e se as estruturas de base foram utilizadas (e de forma correta).
É esperado que nosso grupo utilize essa atividade como uma oportunidade de aprender os fundamentos do uso de programação estruturada. Entre esses fundamentos, podemos citar o entendimento do vocabulário usado por programadores, a habilidade de criar algoritmos funcionais que possuem estruturas de dados, a capacidade de aplicar a programação em casos práticos da vida real, o conhecimento sobre tipos de dados e como eles são agrupados em estruturas e compreensão da orientação a objetos.
A seguir, no capítulo 2, serão explicados os conceitos teóricos dos dados e como eles são representados. Depois disso, temos o capítulo 3, que apresenta uma aplicação prática dos conceitos do capítulo anterior, mostrando como usá-los em uma sequência de pseudocódigo que representa uma mão de baralho. Finalmente, o capítulo 4 contém as experiências que os membros do grupo tiveram fazendo o trabalho e quais são as contribuições sobre seu desempenho. Há também um espaço com as referências de pesquisa utilizadas.
Fundamentação Teórica
Um dos principais componentes das estruturas de código são os dados . Eles são espaços de armazenamento para elementos numéricos, informações, sequências de caracteres, etc. É importante destacar que a palavra “dado” se refere ao elemento armazenado em si, como se ele fosse um material bruto, enquanto a palavra “ informação ” é usada para as instruções que tiramos esses dados após fazer um processo de análise deles.
Sendo o dado o elemento individual e sem contexto e a informação são os dados processados, contextualizados e interpretados. Nesses jogos, os conceitos podem alterar valores de algo, estatísticas do jogador, determinar valores dos ataques, determinar a quantidade de passos dos jogadores e assim por diante.
Tipos de Dados
Dados do tipo homogêneos são o conjunto de dados que tem os elementos do mesmo tipo, por exemplo, uma matriz em que todos os dados são strings ou vetores só compostos por números inteiros. Exemplos de dados desse tipo incluem: Arrays e matrizes.
Dados do tipo heterogêneo são o conjunto de dados que possui diferentes tipos de formatos, estruturas e fontes. Exemplo: Um dicionário com chaves e valores de tipos variados.
Tipos abstratos de dados, também conhecidos como TAD, é um conceito que define um tipo de dado com base no seu comportamento e não na sua implementação interna. O usuário utiliza-o com uma interface, sem a preocupação de armazenamento e manipulação de dados, habilitando-o com que o dado possa ser utilizado com outros propósitos e implementações sem alterar a interface. Exemplos: TAD que pode manipular e armazenar uma coleção de elementos ordenados, TAD com operações de empilhar e consequentemente desempilhar e TAD que representa dados em posição.
Estruturas de Dados
Dados do tipo homogêneos são o conjunto de dados que tem os elementos do mesmo tipo, por exemplo, uma matriz em que todos os dados são strings ou vetores só compostos por números inteiros. Exemplos de dados desse tipo incluem: Arrays e matrizes.
Dados do tipo heterogêneo são o conjunto de dados que possui diferentes tipos de formatos, estruturas e fontes. Exemplo: Um dicionário com chaves e valores de tipos variados.
Tipos abstratos de dados, também conhecidos como TAD, é um conceito que define um tipo de dado com base no seu comportamento e não na sua implementação interna. O usuário utiliza-o com uma interface, sem a preocupação de armazenamento e manipulação de dados, habilitando-o com que o dado possa ser utilizado com outros propósitos e implementações sem alterar a interface. Exemplos: TAD que pode manipular e armazenar uma coleção de elementos ordenados, TAD com operações de empilhar e consequentemente desempilhar e TAD que representa dados em posição.
Orientação a Objetos
Arranjos unidimensionais são comumente conhecidos como vetores ou array, e armazenam uma coleção de valores de tipos iguais em posições consecutivas na memória, facilitando o acesso e a manipulação de dados de uma forma eficiente. São usados para organizar dados e realizar pesquisas, multiplicações de massas e ordenações.
Arranjos multidimensionais conhecidos como matrizes, como o nome já diz, permitem que se armazenem e organizem dados em mais de uma dimensão, como por exemplo imagens, tabelas e tudo onde há colunas e linhas. Podem ser utilizados para processamento de imagens, banco de dados OLAP (Online Analytical Processing), jogos que utilizam tabuleiros e até linguagem de programação.
Estruturas clássicas são formas de organizar, armazenar, manipular e gerenciar dados de forma eficiente para sistemas computacionais. Influenciando o desempenho de algoritmos e sistemas.
Desenvolvimento
O projeto é estruturado com base no padrão arquitetural MVC (Model-View-Controller), o que permite uma separação clara entre dados, interface e lógica de controle. A seguir, descrevemos cada componente presente no diretório poker 2025, com foco na funcionalidade e na responsabilidade de cada classe:
- Flush.cs: Verifique se todas as cartas da mão possuem o mesmo naipe, sem necessariamente estarem em sequência.
- FourOfAKind.cs: Identifica a ocorrência de quatro cartas com o mesmo valor (quadra).
- FullHouse.cs: Detecta a combinação composta por uma trinca e um par.
- HighCard.cs: Defina a mão apenas com uma carta de maior valor, quando nenhuma outra combinação for encontrada.
- OnePair.cs: Verifica a presença de um único par na mão.
- Royal.cs: Classe auxiliar, que pode representar a seleção das cartas que compõem uma sequência real.
- RoyalFlush.cs: Avalia se a mão contém a sequência 10, J, Q, K e A, todos do mesmo naipe — a combinação mais eficaz do pôquer.
- StraightFlush.cs: Confirma a presença de cinco cartas em sequência e do mesmo naipe.
- ThreeOfAKind.cs: Verifica a presença de três cartas com o mesmo valor (trinca).
- TwoPair.cs: Identifica a existência de dois pares diferentes na mão.
- Hands.cs: Classe central que coordena todas as verificações das mãos de pôquer. É responsável por determinar qual é a melhor combinação apresentada na mão comprovada, utilizando as demais aulas especializadas como apoio.
- Histogram.cs: Possivelmente utilizado para registrar a frequência de valores e naipes das cartas, auxiliando no processo de verificação das correspondências.
Considerações Finais
Victor Miguel: Apesar de ter iniciado e concluir a maior parte do projeto neste M2, enfrentei dificuldades significativas no que diz respeito ao entendimento de Algoritmos e Estruturas de Dados. No entanto, por meio de esforço contínuo e diversas pesquisas, foi possível adquirir conhecimentos relevantes, especialmente com o apoio da equipe, o que me ajudou a avançar na compreensão desses conteúdos.
Matheus Ferreira: como eu fiquei mais na parte da programação,Este projeto desenvolveu um sistema eficiente para dedicar mãos de pôquer a partir de cartas carregadas de arquivos CSV. A melhoria das regras do Texas Hold'em e garantiu precisão na identificação das mãos. O sistema é uma base sólida para melhorias futuras, como a inclusão de mais tipos de mãos e interfaces aprimoradas.
Gustavo Xavier: Eu ajudei principalmente com o documento, escrevendo o capítulo de introdução inteiro e ajudando com os parágrafos sobre a diferença entre dados e informações. Não foi uma atividade muito fora do normal, era algo que eu sabia que era capaz de fazer, eu só demorei para progredir nela (fui fazendo os poucos) por não se tratar de uma área do conhecimento que eu tenho tanta facilidade em me concentrar; Nesse sentido, podemos dizer que o trabalho foi uma oportunidade de exercício de dedicação em tarefas importantes, mesmo que elas não sejam necessariamente da sua área de conforto.
Gabriel Lessa: Fiz a parte das pesquisas e referências, além de responder aos tópicos 2 até 2.3. Após estudar o assunto, ficou muito claro como é possível operar uma estrutura de dados em jogos e como isso facilita o processo da programação. Mesmo não tendo muito conhecimento em programação na prática, esta atividade apresentada é necessária para o entendimento processual de estruturar dados. Gostaria apenas de ter organizado melhor o ritmo de trabalho com todos.
Referências
- https://biblioteca-a.read.garden/viewer/9788582601907/163 - Livro de algoritmos indicado pelo professor
- https://biblioteca-a.read.garden/viewer/9786581492953/22 - Livro de estruturas de dados indicado pelo professor
- https://blog.conexia.com.br/aprendizagem-baseada-em-projetos/#:~:text=O%20que%20%C3%A9%20a%20aprendizagem,habilidades%20%C3%BAteis%20na%20vida%20real. - Artigo sobre a aprendizagem baseada em projeto
- https://docs.google.com/document/d/1BKZmaFXzrWYpkodJ-p3kecsDwrPsnoJN9JwKcaxvW5M/... - Explicações do professor para os critérios de avaliação
- https://medium.com/@rsorage/al%C3%A9m-do-c%C3%B3digo-a-import%C3%A2ncia-vital-da... - Artigo sobre a importância dessa disciplina para a formação acadêmica
- https://rockcontent.com/br/blog/qual-ea-diferenca-entre-dado-e-informacao/ https://sebrae.com.br/sites/PortalSebrae/artigos/voce-sabe-qual-a-diferenca-entr... - Artigos sobre a diferenciação entre dado e informação
- https://materialpublic.imd.ufrn.br/curso/disciplina/3/70/11/5 - Artigo sobre estruturas de dados dinâmicos
Equipe
Matheus Ferreira da Silva: https://mathvbj.itch.io/
Victor Miguel Bittencourt Pérez: https://victor-perez.itch.io/
Gustavo Abuchaim de Freitas Xavier: https://gurizao123.itch.io/
Gabriel Sales Lessa: https://ren-net.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
César Albenes Zeferino | Diretor Escola Politécnica
Giorgio Gilwan | Coordenador do Curso: Design de Jogos
Rafael Kojiio | Coordenador Gamelab
Download
Baixar https://drive.google.com/file/d/1zvOMVaMbYov1ybghiHk_wQaBf_9ntuZs/view?usp=shari...
Externo
Instruções de instalação
Descrição do documento disponibilizado junto com o código (documento de projeto).
Breve instrução de como executar o código.
Updated | 4 days ago |
Status | Released |
Category | Other |
Authors | mathvbj, Victor Perez |
Leave a comment
Log in with itch.io to leave a comment.