Sei sulla pagina 1di 25

Sistema Fuzzy Aplicado na Tomada de Decises em

um jogo de Pquer
Caio Gonalves Raggi, 60849, Vincius Menezes Lourenoni, 67665
ELT 460 Inteligncia Computacional
Departamento de Engenharia Eltrica, Universidade Federal de Viosa, Viosa - MG
Resumo O presente trabalho consiste em utilizar tcnicas de
inteligncia computacional, no caso especfico, a tcnica de
inferncia fuzzy para tomada de decises em um jogo de cartas,
o Poker Texas Holdem. Afim de melhor visualizao criou-se
uma interface utilizando o software Matlab. Para testar e validar
o algoritmo desenvolvido utilizou-se o software PokerTH.

I.

III.

III.I Sofwares utilizados


O trabalho foi desenvolvido no software Matlab na
toolbox de redes neurais presentes no programa. Utilizou-se
dentro dessa toolbox a lgica fuzzy para a tomada de decises.
Para simulao e testes do jogo de pquer, utilizou-se o
software PokerTH 1.1.1.
Afim de melhorar a visualizao das entradas (cartas e
situaes) e sadas (aes a serem tomadas), criou-se uma
interface visual no Matlab atravs do aplicativo Guide.
As entradas utilizadas so as aqui listadas:
Momento;
ao dos adversrios;
posio na mesa;
nmero de adversrios;
valor do big blind;
tamanho do stack;
cartas.

INTRODUO

O termo fuzzy pode ter muitos significados, no que diz


respeito lngua inglesa, mas seu conceito bsico passa
sempre pelo vago, indistinto, incerto [1]. No que diz respeito
lgica fuzzy, a primeira publicao data de 1965, data na
qual recebeu esse nome, tendo como autor Lofti Asker Zadeh,
professor em Berkeley, Universidade da Califrnia. Zadeh
combinou conceitos da lgica clssica e os conjuntos de
Lukasiewicz, definindo graus de pertinncia. O polons Jan
Lukasiewicz (1878-1956) introduziu o conceito de conjuntos
com graus de pertinncia para um nmero infinito de valores
entre 0 e 1 [2].
A lgica fuzzy faz uso de variveis lingusticas, sendo os
valores de tais variveis conjuntos nebulosos. Um exemplo
para isso seria: [3]

III.II Funes classificatrias

Varivel Numrica: Temperatura = 40C;


varivel Lingustica: Temperatura Alta.

Em funo dessas entradas, criou-se duas funes.


Inicialmente uma funo capaz de calcular a quantidade de
fichas que nosso jogador possui, esse nmero normalizado
em funo do valor do big blind, ou seja, tal funo retorna
quantos big blinds o nosso stack consegue pagar.
Para que possa ser utilizada como entrada na lgica fuzzy,
fez-se necessrio a transformao da varivel numrica em
lingustica, sendo assim, criou-se a varivel nmero de blinds
ou (como foi escrita no programa). Tal varivel foi dividia
em trs intervalos, sendo eles e suas respectivas variveis
lingusticas mostrados na Tabela 1.

Esse conceito pode tambm ser analisado atravs da


Figura 1.

Figura 1 - Exemplo de varivel lingustica [3].

II.

MATERIAIS E MTODOS

Tabela 1 - Partio da varivel nmero de blinds para insero


como funo de pertinncia na lgica fuzzy.

10
10 > > 4
4

OBJETIVOS

Criao de uma inteligncia computacional capaz de


tomar boas decises em um jogo de pquer, na modalidade
Texas Holdem, inicialmente com 7 jogadores mesa, e
obviamente, conseguir vencer os demais jogadores tambm
gerados atravs de inteligncias artificiais pelos outros
colegas da disciplina ELT 460 Inteligncia Computacional.

Muita ficha
Mdia ficha
Pouca ficha

A segunda funo criada diz respeito a qualificao das


cartas presentes na mo. Essa funo reconhece os jogos
do pquer (de royal straight flush a carta mais alta na mo) e
retorna ao fuzzy uma varivel escolhida como fora da mo.
Essa varivel dividida em cinco formas lingusticas, sendo
elas:

Devido ao fato das entradas terem apenas valores inteiros


e positivos, o formato da funo no de grande interesse,
desde que cada entrada (varivel numrica) se encontre
dentro da funo de pertinncia correta (varivel lingustica).
Na entrada posio, SB significa small blind e BB big
blind. Para um jogo com sete jogadores, as posies finais
so a do dealer e a anterior a ele, ficando as demais posies
como intermedirias. Na medida em que jogadores vo sendo
eliminados do jogo, as primeiras posies a se extinguirem
so as intermedirias, depois a cut-off (posio anterior ao
dealer) e por fim o small blind, restando apenas o dealer e o
big blind, tal etapa conhecida como Heads-up.
As aes de sada as quais a lgica fuzzy retorna so:

Mo muito forte;
mo forte;
mo boa;
mo mdia;
mo fraca.

III.III Lgica fuzzy


Como o nmero de adversrios varia durante o jogo, e
para cada quantidade de oponentes deve-se tomar atitudes
diferentes para diferentes situaes, optou-se pela diviso do
problema em cinco lgicas fuzzy diferentes. Isso ajuda a
localizar erros e diminuir o nmero de regras por lgica. A
diviso foi feita da forma mostra na Figura 2.

N de
jogadores

Fuzzy1

Fuzzy2

Fuzzy3

Fuzzy4

5 ou 6

Fuzzy5_6

Fold;
call/check;
raise BB;
raise 2BB;
all-in.

Vale ressaltar que as aes raise BB ou raise 2BB podem


ser substitudas por raise valor mnimo permitido ou raise
duas vezes o valor mnimo permitido, em caso do valor
mnimo permitido ser maior que o valor do big blind. Alm
do que, no caso de poucas fichas ou final do jogo, ambas as
aes podem se transformar em um all-in devido ao valor do
stack ser baixo ou o valor do big blind muito alto.

Figura 2 - Fluxograma de escolha do fuzzy a ser utilizado.

III.IV Interface Grfica


As entradas da lgica fuzzy com suas respectivas variveis
lingusticas usadas nas funes de pertinncia so mostradas
na Tabela 2. Para entradas e sadas utilizou-se como formato
de funes de pertinncia a gaussiana, um exemplo
mostrado na Figura 3.

Como dito anteriormente, afim de melhorar a jogabilidade


e facilitar a descoberta de erros, optou-se pela criao de uma
interface grfica onde so colocadas as entradas e mostrada
as aes a serem tomadas.
A interface criada pode ser vista atravs da Figura 4.

Figura 3 - Funes de pertinncia gaussinaa utilizadas na


