AUTOMATIZACIÓN DEL JUEGO DE BLACKJACK
PROFESOR:
Ph.D. FABIO MARTINEZ
ESTUDIANTES:
IVÁN CASTILLO
JAVIER CHACÓN
DIEGO POVEDA
JEFERSSON DOMINGUEZ
MATEMÁTICAS DISCRETAS
El juego es un tipo de modelo matemático para entender la toma de decisión y la interacción entre quienes toman las decisiones.
La teoría de juegos es un área de la matemática aplicada que utiliza modelos para estudiar interacciones en estructuras formalizadas de incentivos (los llamados «juegos»). La teoría de juegos se ha convertido en una herramienta sumamente importante que ha contribuido a comprender más adecuadamente la conducta humana frente a la toma de decisiones.
En este proyecto se aplica la temática de números pseudo-aleatorios, probabilidad y conteo en un juego de azar. Detrás del BlackJack, existen diversos métodos matemáticos y de habilidad mental para jugar de manera profesional. Por tal razón, decidimos automatizarlo utilizando estos temas vistos en la materia de Matemáticas Discretas. Finalmente, se desarrollaron métodos para calcular las probabilidades de obtener una buena "mano" durante el juego y así, aumentar el número de victorias.
El Blackjack, también llamado veintiuno, es un juego de cartas, propio de los casinos con una o más barajas (mazos) inglesas de 52 cartas sin los comodines, que consiste en sumar un valor lo más próximo a 21 pero sin pasarse.
Fuente: REGLAS DEL BLACKJACK. Recuperado de: http://es.blackjack.org/reglas-del-blackjack/
High-Low: Este método de Conteo de Cartas en el Blackjack le permite al jugador conocer cuáles cartas quedan (a grandes rasgos) en la baraja: cartas Altas o cartas Bajas.
Cuando se encuentre a mitad de una baraja, si el valor de la cuenta es alto, significa que quedan más figuras y ases (10) en relación a la cantidad de cartas bajas. Esto representa una ventaja para el jugador. Si el valor es bajo, quedan más cartas bajas en la baraja, por lo general dándole ventaja al crupier.
Fuente: Conteo de Cartas Altas-Bajas. Recuperado de: http://es.blackjack.org/blackjack-estrategia/hi-lo-count/
Se basa en encontrar la cantidad de probabilidades (en término porcentual) de la carta que se necesita para completar la suma total de 21 ó Blackjack. El cálculo se efectúa sobre la base de las cartas jugadas (las cartas que se muestran) a partir de un momento determinado. La formula es la siguiente:
El número total de combinaciones para cada una de las dos cartas es: Para el juego de un mazo de cartas C(52,2) = 1.326 y para el juego de seis mazos de cartas C(312,2) = 48.516
nx = cantidad de cartas "x-favorable" en juego.
nv = total de cartas mostradas.
m = cantidad de mazos en juego.
Fuente: ROBABILITY GUIDE TO GAMBLING. Recuperado de: http://probability.infarom.ro/blackjack.html
EJEMPLO DE APLICACIÓN DE LA FORMULA Y PROBABILIDADES
Se juega con un mazo y solo un jugador.
La mano del jugador: Q,2,4,A (valor total 17).
La carta visible distribuidor es un 4.
1. Probabilidad de lograr 21 puntos (recibiendo un 4).
Se tiene nx = 2, nv = 5
2. Probabilidad de lograr 20 puntos (recibiendo un 3). Se tiene nx = 0, nv = 5
3. Probabilidad de lograr 19 puntos (recibiendo un 2). Se tiene nx = 1, nv = 5
* Probabilidad de lograr 19, 20 ó 21 puntos. Se suma las probabilidades anteriores:
P = 9/47 = 19.14893%
# Algoritmo de automatización del juego de Blackjack.
# Iván Castillo, Diego Póveda, Javier Chacón & Jeferson Domínguez.
# Proyecto para: Matemáticas Discretas - UIS I. SEMESTRE 2017
# Profesor: Fabio Martinez
#definicion de cartas
As = 11
Dos = 2
Tres = 3
Cuatro = 4
Cinco = 5
Seis = 6
Siete = 7
Ocho = 8
Nueve = 9
Diez = 10
Jack = 10
Queen = 10
King = 10
#creacion del maso de cartas, tengan en cuenta que los "palos" de las cartas no importan, solo el valor
deck1 = [As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King,
As, Dos, Tres, Cuatro, Cinco, Seis, Siete, Ocho, Nueve, Diez, Jack, Queen, King]
#aqui se "bate" el maso de cartas con la libreria random y el metodo shuffle()
import random
random.shuffle(deck1)
print(deck1)
count = 0 #esta es la variable que realiza el conteo de cartas en cada mano.
#definicion de los jugadores
class player():
cards = [] #las cartas se definen como una lista
#constructor
def _init_(self, name, crupier):
self.name = name
self.crupier = crupier #esto es si el jugador es de la casa o no, osea el dealer, (true o false)
#se crean los jugadores
player1 = player(); player1.name = "Javier"; player1.crupier = False; player1.cards = []
player2 = player(); player2.name = "Nicolas"; player2.crupier = False; player2.cards = []
player3 = player(); player3.name = "Miguel"; player3.crupier = False; player3.cards = []
player4 = player(); player4.name = "Diego"; player4.crupier = False; player4.cards = []
player5 = player(); player5.name = "Camila"; player5.crupier = False; player5.cards = []
player6 = player(); player6.name = "Daniela"; player6.crupier = False; player6.cards = []
player7 = player(); player7.name = "Roberto"; player7.crupier = True; player7.cards = []
#fase1 de la partida: repartiendo cartas y contandolas como 1 o -1
player1.cards.append(deck1.pop())
if(player1.cards[0] < 7):
count += 1
elif(player1.cards[0] > 9):
count -= 1
player2.cards.append(deck1.pop())
if(player2.cards[0] < 7):
count += 1
elif(player2.cards[0] > 9):
count -= 1
player3.cards.append(deck1.pop())
if(player3.cards[0] < 7):
count += 1
elif(player3.cards[0] > 9):
count -= 1
player4.cards.append(deck1.pop())
if(player4.cards[0] < 7):
count += 1
elif(player4.cards[0] > 9):
count -= 1
player5.cards.append(deck1.pop())
if(player5.cards[0] < 7):
count += 1
elif(player5.cards[0] > 9):
count -= 1
player6.cards.append(deck1.pop())
if(player6.cards[0] < 7):
count += 1
elif(player6.cards[0] > 9):
count -= 1
player7.cards.append(deck1.pop()) #esta al principio no se cuenta, porque va boca abajo en el juego
#luego se cuenta cuando se revela mas adelante
player1.cards.append(deck1.pop())
if(player1.cards[1] < 7):
count += 1
elif(player1.cards[1] > 9):
count -= 1
player2.cards.append(deck1.pop())
if(player2.cards[1] < 7):
count += 1
elif(player2.cards[1] > 9):
count -= 1
player3.cards.append(deck1.pop())
if(player3.cards[1] < 7):
count += 1
elif(player3.cards[1] > 9):
count -= 1
player4.cards.append(deck1.pop())
if(player4.cards[1] < 7):
count += 1
elif(player4.cards[1] > 9):
count -= 1
player5.cards.append(deck1.pop())
if(player5.cards[1] < 7):
count += 1
elif(player5.cards[1] > 9):
count -= 1
player6.cards.append(deck1.pop())
if(player6.cards[1] < 7):
count += 1
elif(player6.cards[1] > 9):
count -= 1
player7.cards.append(deck1.pop())
if(player7.cards[1] < 7):
count += 1
elif(player7.cards[1] > 9):
count -= 1
#Probabilidades para ganar (Sistema P21)
mano1 = player1.cards[0]+player1.cards[1]
mano2 = player2.cards[0]+player2.cards[1]
mano3 = player3.cards[0]+player3.cards[1]
mano4 = player4.cards[0]+player4.cards[1]
mano5 = player5.cards[0]+player5.cards[1]
mano6 = player6.cards[0]+player6.cards[1]
mano7 = player7.cards[0]+player7.cards[1]
falta1 = 21-mano1
falta2 = 21-mano2
falta3 = 21-mano3
falta4 = 21-mano4
falta5 = 21-mano5
falta6 = 21-mano6
def nx(falta):
nx=0;
for i in [0,1]:
if(falta==player1.cards[i]):
nx+=1
for i in [0,1]:
if(falta==player2.cards[i]):
nx+=1
for i in [0,1]:
if(falta==player3.cards[i]):
nx+=1
for i in [0,1]:
if(falta==player4.cards[i]):
nx+=1
for i in [0,1]:
if(falta==player5.cards[i]):
nx+=1
for i in [0,1]:
if(falta==player6.cards[i]):
nx+=1
for i in [0]:
if(falta==player7.cards[i]):
nx+=1
return nx
#Para la probabilidad, se verifica que las cartas que tienen los participantes
#No sean 10, de lo contrario se usará otro calculo de probabilidad.
#Para ello, tambien se asume que estamos jugando con 6 mazos, juntos todos en 1 deck.
nv = 13;
#El valor nv siempre será 13, ya que son el total de cartas que están siendo mostradas. 2 de cada uno de los 6
#participantes, y la que muestra el dealer.
def probabilidad(falta):
if(falta==10):
return ((96-nx(falta))/(312-nv))
else:
return ((24-nx(falta))/(312-nv))
probabilidad1=probabilidad(falta1)*100
probabilidad2=probabilidad(falta2)*100
probabilidad3=probabilidad(falta3)*100
probabilidad4=probabilidad(falta4)*100
probabilidad5=probabilidad(falta5)*100
probabilidad6=probabilidad(falta6)*100
print(player1.name, " tiene una probabilidad de ", probabilidad1, "% de sacar la carta que necesita")
print(player2.name, " tiene una probabilidad de ", probabilidad2, "% de sacar la carta que necesita")
print(player3.name, " tiene una probabilidad de ", probabilidad3, "% de sacar la carta que necesita")
print(player4.name, " tiene una probabilidad de ", probabilidad4, "% de sacar la carta que necesita")
print(player5.name, " tiene una probabilidad de ", probabilidad5, "% de sacar la carta que necesita")
print(player6.name, " tiene una probabilidad de ", probabilidad6, "% de sacar la carta que necesita")
#ahora se calculan las respectivas sumas de las cartas de cada jugador para ver que numero tienen
#en base a esto cada jugador pide o no otra carta
print("*******************COMIENZA EL JUEGO!*******************"); print(""); print("")
sum1 = player1.cards[0] + player1.cards[1]
if((player1.cards[0] == 11 and player1.cards[1] == 10)or(player1.cards[0] == 10 and player1.cards[1] == 11)):
print(player1.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum1 < 12):
print(player1.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player1.cards.append(card)
sum1 = sum1 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player1.name, ": me quedo con esta mano:... ", sum1); print("")
print("Siguiente Jugador...: "); print("")
sum2 = player2.cards[0] + player2.cards[1]
if((player2.cards[0] == 11 and player2.cards[1] == 10)or(player2.cards[0] == 10 and player2.cards[1] == 11)):
print(player2.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum2 < 12):
print(player2.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player2.cards.append(card)
sum2 = sum2 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player2.name, ": me quedo con esta mano:... ", sum2); print("")
print("Siguiente Jugador...: "); print("")
sum3 = player3.cards[0] + player3.cards[1]
if((player3.cards[0] == 11 and player3.cards[1] == 10)or(player3.cards[0] == 10 and player3.cards[1] == 11)):
print(player3.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum3 < 12):
print(player3.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player3.cards.append(card)
sum3 = sum3 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player3.name, ": me quedo con esta mano:... ", sum3); print("")
print("Siguiente Jugador...: "); print("")
sum4 = player4.cards[0] + player4.cards[1]
if((player4.cards[0] == 11 and player4.cards[1] == 10)or(player4.cards[0] == 10 and player4.cards[1] == 11)):
print(player4.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum4 < 12):
print(player4.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player4.cards.append(card)
sum4 = sum4 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player4.name, ": me quedo con esta mano:... ", sum4); print("")
print("Siguiente Jugador...: "); print("")
sum5 = player5.cards[0] + player5.cards[1]
if((player5.cards[0] == 11 and player5.cards[1] == 10)or(player5.cards[0] == 10 and player5.cards[1] == 11)):
print(player5.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum5 < 12):
print(player5.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player5.cards.append(card)
sum5 = sum5 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player5.name, ": me quedo con esta mano:... ", sum5); print("")
print("Siguiente Jugador...: "); print("")
sum6 = player6.cards[0] + player6.cards[1]
if((player6.cards[0] == 11 and player6.cards[1] == 10)or(player6.cards[0] == 10 and player6.cards[1] == 11)):
print(player6.name, ": TENGO BLACKJACK!!..."); print("")
else:
while(sum6 < 12):
print(player6.name, ": Dame otra carta porfavor Crupier... "); print("")
card = deck1.pop(0)
player6.cards.append(card)
sum6 = sum6 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print(player6.name, ": me quedo con esta mano:... ", sum6); print(""); print(""); print("")
print("Ok es el turno de la casa:... "); print("")
# aqui el Dealer revela su carta boca abajo y ve qeu suma tiene, si es menor a alguna de las sumas de los jugadores
#el dealer sigue tomando cartas hasta ganarle al puntaje mas alto de los jugadores
hidenCard = player7.cards[0]
if(hidenCard < 7):
count += 1
elif(hidenCard > 9):
count -= 1
sum7 = player7.cards[0] + player7.cards[1]
while(sum7 < sum1 or sum7 < sum2 or sum7 < sum3 or sum7 < sum4 or sum7 < sum5 or sum7 < sum6):
card = deck1.pop(0)
player7.cards.append(card)
sum7 = sum7 + card
if(card < 7):
count += 1
elif(card > 9):
count -= 1
print("La mano de la casa es:...", sum7)
#fase final, cada jugador ve si gano o perdio
if(sum1 > 21):
print(player1.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player1.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum1 == sum7):
print(player1.name, ": Ha sido un empate..."); print("")
elif(sum1 < sum7 and sum7 <= 21):
print(player1.name, ": rayos perdi..."); print("")
if(sum2 > 21):
print(player2.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player2.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum2 == sum7):
print(player2.name, ": Ha sido un empate..."); print("")
elif(sum2 < sum7 and sum7 <= 21):
print(player2.name, ": rayos perdi..."); print("")
if(sum3 > 21):
print(player3.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player3.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum3 == sum7):
print(player3.name, ": Ha sido un empate..."); print("")
elif(sum3 < sum7 and sum7 <= 21):
print(player3.name, ": rayos perdi..."); print("")
if(sum4 > 21):
print(player4.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player4.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum4 == sum7):
print(player4.name, ": Ha sido un empate..."); print("")
elif(sum4 < sum7 and sum7 <= 21):
print(player4.name, ": rayos perdi..."); print("")
if(sum5 > 21):
print(player5.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player5.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum5 == sum7):
print(player5.name, ": Ha sido un empate..."); print("")
elif(sum5 < sum7 and sum7 <= 21):
print(player5.name, ": rayos perdi..."); print("")
if(sum6 > 21):
print(player6.name, ": rayos perdi..."); print("")
elif(sum7 > 21):
print(player6.name, ": POLLO PARA LA CENA!!... GANE!!"); print("")
elif(sum6 == sum7):
print(player6.name, ": Ha sido un empate..."); print("")
elif(sum6 < sum7 and sum7 <= 21):
print(player6.name, ": rayos perdi..."); print("")
#SISTEMA DE CONTEO - HI/LO
countB = 0
countM = 0
countA = 0
for i in range (len(deck1)):
if(deck1[i] < 7):
countB += 1
elif(deck1[i] >= 7 and deck1[i] <= 9):
countM += 1
else:
countA += 1
print("contador de Bajas: ", countB)
print("contador de Medias: ", countM)
print("contador de Altas: ", countA)
#SISTEMA DE CONTEO P21
countT = countB + countM + countA
print("")
print("El porcentaje de CARTAS BAJAS es: ", countB/countT*100, " %"); print("")
print("El porcentaje de CARTAS MEDIAS es: ", countM/countT*100, " %"); print("")
print("El porcentaje de CARTAS ALTAS es: ", countA/countT*100, " %"); print("")
1. La facilidad para aprenderlo y jugarlo ha hecho que el blackjack sea cada vez más popular y atractivo para jugadores de todo el mundo. No se trata de un juego únicamente de azar, la estrategia del jugador juega un papel muy importante en cada partida.
2. La importancia que tiene el uso de la probabilidad (técnicas de conteo), no solo en en el aprendizaje, sino también en la aplicación de diversos dinamismos que se realizan en la vida diaria con actividades de ocio.
3. Una observación detallada del juego (Blackjack) simulado puede conducir a un mejor entendimiento de este y por consiguiente, la implementación de estrategias que mejoren la operación y eficiencia en la resolución de problemas en específico (Sistemas de conteo).