Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ruiluucas/truco-ia-machine
Robô de visão computacional capaz de jogar truco 1v1.
https://github.com/ruiluucas/truco-ia-machine
Last synced: 26 days ago
JSON representation
Robô de visão computacional capaz de jogar truco 1v1.
- Host: GitHub
- URL: https://github.com/ruiluucas/truco-ia-machine
- Owner: ruiluucas
- Created: 2024-09-03T18:36:21.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2024-10-07T19:20:19.000Z (4 months ago)
- Last Synced: 2024-11-16T11:16:46.597Z (3 months ago)
- Language: Python
- Homepage:
- Size: 28.8 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: docs/README.md
Awesome Lists containing this project
README
# Truco IA Machine
Este projeto utiliza visão computacional para detectar cartas de truco em tempo real por meio de uma webcam. Ele é responsável por detectar as cartas e gerenciar o estado do jogo de truco automaticamente.
![](https://github.com/ruiluucas/truco-ia-machine/blob/main/docs/example.gif)# Sumário
- [Instalação e inicialização](#Instalação-e-inicialização)
- [Processo inicial do jogo](#Processo-inicial-do-jogo)
- [Processamento de leitura da carta](#Processamento-de-leitura-da-carta)
- [Processo durante o jogo](#Processo-durante-o-jogo)
- [Pedir truco](#Pedir-truco)
- [Empache](#Empache)
- [Histórias de usuário](#Histórias-de-usuário)
- [Casos de uso](#Casos-de-uso)
- [Mostrar vira](#Mostrar-vira)
- [Verificar cartas do robô](#Verificar-cartas-do-robô)# Instalação e inicialização:
1. Clone o repositório do projeto.
2. Instale as dependências necessárias executando o comando:```bash
pip install opencv-python ultralytics logging statistics
```3. Rode os seguintes comandos:
```bash
cd truco-ia-machine
python truco-ia-machine.py
```# Processo inicial do jogo:
- Para começar o jogo, rode o script
truco-ia-machine.py
. É necessário que você tenha uma câmera para que o jogo funcione. Rodando o script, será aberto uma janela na tela do computador.
- Após a abertura, o usuário deve mostrar, na câmera do computador, a carta do baralho que receberá a função de "Vira". Essa carta serve para modificar a ordem de poder do baralho. de forma que, alinhando as cartas por poder, caso o vira seja i, a carta de maior poder será i+1, ou seja, a carta seguinte ao vira no nível de poder.
- A janela então ficará inteira preta, sendo somente possível ler os textos e as caixas sinalizando a leitura de uma carta. Enquanto a janela estiver preta, o usuário irá setar as cartas do robô, de modo que não consiga ver qual carta é pela câmera.# Processamento de leitura da carta
Uma das principais diferenças do robô é a capacidade dele jogar com um baralho físico, por meio de visão computacional. O sistema utiliza o YOLOv8 para realizar o processamento de predição das cartas na câmera. Como não é um processo 100% certeiro, habilitei um sistema para carregar um buffer de vários frames seguidos. Esse buffer não tem uma quantidade máxima de elementos, mas possui uma quantidade mínima, suficiente para que o sistema possa ter mais confiança quando, sem querer, o usuário mostre alguma carta sem querer na frente da câmera.
Após o jogador disponibilizar a quantidade mínima de frames ao robô, caso ele tire a carta da frente da câmera, o jogo irá seguir por dois caminhos padrões:
rollInitGame
erollGame
. A primeira função é responsável por setar toda a parte inicial do jogo, como adicionar o vira e as cartas do robô na memória.# Processo durante o jogo:
Na primeira etapa, o jogo poderá começar de 4 formas, sendo elas:
- O usuário começa e joga uma carta;
- O usuário começa e pede truco;
- O robô começa e joga uma carta;
- O robô começa e pede truco;_A chance de você ou o robô começar é de 50% para ambos._
Como o código segue um padrão de ações reativas, as ações do robô são realizadas a partir da ação do próprio usuário, ou seja, toda vez que o usuário mostrar uma carta ou pressionar uma das teclas de função do programa, o robô irá realizar alguma ação. Desse modo, podemos dizer que, quando o robô começa, significa que ele já fez uma ação a partir do momento que você mostrou a última carta da mão dele. Ele verificará, depois de adicionar a carta em sua mão, se ele já está com a mão completa. Caso sim, irá verificar randomicamente quem começa, e se caso ele começar, já jogará uma carta.
Caso o robô começe, o usuário jogará a última carta, e vise-versa.# Pedir truco:
O truco é um processo que acontece dentro do esquema apresentado anteriormente. Tanto o robô quanto o usuário podem pedir truco a qualquer momento, desde que estejam na sua vez de jogar. Não é possível pedir truco após jogar uma carta. Caso o robô esteja começando, antes de jogar a carta, ele irá verificar, em uma certa probabilidade, se pedirá truco ou não. Caso peça, o mesmo irá travar a execução do passo de jogar a carta, passo esse que então será realizado caso o jogador aceite o truco.
### Caso o robô peça truco, ele interrompirá o processo de jogar a carta, e então terá 3 possibilidades:
- Caso o usuário aceite o truco, o mesmo irá jogar a carta que ele iria jogar.
- Caso o usuário rejeite, será contabilizado um ponto para o robô.
- Caso o usuário dobre, o robô irá entrar no mesmo processo de escolha do truco novamente. Será semelhante ao processo do usuário pedir o truco.### Caso o usuário peça truco, será chamada uma função para o robô decidir o que ele fará, e a resposta do mesmo terá 3 possibilidades:
- O robô pode aceitar o truco, fazendo que a partida comece a valer mais pontos.
- O robô pode rejeitar o truco, fazendo com que o usuário ganhe um ponto a mais automaticamente.
- O robô pode dobrar a aposta, fazendo com que o usuário tenha que responder com a tecla de teclado se aceita ou não.### Fatos adicionais:
- O período do truco deve acabar a partir do momento em que for jogada a última carta da rodada.
# Empache
No truco, o naipe é valido para verificar o poder de uma certa carta. No caso do vira, os 4 naipes da carta subsequente dele serão as mais poderosas do jogo, seguindo a ordem de poder dos naipes. Para as outras cartas, irá ser apresentado o conceito de empache. O empache acontece quando, na primeira partida, as duas maiores cartas da rodada são a mesma carta com o naipe diferente. Após isso acontecer, os jogaodores devem mostrar suas maiores cartas. Antes da pessoa jogar sua carta, ela também pode pedir truco, aumentando a aposta antes de revelar sua carta. Vencerá aquele que jogar a maior carta, e, se essas cartas mais fortes entre 2 adversários forem a mesma, com o mesmo naipe, aí então se considerará o naipe delas.
No caso de empache na segunda ou terceira rodada, ganhará o time ou jogador que tiver ganhado a primeira rodada.
# Histórias de usuário
Aqui se encontram alguns requisitos que já foram pensados para o programa, para facilitarmos a análise dos requisitos para a construção do programa.
| Id | História de usuário |
| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| HU01 | Como jogador, quero mostrar para ao robô suas respectivas cartas, para que ele guarde em memória e saiba o que ele pode jogar na mesa |
| HU02 | Como jogador, quero mostrar a carta vira ao robô para que ele indentifique a carta mais forte do jogo naquela rodada com base nela |
| HU03 | Como jogador, quero que o robô saiba qual carta eu joguei naquele determinado momento, para que ele possa tomar a decição de qual carta ele deve jogar posteriormente |
| HU04 | Como jogador, quero ter a possibilidade de pedir truco, para que o valor da partida atual aumente |
| HU05 | Como jogador, quero poder escolher se aceito o truco vindo do robô, para que eu não saia prejudicado caso minha mão esteja ruim |
| HU06 | Como jogador, quero poder empachar a carta para que a próxima jogada seja mostrar a carta mais forte |# Casos de uso
Aqui se encontra o fluxograma de algumas funções de chamada do projeto. As funções contidas no fluxograma representam uma visão mais funcional acerca do código que ela explica. Quando uma função A estiver apontando com a flecha para uma função B, e essa mesma flecha ter o nome `<>`, significa que a função A irá chamar obrigatóriamente a função B toda vez que for ativada. No entanto, caso a função A esteja recebendo uma flecha da função B, e essa flecha ter o nome `<>`, significa que a função A não irá chamar a função B sempre, dependendo de algumas circunstâncias de lógica para que isso aconteça.
Acesse o fluxograma por esse link [aqui!](https://www.figma.com/board/gaVoQwrtfulGMpGzptF5oi/truco-ia-machine%2Fuse-cases?node-id=0-1&t=nu9bwybsKcnxly5I-1)
## Mostrar vira
Ator principal
Usuário
Ator secundário
Sistema
Resumo
Descreve a adição do vira na partida
Pré condição
Usuário ter mostrado a carta ao robô no momento em que o mesmo está apto a ler a carta "vira"
Pós condição
Vira adicionado, ordem de poder das cartas alterada de acordo com o vira, tela fica preta e as próximas 3 cartas a serem jogadas serão transferidas para a mão do robô
Fluxo normal
Ator principal
Sistema
Robô fica em modo reativo para a próxima carta analisada se tornar o vira
Usuário mostra a carta ao robô
Robô analisa o poder da carta
Robô troca toda a ordem de poder das cartas para que o vira seja a mais forte
Robô escurece a tela para que o jogador não possa ver as próximas cartas a serem analisadas pelo robô
Fluxo alternativo
Usuário lança uma carta que não está entre as cartas utilizadas no truco
## Verificar cartas do robô
Ator principal
Usuário
Ator secundário
Sistema
Resumo
Adiciona as 3 cartas referentes ao robô na partida
Pré condição
Usuário ter mostrado a carta ao robô no momento em que o mesmo está apto a ler as 3 cartas; Já ter lido o vira;
Pós condição
Vira adicionado, ordem de poder das cartas alterada de acordo com o vira, tela fica preta e as próximas 3 cartas a serem jogadas serão transferidas para a mão do robô
Fluxo normal
Ator principal
Sistema
Robô fica em modo reativo para ler as 3 cartas
Usuário mostra a carta ao robô
Robô adiciona a carta a mão
Usuário mostra a carta ao robô
Robô adiciona a carta a mão
Usuário mostra a carta ao robô
Robô adiciona a carta a mão
Robõ verifica que foram adicionadas as 3 cartas
Robõ verifica quem começa entre ele e o jogador.
Quando o robô começa, o mesmo seta a probabilidade de chamar truco com base em suas cartas. Caso decida não trucar, termina
Sistema reabilita a tela do jogo.
Fluxo alternativo
Jogador lança uma carta repetida
Usuário começa, fazendo com que o robô não jogue nada no começo
Robô começa e pede truco logo antes de jogar qualquer carta