entrada "momento".
Tabela 2 - Entradas e respectivas variveis lingusticas usadas
nas funes de pertinncia das lgicas fuzzy.

Entradas
Momento
Posio
FM
Stack/blind (ou
)
Ao do oponente

Variveis Lingusticas
Pr-flop, flop, turn e river
SB, BB, intermedirias e finais
Fraca, mdia, boa, forte e muito
forte
Muita ficha, mdia ficha e pouca
ficha
Fold, check, call, raise e re-raise.

Figura 4 - Interface grfica para entrada de dados e


visualizao da sada (ao).

Tabela 4 - Fora da mo de acordo com grupos de jogos para


demais momentos.

Na Figura 4 pode-se ver vrias checkboxs onde so


possveis selecionar as entradas referentes ao jogo.
Aps a seleo das entradas, aperta-se o boto JOGAR
e espera-se pela ao a ser tomada. Novamente para
identificao de possveis erros, criou-se um espao para
dizer qual jogo as cartas selecionadas formam (mesmo no
caso de nenhum, quando ento indicado mo vazia).
Outra estratgia usada para melhorar a jogabilidade e
diminuir a possibilidade de erro a acusao de erro gerada,
caso o usurio entre com nmero de cartas diferentes do
esperado para cada momento, um exemplo dessa
identificao de erro na interface mostrada na Figura 5.

Grupo
1
2
3
4
5

Jogo
Royal flush, straight flush,
four
Full house
Flush, sequncia
Trinca, dois pares
Um par, carta alta
IV.

Fora da mo
Mo muito forte
Mo forte
Mo boa
Mo mdia
Mo Fraca

RESULTADOS E DISCUSSO

Para que fosse possvel a validao do jogador que segue


as aes geradas pela lgica fuzzy implementada, testes foram
realizados na plataforma PokerTH 1.1.1 com quatro tipos de
jogadores, sendo eles (baseados nos modelos de [4]):

Figura 5 - Janela de erro mostrando nmero de cartas


diferente do esperado, no caso durante o pr-flop.

III.V Estratgia utilizada

A princpio, a estratgia utilizada na qualificao da


fora da mo no pr-flop mostrada na Tabela 3.

Os jogadores aleatrios foram criados atravs de uma


lgica no Matlab (script que se encontra anexado ao fim deste
trabalho).
Em base das mesmas condies do jogo, que so:

Tabela 3 - Fora da mo de acordo com grupos de jogos para


pr-flop.

Grupo
1
2
3
4
5
6
7
8

Jogo
AA, KK
QQ, JJ
TT, 99
AQ, AK, AJs, KQs, 88,
77
AJo, AT, KQo, KJs, 66,
55
A9s-A2s, KJo, KTs, QJs,
QTs, JTs, 44, 33, 22
A9o-A2o, KTo, QJo,
QTo, JTo, T9s, 98s, 87s,
76s, 65s, 54s
Demais jogos ou cartas

Jogador call/check jogador que sempre chama ou


paga a aposta do adversrio;
jogador bet/raise jogador que sempre aposta ou
aumenta a aposta do oponente;
jogador aleatrio 1 jogador que age
aleatoriamente a cada momento;
jogador aleatrio 2 jogador que age de forma
aleatria a cada mo.

Fora da mo
Mo muito forte
Mo forte
Mo boa

Mo mdia

Big blind inicial de 40;


big blind tendo valor dobrado a cada 5 rodadas;
stack inicial de 2000 fichas;
7 jogadores iniciando o jogo.

Nestas condies, foram realizados 25 testes para cada


jogador, inclusive para o criado atravs da lgica fuzzy. Os
resultados so apresentados na Tabela 5.
Tabela 5 - Resultados gerados para comparao e validao.

Mo Fraca

A estratgia utilizada na qualificao da fora da mo


nos demais momentos (tirando o pr-flop) mostrada na
Tabela 4.
Em funo do grupo apresentado, da posio, do nmero
de fichas (stack/blind), do nmero de adversrios e da ao
dos adversrios, montou-se uma planilha de aes esperadas.
Essa planilha encontra-se anexada a esse trabalho.
Nas Tabela 3 e Tabela 4 aparecem alguns s e o, essas
abreviaes significam, respectivamente, suited (naipado ou
mesmo naipe) e offsuited (naipes diferentes).

Jogador

Vitrias (%)

Call/check
Bet/raise
Aleatrio1
Aleatrio2
Fuzzy

0
0
0
0
8

Saiu depois de 3
jogadores (%)
32
36
4
16
68

possvel observar que o jogador que obteve maior


sucesso foi o implementado atravs da lgica fuzzy, obtendo
duas vitrias (equivalente a 8%) e foi eliminado da mesa aps
no mnimo 3 jogadores em 68% das vezes. Nenhum outro
jogador conseguiu uma vitria, sendo assim, apenas o critrio
Saiu depois de 3 jogadores foi levado em conta para
colocao dos demais jogadores, sendo a ordem deles a
seguite: jogador bet/raise, call/check, aleatrio2 e aleatrio1.
Diferentemente do que ocorreu em [4], poucas vitrias
ocorreram, isso deve-se ao nmero de jogadores presentes no

jogo. A chance de vitria em um jogo Heads-up (1


adversrio) maior que contra 6 oponentes.
No primeiro teste contra outros jogadores que tomam
decises baseadas em inteligncias computacionais
referentes aos demais trabalhos finais da matria ELT 460
Inteligncia Computacional da Universidade Federal de
Viosa, o jogador aqui proposto foi o terceiro a ser eliminado.
V.

CONCLUSO

Analisando-se os resultados, pode-se dizer que o objetivo


foi de certa forma alcanado, porm deixando um pouco a
desejar em funo do teste realizado em sala de aula bem
como os testes contra a inteligncia do programa PokerTH.
No entanto, tais problemas no se devem a erros na
inteligncia computacional criada, mas sim na criao das
regras impostas lgica fuzzy alm de algumas entradas um
pouco vagas e outras inexistentes, como por exemplo: as
aes dos adversrios (que no dizem quantas vezes foram
tomadas), o valor do pot que no foi levado em considerao,
nem o valor do raise do adversrio.
Algumas melhoras que podem ser realizadas so:
Adicionar o nmero de aes de adversrios
anteriores como entrada da lgica fuzzy;
adicionar o valor do pot (em varivel lingustica)
como entrada da lgica fuzzy;
adicionar o tamanho do raise do adversrio (tambm
em varivel lingustica), quando houver;
diferenciar as cartas da mo com o restante presente
na mesa, para evitar que jogos da mesa sejam muito
levados em considerao;
dividir em mais grupos a fora da mo
Como ainda tero mais rodadas contra as inteligncias dos
colegas de sala, tais melhorias (descritas acima) podero ser
realizadas afim de se obter um melhor desempenho.
REFERNCIAS BIBLIOGRFICAS
1. REZENDE, S. O. Sistemas Fuzzy. In: REZENDE, S. O.
Sistemas Inteligentes: Fundamentos e Aplicaes. 1.
ed. So Paulo: Manole, 2003. p. 169-202.
2. Histrico da Lgica Fuzzy. Lgica Fuzzy. Disponivel
em: <http://www.logicafuzzy.com.br/o-que-e-logicafuzzy/>. Acesso em: Outubro 2016.
3. GOLDSCHMIDT, R. R. Uma Introduo
Inteligncia Computacional. 1. ed. Rio de Janeiro:
IST Rio, 2010.
4. RODRIGUES JR., H. M. R. et al. AGENTE
TOMADOR DE DECISES BASEADAS EM
LGICA FUZZY NO JOGO DE PQUER. Anais do
SIMMEC, Diamantina, Maio 2016.

