Este proyecto implementa un sistema de predicción de jugadas para el juego Piedra, Papel o Tijeras utilizando cadenas de Markov. El sistema analiza el historial de jugadas del usuario para predecir su siguiente movimiento.
El proyecto está organizado en tres archivos principales:
model_rps_computed.py
: Implementa el modelo de cadena de Markovprobabilities_rps_computed.py
: Calcula las probabilidades de transiciónfile_handler.py
: Gestiona el almacenamiento y lectura del historial de jugadas
El modelo utiliza la biblioteca pomegranate
para implementar una cadena de Markov de orden 1. Las características principales son:
-
Representación de jugadas:
- Piedra (Rock) = 0
- Papel (Paper) = 1
- Tijeras (Scissors) = 2
-
El modelo se inicializa con datos de entrenamiento básicos y se actualiza con el historial de jugadas del usuario.
-
Utiliza tensores de PyTorch para el manejo eficiente de los datos.
La clase RPSProbabilityAnalyzer
proporciona métodos para analizar las probabilidades de transición:
transition_probability
: Calcula la probabilidad de transición entre dos jugadasmax_post_action_probability
: Obtiene la máxima probabilidad de transición desde una jugadamost_likely_post_action
: Predice la jugada más probable después de una jugada dadamost_likely_initial_action
: Determina la jugada inicial más probable
El UserActionsFileHandler
maneja la persistencia de datos:
- Almacena el historial de jugadas en un archivo de texto
- Lee el historial para entrenar el modelo
- Maneja la creación del directorio y archivo si no existen
- El sistema se inicializa con datos de entrenamiento básicos
- Se cargan las jugadas históricas del usuario
- El modelo se entrena con estos datos
- Se pueden realizar predicciones sobre:
- La probabilidad de transición entre jugadas
- La jugada más probable después de una jugada específica
- La jugada inicial más probable
analyzer = RPSProbabilityAnalyzer()
# Obtener probabilidad de transición
prob = analyzer.transition_probability(PAPER, PAPER)
# Obtener la jugada más probable después de Papel
next_action = analyzer.most_likely_post_action(PAPER)
# Obtener la probabilidad máxima después de una jugada
max_prob = analyzer.max_post_action_probability(PAPER)
Es necesario el uso del paquete Pomegranate:
Pomegranate is a python package which implements fast, efficient, and extremely flexible probabilistic models ranging from probability distributions to Bayesian networks to mixtures of hidden Markov models.
python -m venv venv
source venv/bin/activate
Instalar la versión estricta de pomegranate v1.0.4
:
pip install -r requirements.txt
o
pip install pomegranate
cd rps
rps% python3 RPS_spock_lizard.py
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 1
Computer picked SCISSORS.
SCISSORS wins PAPER. You lost!
Another round? (y/n): y
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 0
Computer picked ROCK.
User and computer picked ROCK. Draw game!
Another round? (y/n): y
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 1
Computer picked ROCK.
PAPER wins ROCK. You win!
Another round? (y/n): n
['PAPER', 'PAPER', 'ROCK', 'SCISSORS', 'SCISSORS', 'SCISSORS', 'PAPER']
# historico de partidas guardadas en el fichero user_actions_history.txt
[1, 2, 0, 1, 2, 0]
...