Contiene los UnitTest desarrollados para el proyecto. Utiliza la
librería CPPUnitTestFramework
que viene incluida con Visual Studio Code.
Los test se estructuran de la siguiente manera:
TEST_CLASS
: Todos los test que se encuentran bajo un mismoTEST_CLASS
corresponden a tests para una misma clase de C++.TEST_METHOD
: CadaTEST_METHOD
contiene los test de una funcionalidad en particular de una clase de C++.
Contiene la implementación de las distintas Clases implementadas en el proyecto. Una vista de alto nivel de la mayoría de las Clases implementadas se puede ver en el siguiente diagrama.
Los rectángulos rojos corresponden a partes del código en el que se pudo realizar alguna paralelización para volver el código más rápido. A continuación se presenta una breve descripción de las Clases implementadas y sus métodos más importantes.
Suit
yValue
: Estas no son Clases. Corresponden aenum class
que se utilizan para representar la pinta y valor de las cartas en el juego de Texas Hold'em.Card
: Esta no es una Clase. Es untypedef
para unstd::pair
que contiene contiene unSuit
y unValue
. Representa una de las 52 cartas posibles en el juego de Texas Hold'em. Hay funciones que utilizanCard
en elnamespace
CardEvaluation
, que se utilizan para compararCard
.Deck
: Es una Clase que representa un mazo de cartas en el juego de Texas Hold'em. Siempre tiene 52 cartas que representan las 52 cartas en una baraja inglesa. Contiene el métodoreset()
para reiniciar el mazo después de una partida (devuelve todas las cartas al mazo y las baraja), y el métododrawCard()
para sacar la siguiente carta del mazo.Agent
: Es una Clase Abstracta que representa un agente que toma una decisión en una partida de Texas Hold'em. Sumado a la Clase Abstracta, se incluyenRandomAgent
(toma decisiones aleatorias),LinearAgent
(utiliza un vector linear para tomar la decisión) eInputAgent
(una persona puede usar la línea de comando para poder tomar las decisiones). LosAgent
tienen un métodomakeDecision()
que toma la decisión dada un estado del juego.Player
: Es una Clase que representa un jugador en una partida de Texas Hold'em. ElPlayer
tiene unAgent
que toma las decisiones por el jugador. Además el jugador tiene unHand
que corresponden a las dos cartas en su mano en Texas Hold'em. ElPlayer
tiene métodosaddCardToHand()
para agregar una carta a su mano,resetHand()
para borrar las cartas de su mano cuando termina una ronda,getHand()
para ver las cartas de su mano,decide()
para tomar una decisión a partir del agente que tiene, entre otros.TexasHoldem
: Es una Clase que contiene la lógica del juego de TexasHold'em. La clase contiene punteros a losPlayer
que están jugadno el juego, una referencia alDeck
que se está utilizando, lleva la cuenta del dinero apostado y el estado del juego, entre otros. La Clase tiene métodosaddPlayer()
para agregar un jugador a la partida,playRound()
para jugar una ronda,playMultipleRounds()
para jugar múltiples rondas, además de métodos privados comodetermineWinner()
que permite determinar el ganador de una ronda yevaluateHand()
que permite evaluar el valor de una mano.Individual
: Representa un individuo del Algoritmo Genético. Tiene un puntero a un jugador que está jugando la partida de Texas Hold'em. Lleva cuenta del puntaje que tiene el individuo en el juego y actualizaciones para el Algoritmo. Tiene métodos comocrossOver()
que realiza crossover con otro individuo,mutateStrategyElementByIndexVector()
con lo que hace mutación,beginPlaying()
yendPlaying()
que le permite empezar y terminar de jugar una partida respectivamente.GeneticAlgorithm
: Contiene la lógica para el Algoritmo Genético. Contiene un vector de individuos que corresponde a los individuos de la generación actual. Contiene métodos comotrainOneEpoch()
para entrenar una época del Algoritmo Genético,getCurrentIndividuals()
para traer a los individuos de la generación actual, yevaluate()
,crossover()
,mutate()
,selectBest()
para las operaciones del Algoritmo Genético.
Para entrenar el Algoritmo Genético basta con correr el archivo main.cpp
,
lo cual entrena el Algoritmo Genético durante 100 generaciones, y guarda los
individuos finales (además de cada 10 generaciones).