ANEXO I (ESTRATGIAS PR-FLOP)

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call

Muita ficha (stack > 10BB)


Sem aumento antes de voc
small blind
final
intermediario
2 BB
BB
BB
2 BB
BB
call
BB
call
call
call
call
call
call
fold
fold
small blind
final
intermediario
2 BB
BB
BB
2 BB
BB
call
BB
call
call
call
call
call
call
fold
fold
small blind
final
intermediario
2 BB
BB
2 BB
BB
BB
call
call
call
call
fold
small blind
final
intermediario
2 BB
BB
2 BB
BB
BB
call
call
call
call
fold
small blind
final
intermediario
2 BB
2 BB
BB
call
fold
5

big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold

Com aumento antes de voc


small blind
final
intermediario
BB
BB
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
BB
BB
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
BB
BB
call
call
call
call
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
call
call
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
fold
fold

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

big blind
2 BB
BB
BB
call
call
big blind
2 BB
BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call

media (10BB > stack > 4BB)


Sem aumento antes de voc
small blind
final
intermediario
BB
BB
BB
BB
BB
call
BB
call
call
call
call
call
call
fold
fold
small blind
final
intermediario
BB
BB
BB
BB
BB
call
BB
call
call
call
call
call
call
fold
fold
small blind
final
intermediario
2 BB
BB
BB
BB
BB
call
call
call
call
fold
small blind
final
intermediario
2 BB
BB
2 BB
BB
BB
call
call
call
call
fold
small blind
final
intermediario
2 BB
2 BB
BB
call
fold
6

big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold

Com aumento antes de voc


small blind
final
intermediario
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
call
call
fold
fold
fold
fold
small blind
final
intermediario
BB
BB
call
call
call
call
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
fold
fold

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

big blind
BB
call
call
call
call
big blind
BB
call
call
call
call
big blind
BB
call
call
call
call
big blind
2 BB
2 BB
BB
call
call
big blind
2 BB
2 BB
BB
call
call

baixa ficha ( 4BB > stack)


Sem aumento antes de voc
small blind
final
intermediario
BB
BB
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
small blind
final
intermediario
BB
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
small blind
final
intermediario
BB
call
call
call
call
call
call
fold
fold
fold
small blind
final
intermediario
2 BB
BB
BB
BB
BB
call
call
call
call
fold
small blind
final
intermediario
2 BB
2 BB
BB
call
fold
7

big blind
call
call
fold
fold
fold
big blind
call
call
fold
fold
fold
big blind
call
call
fold
fold
fold
big blind
BB
call
call
fold
fold
big blind
BB
call
call
fold
fold

Com aumento antes de voc


small blind
final
intermediario
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
fold
fold
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
call
call
call
fold
fold
fold
fold
small blind
final
intermediario
call
call
call
fold
fold

ANEXO II (ESTRATGIAS FLOP-RIVER-TURN)

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
fold

Muita ficha (stack > 10BB)


Sem aumento antes de voc
intermediario
big blind small blind
2 BB
BB
BB
2 BB
BB
call
BB
call
call
call
call
call
call
fold
fold
intermediario
big blind small blind
2 BB
BB
BB
2 BB
BB
call
BB
call
call
call
call
call
call
fold
fold
intermediario
big blind small blind
BB
BB
BB
call
call
call
call
call
fold
fold
intermediario
big blind small blind
2 BB
BB
2 BB
BB
BB
call
call
call
call
fold
intermediario
big blind small blind
2 BB
2 BB
BB
call
call
8

final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold

Com aumento antes de voc


intermediario
big blind small blind
BB
BB
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
BB
BB
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
BB
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
BB
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
fold
fold

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

final
2 BB
BB
BB
call
call
final
2 BB
BB
BB
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
fold

media (10BB > stack > 4BB)


Sem aumento antes de voc
intermediario
big blind small blind
BB
BB
BB
BB
BB
call
BB
call
call
call
call
call
call
fold
fold
intermediario
big blind small blind
BB
BB
BB
BB
BB
call
BB
call
call
call
call
call
call
fold
fold
intermediario
big blind small blind
BB
BB
BB
call
call
call
call
call
fold
fold
intermediario
big blind small blind
2 BB
BB
2 BB
BB
BB
call
call
call
call
fold
intermediario
big blind small blind
2 BB
2 BB
BB
call
call
9

final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold

Com aumento antes de voc


intermediario
big blind small blind
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
BB
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
BB
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
fold
fold

Nmero de adversrios

5e6

Grupo de Mos
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior
Posio
Grupo 1
Grupo 2
Grupo 3
Grupo 4
Grupo 5 ou pior

final
BB
call
call
call
call
final
BB
call
call
call
call
final
BB
call
call
call
call
final
2 BB
2 BB
BB
call
call
final
2 BB
2 BB
BB
call
call

baixa ficha ( 4BB > stack)


Sem aumento antes de voc
intermediario
big blind small blind
BB
BB
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
intermediario
big blind small blind
BB
call
call
call
call
call
call
call
call
call
fold
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
2 BB
BB
BB
BB
BB
call
call
call
call
fold
intermediario
big blind small blind
2 BB
2 BB
BB
call
fold
10

final
call
call
fold
fold
fold
final
call
call
fold
fold
fold
final
call
call
fold
fold
fold
final
BB
call
call
fold
fold
final
BB
call
call
fold
fold

Com aumento antes de voc


intermediario
big blind small blind
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
call
call
call
fold
fold
fold
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
call
fold
fold
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
call
call
call
fold
fold
fold
fold
intermediario
big blind small blind
call
call
call
fold
fold

ANEXO III (SCRIPTS DA INTERFACE, DAS FUNES DE QUALIFICAO E DO GERADOR DE JOGADA


RANDOMICO)
1.

