PROYECTO FINAL

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

ESTRUCTURA DE LA PRESENTACIÓN

MOTIVACIÓN

 Y OBJETIVO

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.

¿Qué es el Blackjack?

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.

Desarrollo del juego

  • El crupier reparte dos cartas visibles a cada jugador. El valor del As es 11 o 1, las figuras valen 10, y las cartas numéricas su valor natural. El valor del As puede cambiarse según la necesidad de no pasarse de 21.

 

  • Si al jugador le sale un As junto con una carta de valor 10, obtiene blackjack, ganando la apuesta salvo que el crupier obtenga también blackjack.

 

 

Fuente: REGLAS DEL BLACKJACK. Recuperado de: http://es.blackjack.org/reglas-del-blackjack/​

Desarrollo del juego

  • Al terminar de repartir las dos primeras cartas a cada jugador, el crupier pondrá luego su primera carta boca arriba de manera que sea visible para el resto de jugadores.

 

  • Cada jugador tiene la posibilidad de plantarse y quedarse con cualquier puntuación, o de pedir más cartas hasta alcanzar los 21 puntos.

 

  • Si al pedir una nueva carta se pasa de 21, pierde automáticamente la apuesta y sus cartas y apuesta serán retiradas por el crupier.

 

  • Cuando todos los jugadores hayan pedido sus cartas, el crupier mostrará su segunda carta y sacará más cartas de la baraja si fuera necesario hasta sumar 17 o más puntos, momento en el que se plantará.

ESTRATEGIAS DE JUEGO

SISTEMAS PARA EL CONTEO DE CARTAS

Conteo de Cartas Altas-Bajas

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/​

Conteo de Cartas P.21

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%

DESARROLLO DEL ALGORITMO

SUSTENTACIÓN

# 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("")

CONCLUSIONES

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).

GRACIAS POR SU ATENCIÓN

[Blackjack] Proyecto Final para Matemáticas Discretas UIS

By Iván Castillo

[Blackjack] Proyecto Final para Matemáticas Discretas UIS

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. Se desarrollaron métodos para calcular las probabilidades de obtener una buena "mano" durante el juego y así, aumentar el número de victorias |2017. Presentación por Iván Castillo. UIS. Bucaramanga, Colombia.

  • 912