INTERFACE

function varargout = poker(varargin)


% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @poker_OpeningFcn, ...
'gui_OutputFcn', @poker_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before poker is made visible.
function poker_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
handles.cartas = zeros(4,13);
handles.momento = 1;
handles.posicao = 1;
handles.numadversarios = 1;
handles.acaooponente = 1;
handles.fuzzy = [];
handles.blind = 20;
handles.stack = 2000;
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = poker_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% Identifica as cartas clicadas na inteface
function box(hObject, eventdata, handles)
carta = get(hObject,'Tag');
teste = carta(8);
if teste == 'X';
handles.cartas(str2double(carta(6)),str2double(carta(7))) = get(hObject,'Value');
else
handles.cartas(str2double(carta(6)),str2double(carta(7:8))) = get(hObject,'Value');
end
guidata(hObject, handles);
function momento(hObject, eventdata, handles)
mom = get(hObject,'Tag'); % sendo as Tag's: M1_PREFLOP, M2_FLOP, M3_TURN e M4_RIVER
handles.momento = str2double(mom(2));
guidata(hObject, handles);
function posicao(hObject, eventdata, handles)
pos = get(hObject,'Tag'); % sendo as Tag's sao: P1_BLINDS, P2_INTERMEDIARIAS e P3_FINAIS
11

handles.posicao = str2double(pos(2));
guidata(hObject, handles);
function numadversarios(hObject, eventdata, handles)
numadv = get(hObject,'Tag'); % sendo as Tag's sao: AD1, AD2, AD3, AD4, AD5 e AD6
handles.numadversarios = str2double(numadv(3));
guidata(hObject, handles);
function acaooponente(hObject, eventdata, handles)
acaoop = get(hObject,'Tag'); % sendo as Tag's sao: O1_FOLD, O2_CHECK, O3_CALL O4_RAISE e
O5_RERAIS
handles.acaooponente = str2double(acaoop(2));
guidata(hObject, handles);
function edit_blind_Callback(hObject, eventdata, handles)
handles.blind = str2double(get(hObject,'string'));
assignin('base','blind',handles.blind);
if isnan(handles.blind)
errordlg('BLIND: Voc deve entrar com um valor numrico.','Invalid Input','modal')
uicontrol(hObject)
return
end
guidata(hObject, handles);
function edit_blind_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_stack_Callback(hObject, eventdata, handles)
handles.stack = str2double(get(hObject,'string'));
assignin('base','stack',handles.stack);
if isnan(handles.stack)
errordlg('STACK: Voc deve entrar com um valor numrico.','Invalid Input','modal')
uicontrol(hObject)
return
end
guidata(hObject, handles);
function edit_stack_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function acao_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function jogo_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function pushbutton_jogar_Callback(hObject, eventdata, handles)
[FM, jogo] = qualificar(handles.cartas,handles.momento); % realiza a qualificao da
fora da mo
% e ainda retorna o jogo que temos
12

nb = divide(handles.stack,handles.blind);
set(handles.jogo, 'String', num2str(jogo)); % mostra qual jogo temos
% Se houverem 6 adversrios
if handles.numadversarios == 6
poker = readfis('poker5_6');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
if handles.fuzzy <= 1.5
agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 3.5 && handles.fuzzy
agir = strcat('Raise BB');
elseif handles.fuzzy > 4.5 && handles.fuzzy
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end

<= 2.5
<= 3.5
<= 4.5
<= 5.5

% Se houverem 5 adversrios
if handles.numadversarios == 5
poker = readfis('poker5_6');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
if handles.fuzzy <= 1.5
agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 3.5 && handles.fuzzy
agir = strcat('Raise BB');
elseif handles.fuzzy > 4.5 && handles.fuzzy
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end

<= 2.5
<= 3.5
<= 4.5
<= 5.5

% Se houverem 4 adversrios
if handles.numadversarios == 4
poker = readfis('poker4');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
13

if handles.fuzzy <= 1.5


agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 3.5 && handles.fuzzy
agir = strcat('Raise BB');
elseif handles.fuzzy > 4.5 && handles.fuzzy
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end

<= 2.5
<= 3.5
<= 4.5
<= 5.5

% Se houverem 3 adversrios
if handles.numadversarios == 3
poker = readfis('poker3');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
if handles.fuzzy <= 1.5
agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 3.5 && handles.fuzzy
agir = strcat('Raise BB');
elseif handles.fuzzy > 4.5 && handles.fuzzy
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end

<= 2.5
<= 3.5
<= 4.5
<= 5.5

% Se houverem 2 adversrios
if handles.numadversarios == 2
poker = readfis('poker2');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
if handles.fuzzy <= 1.5
agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy <= 2.5
agir = strcat('Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy <= 3.5
agir = strcat('Call');
elseif handles.fuzzy > 3.5 && handles.fuzzy <= 4.5
14

agir = strcat('Raise BB');


elseif handles.fuzzy > 4.5 && handles.fuzzy <= 5.5
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end
% Se houver 1 adversrio
if handles.numadversarios == 1
poker = readfis('poker1');
handles.fuzzy = evalfis([handles.momento handles.posicao FM nb
handles.acaooponente],poker,181);
if handles.fuzzy <= 1.5
agir = strcat('Fold');
elseif handles.fuzzy > 1.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 2.5 && handles.fuzzy
agir = strcat('Call/Check');
elseif handles.fuzzy > 3.5 && handles.fuzzy
agir = strcat('Raise BB');
elseif handles.fuzzy > 4.5 && handles.fuzzy
agir = strcat('Raise 2BB');
elseif handles.fuzzy > 5.5
agir = strcat('All In');
end
set(handles.acao, 'String', num2str(agir));
% cartas = handles.cartas
% momento = handles.momento
% posicao = handles.posicao
% acao_oponente = handles.acaooponente
% Forca_mao = FM
% xBlinds = nb
end

<= 2.5
<= 3.5
<= 4.5
<= 5.5

% Limpar todas as cartas marcadas


function pushbutton_clear_Callback(hObject, eventdata, handles)
% Limpa checkbox cartas COPAS
set(handles.carta11X,'Value',0);
set(handles.carta12X,'Value',0);
set(handles.carta13X,'Value',0);
set(handles.carta14X,'Value',0);
set(handles.carta15X,'Value',0);
set(handles.carta16X,'Value',0);
set(handles.carta17X,'Value',0);
set(handles.carta18X,'Value',0);
set(handles.carta19X,'Value',0);
set(handles.carta110,'Value',0);
set(handles.carta111,'Value',0);
set(handles.carta112,'Value',0);
set(handles.carta113,'Value',0);
% Limpa checkbox cartas OUROS
set(handles.carta21X,'Value',0);
set(handles.carta22X,'Value',0);
15

set(handles.carta23X,'Value',0);
set(handles.carta24X,'Value',0);
set(handles.carta25X,'Value',0);
set(handles.carta26X,'Value',0);
set(handles.carta27X,'Value',0);
set(handles.carta28X,'Value',0);
set(handles.carta29X,'Value',0);
set(handles.carta210,'Value',0);
set(handles.carta211,'Value',0);
set(handles.carta212,'Value',0);
set(handles.carta213,'Value',0);
% Limpa checkbox cartas PAUS
set(handles.carta31X,'Value',0);
set(handles.carta32X,'Value',0);
set(handles.carta33X,'Value',0);
set(handles.carta34X,'Value',0);
set(handles.carta35X,'Value',0);
set(handles.carta36X,'Value',0);
set(handles.carta37X,'Value',0);
set(handles.carta38X,'Value',0);
set(handles.carta39X,'Value',0);
set(handles.carta310,'Value',0);
set(handles.carta311,'Value',0);
set(handles.carta312,'Value',0);
set(handles.carta313,'Value',0);
% Limpa checkbox cartas ESPADAS
set(handles.carta41X,'Value',0);
set(handles.carta42X,'Value',0);
set(handles.carta43X,'Value',0);
set(handles.carta44X,'Value',0);
set(handles.carta45X,'Value',0);
set(handles.carta46X,'Value',0);
set(handles.carta47X,'Value',0);
set(handles.carta48X,'Value',0);
set(handles.carta49X,'Value',0);
set(handles.carta410,'Value',0);
set(handles.carta411,'Value',0);
set(handles.carta412,'Value',0);
set(handles.carta413,'Value',0);
% Zera a matriz cartas
handles.cartas = zeros(4,13);
guidata(hObject,handles)
2.

FUNES DE QUALIFICAO

function [FM, jogo] = qualificar(cartas,momento)


% GUIA DE MOS INICIAIS %
col = sum(cartas); %soma cada coluna de cartas (2 cartas)
lin = sum(cartas'); %soma cada linha de cartas (2 cartas)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if momento == 1 % PRE-FLOP (2 CARTAS)
if lin(1)+lin(2)+lin(3)+lin(4) >= 3
errordlg('Mais de 2 cartas selecionadas.','ERROR!!!','modal');
elseif lin(1)+lin(2)+lin(3)+lin(4) <= 1
errordlg('Menos de 2 cartas selecionadas.','ERROR!!!','modal');
16

end
naipado2 = lin(1) == 2 || lin(2) == 2 || lin(3) == 2 || lin(4) == 2;
mao_muito_forte = col(13) == 2 || col(12) == 2; % AA e KK
mao_forte = col(11) == 2 || col(10) == 2;% QQ e JJ
mao_boa = col(9) == 2 || col(8) == 2;% TT e 99
mao_media = col(13)+col(12) == 2 || col(13)+col(11) == 2 || ... % AK e AQ
((col(13)+col(10) == 2) && naipado2) || ((col(12)+col(11) == 2) && naipado2) ||
... % AJs e KQs
col(7) == 2 || col(6) == 2;% 88 e 77
if mao_muito_forte == 1
FM = 5;
jogo = 'AA ou KK';
elseif mao_forte == 1
FM = 4;
jogo = 'QQ ou JJ';
elseif mao_boa == 1
FM = 3;
jogo = 'TT ou 99';
elseif mao_media == 1
FM = 2;
jogo = 'AK/AQ/AJs/KQs/88/77';
else
FM = 1;
jogo = 'Mo Fraca';
end
%%%%% FIM DO PRE-FLOP %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elseif momento == 2 % FLOP (5 CARTAS)
if lin(1)+lin(2)+lin(3)+lin(4) >= 6
errordlg('Mais de 5 cartas selecionadas.','ERROR!!!','modal');
elseif lin(1)+lin(2)+lin(3)+lin(4) <= 4
errordlg('Menos de 5 cartas selecionadas.','ERROR!!!','modal');
end
ordem_col = sort(col,'descend');
ordem_lin = sort(lin,'descend');
royal_flush = ((ordem_lin(1) == 5) && (col(13)+col(12)+col(11)+col(10)+col(9) ==
5));
straight_flush = ((ordem_lin(1) == 5) && ((col(12)+col(11)+col(10)+col(9)+col(8)
== 5) || ...
(col(11)+col(10)+col(9)+col(8)+col(7) ==
5) || ...
(col(10)+col(9)+col(8)+col(7)+col(6) ==
5) || ...
(col(9)+col(8)+col(7)+col(6)+col(5) ==
5) || ...
(col(8)+col(7)+col(6)+col(5)+col(4) ==
5) || ...
(col(7)+col(6)+col(5)+col(4)+col(3) ==
5) || ...
(col(6)+col(5)+col(4)+col(3)+col(2) ==
5) || ...
17

(col(5)+col(4)+col(3)+col(2)+col(1) ==
5) || ...
(col(4)+col(3)+col(2)+col(1)+col(13) ==
5)));
quadra = ordem_col(1) == 4;
full_house = ordem_col(1)+ordem_col(2) == 5;
flush = ((ordem_lin(1) == 5) && ((col(13)+col(12)+col(11)+col(10)+col(9) ~= 5) ||
...
(col(12)+col(11)+col(10)+col(9)+col(8)
~= 5) || ...
(col(11)+col(10)+col(9)+col(8)+col(7) ~=
5) || ...
(col(10)+col(9)+col(8)+col(7)+col(6) ~=
5) || ...
(col(9)+col(8)+col(7)+col(6)+col(5) ~=
5) || ...
(col(8)+col(7)+col(6)+col(5)+col(4) ~=
5) || ...
(col(7)+col(6)+col(5)+col(4)+col(3) ~=
5) || ...
(col(6)+col(5)+col(4)+col(3)+col(2) ~=
5) || ...
(col(5)+col(4)+col(3)+col(2)+col(1) ~=
5) || ...
(col(4)+col(3)+col(2)+col(1)+col(13) ~=
5)));
straight = ((ordem_lin(1) < 5) && ((col(13)==1 && col(12)==1 && col(11)== 1 &&
col(10)== 1 && col(9) == 1) || ...
(col(12)==1 && col(11)==1 && col(10)== 1 && col(9)== 1 && col(8) ==
1) || ...
(col(11)==1 && col(10)==1 && col(9)== 1 && col(8)== 1 && col(7) == 1)
|| ...
(col(10)==1 && col(9)==1 && col(8)== 1 && col(7)== 1 && col(6) == 1)
|| ...
(col(9)==1 && col(8)==1 && col(7)== 1 && col(6)== 1 && col(5) == 1)
|| ...
(col(8)==1 && col(7)==1 && col(6)== 1 && col(5)== 1 && col(4) == 1)
|| ...
(col(7)==1 && col(6)==1 && col(5)== 1 && col(4)== 1 && col(3) == 1)
|| ...
(col(6)==1 && col(5)==1 && col(4)== 1 && col(3)== 1 && col(2) == 1)
|| ...
(col(5)==1 && col(4)==1 && col(3)== 1 && col(2)== 1 && col(1) == 1)
|| ...
(col(4)==1 && col(3)==1 && col(2)== 1 && col(1)== 1 && col(13) ==
1)));
trinca = ordem_col(1) == 3;
dois_pares = (ordem_col(1) == 2) && (ordem_col(2) == 2);
um_par_maior_6 = col(13) == 2 || col(12) == 2 || col(11) == 2 || col(10) == 2 ||
...
col(9) == 2 || col(8) == 2 || col(7) == 2 || col(6) == 2;
um_par_menor_7 = col(5) == 2 || col(4) == 2 || col(3) == 2 || col(2) == 2 ||
col(1) == 2;
% restante uma carta alta
18

if royal_flush == 1
FM = 5;
jogo = 'Royal Flush';
elseif straight_flush == 1
FM = 5;
jogo = 'Straight Flush';
elseif quadra == 1
FM = 5;
jogo = 'Quadra';
elseif full_house == 1
FM = 4;
jogo = 'Full House';
elseif flush == 1
FM = 3;
jogo = 'Flush';
elseif straight == 1
FM = 3;
jogo = 'Straight';
elseif trinca == 1
FM = 2;
jogo = 'Trinca';
elseif dois_pares == 1
FM = 2;
jogo = '2 Pares';
elseif um_par_maior_6 == 1
FM = 1;
jogo = '1 Par Maior que 6';
elseif um_par_menor_7 == 1
FM = 1;
jogo = '1 Par Menor que 7';
else
FM = 1;
jogo = 'Nada Bom';
end
%%%%% FIM DO FLOP %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elseif momento == 3 % TURN (6 CARTAS)
if lin(1)+lin(2)+lin(3)+lin(4) >= 7
errordlg('Mais de 6 cartas selecionadas.','ERROR!!!','modal');
elseif lin(1)+lin(2)+lin(3)+lin(4) <= 5
errordlg('Menos de 6 cartas selecionadas.','ERROR!!!','modal');
end
ordem_col = sort(col,'descend');
ordem_lin = sort(lin,'descend');
royal_flush = cartas(1,13)+cartas(1,12)+cartas(1,11)+cartas(1,10)+cartas(1,9) ==
5 || ...
cartas(2,13)+cartas(2,12)+cartas(2,11)+cartas(2,10)+cartas(2,9) ==
5 || ...
cartas(3,13)+cartas(3,12)+cartas(3,11)+cartas(3,10)+cartas(3,9) ==
5 || ...
cartas(4,13)+cartas(4,12)+cartas(4,11)+cartas(4,10)+cartas(4,9) ==
5;
straight_flush = cartas(1,12)+cartas(1,11)+cartas(1,10)+cartas(1,9)+cartas(1,8)
== 5 || ...
cartas(2,12)+cartas(2,11)+cartas(2,10)+cartas(2,9)+cartas(2,8)
== 5 || ...
cartas(3,12)+cartas(3,11)+cartas(3,10)+cartas(3,9)+cartas(3,8)
== 5 || ...
19

cartas(4,12)+cartas(4,11)+cartas(4,10)+cartas(4,9)+cartas(4,8)
== 5 || ... %
cartas(1,11)+cartas(1,10)+cartas(1,9)+cartas(1,8)+cartas(1,7) ==
5 || ...
cartas(2,11)+cartas(2,10)+cartas(2,9)+cartas(2,8)+cartas(2,7) ==
5 || ...
cartas(3,11)+cartas(3,10)+cartas(3,9)+cartas(3,8)+cartas(3,7) ==
5 || ...
cartas(4,11)+cartas(4,10)+cartas(4,9)+cartas(4,8)+cartas(4,7) ==
5 || ... %
cartas(1,10)+cartas(1,9)+cartas(1,8)+cartas(1,7)+cartas(1,6) ==
5 || ...
cartas(2,10)+cartas(2,9)+cartas(2,8)+cartas(2,7)+cartas(2,6) ==
5 || ...
cartas(3,10)+cartas(3,9)+cartas(3,8)+cartas(3,7)+cartas(3,6) ==
5 || ...
cartas(4,10)+cartas(4,9)+cartas(4,8)+cartas(4,7)+cartas(4,6) ==
5 || ... %
cartas(1,9)+cartas(1,8)+cartas(1,7)+cartas(1,6)+cartas(1,5) == 5
|| ...
cartas(2,9)+cartas(2,8)+cartas(2,7)+cartas(2,6)+cartas(2,5) == 5
|| ...
cartas(3,9)+cartas(3,8)+cartas(3,7)+cartas(3,6)+cartas(3,5) == 5
|| ...
cartas(4,9)+cartas(4,8)+cartas(4,7)+cartas(4,6)+cartas(4,5) == 5
|| ... %
cartas(1,8)+cartas(1,7)+cartas(1,6)+cartas(1,5)+cartas(1,4) == 5
|| ...
cartas(2,8)+cartas(2,7)+cartas(2,6)+cartas(2,5)+cartas(2,4) == 5
|| ...
cartas(3,8)+cartas(3,7)+cartas(3,6)+cartas(3,5)+cartas(3,4) == 5
|| ...
cartas(4,8)+cartas(4,7)+cartas(4,6)+cartas(4,5)+cartas(4,4) == 5
|| ... %
cartas(1,7)+cartas(1,6)+cartas(1,5)+cartas(1,4)+cartas(1,3) == 5
|| ...
cartas(2,7)+cartas(2,6)+cartas(2,5)+cartas(2,4)+cartas(2,3) == 5
|| ...
cartas(3,7)+cartas(3,6)+cartas(3,5)+cartas(3,4)+cartas(3,3) == 5
|| ...
cartas(4,7)+cartas(4,6)+cartas(4,5)+cartas(4,4)+cartas(4,3) == 5
|| ... %
cartas(1,6)+cartas(1,5)+cartas(1,4)+cartas(1,3)+cartas(1,2) == 5
|| ...
cartas(2,6)+cartas(2,5)+cartas(2,4)+cartas(2,3)+cartas(2,2) == 5
|| ...
cartas(3,6)+cartas(3,5)+cartas(3,4)+cartas(3,3)+cartas(3,2) == 5
|| ...
cartas(4,6)+cartas(4,5)+cartas(4,4)+cartas(4,3)+cartas(4,2) == 5
|| ... %
cartas(1,5)+cartas(1,4)+cartas(1,3)+cartas(1,2)+cartas(1,1) == 5
|| ...
cartas(2,5)+cartas(2,4)+cartas(2,3)+cartas(2,2)+cartas(2,1) == 5
|| ...
cartas(3,5)+cartas(3,4)+cartas(3,3)+cartas(3,2)+cartas(3,1) == 5
|| ...
cartas(4,5)+cartas(4,4)+cartas(4,3)+cartas(4,2)+cartas(4,1) == 5
|| ... %
cartas(1,4)+cartas(1,3)+cartas(1,2)+cartas(1,1)+cartas(1,13) ==
5 || ...
cartas(2,4)+cartas(2,3)+cartas(2,2)+cartas(2,1)+cartas(2,13) ==
5 || ...
cartas(3,4)+cartas(3,3)+cartas(3,2)+cartas(3,1)+cartas(3,13) ==
5 || ...
20

cartas(4,4)+cartas(4,3)+cartas(4,2)+cartas(4,1)+cartas(4,13) ==
5;
quadra = ordem_col(1) == 4;
full_house = (ordem_col(1)+ordem_col(2)) >= 5;
flush = ((ordem_lin(1) >= 5) && (royal_flush ~= 1 || straight_flush ~= 1));
straight = ((ordem_lin(1) < 5) && ((col(13)==1 && col(12)==1 && col(11)== 1 &&
col(10)== 1 && col(9) == 1) || ...
(col(12)==1 && col(11)==1 && col(10)== 1 && col(9)== 1 && col(8) ==
1) || ...
(col(11)==1 && col(10)==1 && col(9)== 1 && col(8)== 1 && col(7) == 1)
|| ...
(col(10)==1 && col(9)==1 && col(8)== 1 && col(7)== 1 && col(6) == 1)
|| ...
(col(9)==1 && col(8)==1 && col(7)== 1 && col(6)== 1 && col(5) == 1)
|| ...
(col(8)==1 && col(7)==1 && col(6)== 1 && col(5)== 1 && col(4) == 1)
|| ...
(col(7)==1 && col(6)==1 && col(5)== 1 && col(4)== 1 && col(3) == 1)
|| ...
(col(6)==1 && col(5)==1 && col(4)== 1 && col(3)== 1 && col(2) == 1)
|| ...
(col(5)==1 && col(4)==1 && col(3)== 1 && col(2)== 1 && col(1) == 1)
|| ...
(col(4)==1 && col(3)==1 && col(2)== 1 && col(1)== 1 && col(13) ==
1)));
trinca = (ordem_col(1) == 3);
dois_pares = (ordem_col(1) == 2) && (ordem_col(2) == 2);
um_par_maior_6 = (col(13) == 2 || col(12) == 2 || col(11) == 2 || col(10) == 2 ||
...
col(9) == 2 || col(8) == 2 || col(7) == 2 || col(6) == 2) && ordem_col(1) ==
2;
um_par_menor_7 = col(5) == 2 || col(4) == 2 || col(3) == 2 || col(2) == 2 ||
col(1) == 2;
% restante uma carta alta
if royal_flush == 1
FM = 5;
jogo = 'Royal Flush';
elseif straight_flush == 1
FM = 5;
jogo = 'Straight Flush';
elseif quadra == 1
FM = 5;
jogo = 'Quadra';
elseif full_house == 1
FM = 4;
jogo = 'Full House';
elseif flush == 1
FM = 3;
jogo = 'Flush';
elseif straight == 1
FM = 3;
jogo = 'Straight';
elseif trinca == 1
FM = 2;
21

jogo = 'Trinca';
elseif dois_pares == 1
FM = 2;
jogo = '2 Pares';
elseif um_par_maior_6 == 1
FM = 1;
jogo = '1 Par Maior que 6';
elseif um_par_menor_7 == 1
FM = 1;
jogo = '1 Par Menor que 7';
else
FM = 1;
jogo = 'Nada Bom';
end
%%%%% FIM DO TURN %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else % RIVER (7 CARTAS)
if lin(1)+lin(2)+lin(3)+lin(4) >= 8
errordlg('Mais de 7 cartas selecionadas.','ERROR!!!','modal');
elseif lin(1)+lin(2)+lin(3)+lin(4) <= 6
errordlg('Menos de 7 cartas selecionadas.','ERROR!!!','modal');
end
ordem_col = sort(col,'descend');
ordem_lin = sort(lin,'descend');
royal_flush = cartas(1,13)+cartas(1,12)+cartas(1,11)+cartas(1,10)+cartas(1,9) ==
5 || ...
cartas(2,13)+cartas(2,12)+cartas(2,11)+cartas(2,10)+cartas(2,9) ==
5 || ...
cartas(3,13)+cartas(3,12)+cartas(3,11)+cartas(3,10)+cartas(3,9) ==
5 || ...
cartas(4,13)+cartas(4,12)+cartas(4,11)+cartas(4,10)+cartas(4,9) ==
5;
straight_flush = cartas(1,12)+cartas(1,11)+cartas(1,10)+cartas(1,9)+cartas(1,8)
== 5 || ...
cartas(2,12)+cartas(2,11)+cartas(2,10)+cartas(2,9)+cartas(2,8)
== 5 || ...
cartas(3,12)+cartas(3,11)+cartas(3,10)+cartas(3,9)+cartas(3,8)
== 5 || ...
cartas(4,12)+cartas(4,11)+cartas(4,10)+cartas(4,9)+cartas(4,8)
== 5 || ... %
cartas(1,11)+cartas(1,10)+cartas(1,9)+cartas(1,8)+cartas(1,7) ==
5 || ...
cartas(2,11)+cartas(2,10)+cartas(2,9)+cartas(2,8)+cartas(2,7) ==
5 || ...
cartas(3,11)+cartas(3,10)+cartas(3,9)+cartas(3,8)+cartas(3,7) ==
5 || ...
cartas(4,11)+cartas(4,10)+cartas(4,9)+cartas(4,8)+cartas(4,7) ==
5 || ... %
cartas(1,10)+cartas(1,9)+cartas(1,8)+cartas(1,7)+cartas(1,6) ==
5 || ...
cartas(2,10)+cartas(2,9)+cartas(2,8)+cartas(2,7)+cartas(2,6) ==
5 || ...
cartas(3,10)+cartas(3,9)+cartas(3,8)+cartas(3,7)+cartas(3,6) ==
5 || ...
cartas(4,10)+cartas(4,9)+cartas(4,8)+cartas(4,7)+cartas(4,6) ==
5 || ... %
cartas(1,9)+cartas(1,8)+cartas(1,7)+cartas(1,6)+cartas(1,5) == 5
|| ...
22

cartas(2,9)+cartas(2,8)+cartas(2,7)+cartas(2,6)+cartas(2,5) == 5
|| ...
cartas(3,9)+cartas(3,8)+cartas(3,7)+cartas(3,6)+cartas(3,5) == 5
|| ...
cartas(4,9)+cartas(4,8)+cartas(4,7)+cartas(4,6)+cartas(4,5) == 5
|| ... %
cartas(1,8)+cartas(1,7)+cartas(1,6)+cartas(1,5)+cartas(1,4) == 5
|| ...
cartas(2,8)+cartas(2,7)+cartas(2,6)+cartas(2,5)+cartas(2,4) == 5
|| ...
cartas(3,8)+cartas(3,7)+cartas(3,6)+cartas(3,5)+cartas(3,4) == 5
|| ...
cartas(4,8)+cartas(4,7)+cartas(4,6)+cartas(4,5)+cartas(4,4) == 5
|| ... %
cartas(1,7)+cartas(1,6)+cartas(1,5)+cartas(1,4)+cartas(1,3) == 5
|| ...
cartas(2,7)+cartas(2,6)+cartas(2,5)+cartas(2,4)+cartas(2,3) == 5
|| ...
cartas(3,7)+cartas(3,6)+cartas(3,5)+cartas(3,4)+cartas(3,3) == 5
|| ...
cartas(4,7)+cartas(4,6)+cartas(4,5)+cartas(4,4)+cartas(4,3) == 5
|| ... %
cartas(1,6)+cartas(1,5)+cartas(1,4)+cartas(1,3)+cartas(1,2) == 5
|| ...
cartas(2,6)+cartas(2,5)+cartas(2,4)+cartas(2,3)+cartas(2,2) == 5
|| ...
cartas(3,6)+cartas(3,5)+cartas(3,4)+cartas(3,3)+cartas(3,2) == 5
|| ...
cartas(4,6)+cartas(4,5)+cartas(4,4)+cartas(4,3)+cartas(4,2) == 5
|| ... %
cartas(1,5)+cartas(1,4)+cartas(1,3)+cartas(1,2)+cartas(1,1) == 5
|| ...
cartas(2,5)+cartas(2,4)+cartas(2,3)+cartas(2,2)+cartas(2,1) == 5
|| ...
cartas(3,5)+cartas(3,4)+cartas(3,3)+cartas(3,2)+cartas(3,1) == 5
|| ...
cartas(4,5)+cartas(4,4)+cartas(4,3)+cartas(4,2)+cartas(4,1) == 5
|| ... %
cartas(1,4)+cartas(1,3)+cartas(1,2)+cartas(1,1)+cartas(1,13) ==
5 || ...
cartas(2,4)+cartas(2,3)+cartas(2,2)+cartas(2,1)+cartas(2,13) ==
5 || ...
cartas(3,4)+cartas(3,3)+cartas(3,2)+cartas(3,1)+cartas(3,13) ==
5 || ...
cartas(4,4)+cartas(4,3)+cartas(4,2)+cartas(4,1)+cartas(4,13) ==
5;
quadra = ordem_col(1) == 4;
full_house = (ordem_col(1)+ordem_col(2)) >= 5;
flush = ((ordem_lin(1) >= 5) && (royal_flush ~= 1 || straight_flush ~= 1));
straight = ((ordem_lin(1) < 5) && ((col(13)==1 && col(12)==1 && col(11)== 1 &&
col(10)== 1 && col(9) == 1) || ...
(col(12)==1 && col(11)==1 && col(10)== 1 && col(9)== 1 && col(8) ==
1) || ...
(col(11)==1 && col(10)==1 && col(9)== 1 && col(8)== 1 && col(7) == 1)
|| ...
(col(10)==1 && col(9)==1 && col(8)== 1 && col(7)== 1 && col(6) == 1)
|| ...
(col(9)==1 && col(8)==1 && col(7)== 1 && col(6)== 1 && col(5) == 1)
|| ...
23

(col(8)==1 && col(7)==1 && col(6)== 1 && col(5)== 1 && col(4) == 1)


|| ...
(col(7)==1 && col(6)==1 && col(5)== 1 && col(4)== 1 && col(3) == 1)
|| ...
(col(6)==1 && col(5)==1 && col(4)== 1 && col(3)== 1 && col(2) == 1)
|| ...
(col(5)==1 && col(4)==1 && col(3)== 1 && col(2)== 1 && col(1) == 1)
|| ...
(col(4)==1 && col(3)==1 && col(2)== 1 && col(1)== 1 && col(13) ==
1)));
trinca = ordem_col(1) == 3;
dois_pares = (ordem_col(1) == 2) && (ordem_col(2) == 2);
um_par_maior_6 = col(13) == 2 || col(12) == 2 || col(11) == 2 || col(10) == 2 ||
...
col(9) == 2 || col(8) == 2 || col(7) == 2 || col(6) == 2;
um_par_menor_7 = col(5) == 2 || col(4) == 2 || col(3) == 2 || col(2) == 2 ||
col(1) == 2;
% restante uma carta alta
if royal_flush == 1
FM = 5;
jogo = 'Royal Flush';
elseif straight_flush == 1
FM = 5;
jogo = 'Straight Flush';
elseif quadra == 1
FM = 5;
jogo = 'Quadra';
elseif full_house == 1
FM = 4;
jogo = 'Full House';
elseif flush == 1
FM = 3;
jogo = 'Flush';
elseif straight == 1
FM = 3;
jogo = 'Straight';
elseif trinca == 1
FM = 2;
jogo = 'Trinca';
elseif dois_pares == 1
FM = 2;
jogo = '2 Pares';
elseif um_par_maior_6 == 1
FM = 1;
jogo = '1 Par Maior que 6';
elseif um_par_menor_7 == 1
FM = 1;
jogo = '1 Par Menor que 7';
else
FM = 1;
jogo = 'Nada Bom';
end
%%%%% FIM DO RIVER %%%%%
end
end

function [nb] = divide(stack,blind )


%Divide stack / blind
24

nblinds = stack/blind;
if nblinds >= 10
nb = 1;
elseif (4<nblinds)&&(nblinds<10)
nb = 2;
else
nb = 3;
end
divide = nb;
end
3.

GERADOR DE JOGADA RANDMICO

% JOGADOR ALEATRIO
clc;
A = 10*rand(1);
if A >= 20/3
acao = 'Fold'
elseif (A<(20/3) && A>(10/3))
acao = 'Call/Check'
else
acao = 'Bet/Raise'
end

25

Potrebbero piacerti anche