Juego: BlackJack



El día de hoy vengo a traerles la primer versión del juego de BlackJack que había desarrollado en la consola de Python, pero ahora con una Interfaz Gráfica mucho más amigable para el Usuario.
Por el momento solo se ha implementado para 1 Jugador, pero en la siguiente actualización, volverá la modalidad de 3 Jugadores.
Pueden probar este juego y comentar sus experiencias, algún fallo en la misma, etc... 
Disfrutenla!

-Si quieres ir a checar el Juego en Consola Da click aqui
-Para descargar todos los archivos necesarios para jugarlo y el archivo .py, Da click aquí

Código:


from Tkinter import *
from PIL import Image,ImageTk
import os
import random
import tkMessageBox
import time
import threading

carpetaraiz=os.path.dirname(__file__)
#print carpetaraiz

DirCartas = carpetaraiz+"/Poker Cards/PNG/"
continuar = 1
#----------------------------Variables Globales-------------------------------
imagendeck = []
allcards = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
allsymbols = ["H","S","C","D"]
labelsarray = []
imagenes = []
indice = 0
#numerocolumna = 1
puntajetotal = 0
contadorposicion = 0
#print DirCartas

#----------Metodo para mostrar imagenes en Pantalla---------------------
def setimagen(nombre,x,y): #carga la imagen
    global imagen #Declaro el uso de una variable global
    img = Image.open(nombre) #cargo la imagen mandada como parametro
    img.thumbnail((x, y), Image.ANTIALIAS) #establezco sus dimensiones y la propiedad antialiasado
    return ImageTk.PhotoImage(img)
    #imagen = ImageTk.PhotoImage(img) #la convierto a un formato soportado por los widgets de tkinter
    #return imagen

def ReiniciarJuego():
    opcion = tkMessageBox.askyesno("Retry?", "Quisieras volver a Intentarlo?")

    if(opcion==True):
        global indice, puntajetotal, contadorposicion, totalmarcador
        del labelsarray[:]
        del imagenes[:]
        indice = 0
        puntajetotal = 0
        contadorposicion = 0
        totalmarcador.config(text = "0")

    else:
        exit()


def TerminarJugada():
    opcion=tkMessageBox.askokcancel("Terminar Jugada", "Si sales ahora perderas el juego...")

    if(opcion==True):
        ReiniciarJuego()

def InicioJuego():
    global TextoBoton, contenedor, numerocolumna, indice, puntajetotal, contadorposicion
    global Botoniniciar, totalmarcador

    Botoniniciar.config(width = 43)
    finishButton = Button(contenedor, text="Terminar", font=("Arial", 10), width=15, command = TerminarJugada)
    finishButton.place(x=567, y=376)

    card = random.choice(allcards)
    palo = random.choice(allsymbols)
    carta = card+palo
    imagenes.append(setimagen(DirCartas+carta+".png", 150, 180))
    labelcartas = Label(framecartas, image = imagenes[indice])
    #labelcartas.grid(row = 1, column = numerocolumna, padx = 10, pady = 10)
    labelcartas.place(x=contadorposicion, y=0)

    contadorposicion+=130
    #numerocolumna+= 1
    indice+=1
    labelsarray.append(labelcartas)

    if(card == "10" or card == "J" or card == "Q" or card == "K"):
        puntajetotal+=10
    elif(card == "A"):
        opcion = tkMessageBox.askquestion("Elija el valor del As", "Quiere que valga 11?\nYes = 11 | No = 1")
        if opcion=="yes":
            puntajetotal+=11
        else:
            puntajetotal+=1

    else:
        puntajetotal+= int(card)

    totalmarcador.config(text = str(puntajetotal))

    if(puntajetotal==21):
        tkMessageBox.showinfo("BLACKJACK!! FELICIDADES!", "Has hecho un BLACKJACK!\nTotal: 21")
        ReiniciarJuego()
    elif(puntajetotal>21):
        tkMessageBox.showerror("HAS PERDIDO!",'Te has pasado! Vuelve a Intentarlo')
        ReiniciarJuego()

#--------------Metodo para mostrar el Marcador al Ingresar el Nombre--------------------
def Marcador(nombre):
    global labelentry, BotonOK, entrynombre, Botoniniciar
    global nombrejugador, TextoBoton, totalmarcador
    #nombrejugador = nombre
    BotonOK.destroy()
    entrynombre.destroy()

    TextoBoton.set("Pedir Carta")
    Botoniniciar = Button(contenedor, textvariable=TextoBoton, font=("Arial", 10), width=45, command = InicioJuego)
    Botoniniciar.place(x=200, y=376)

    framemarcador = Frame(contenedor, bg="grey")
    framemarcador.config(bd=3, relief="ridge")
    framemarcador.place(width=154, height=316, x=18, y=90)

    titulomarcador = Label(framemarcador, text = "Marcador",font = ("Arial",20, "bold"), bg = "grey")
    titulomarcador.grid(row=1, column=1, padx = 10, pady = 10, columnspan=3)

    j1marcador = Label(framemarcador, text = "Jugador 1:", font = ("Arial",10), bg="grey")
    j1marcador.grid(row=2, column=1, sticky = "E")

    nombremarcador = Label(framemarcador, text = nombre, font = ("Arial",10), bg = "grey")
    nombremarcador.grid(row=2, column=2, sticky = "W")

    totallabel = Label(framemarcador, text = "Total:", font = ("Arial",10,"bold"), bg = "grey")
    totallabel.grid(row=3, column = 1, sticky = "E" )

    totalmarcador = Label(framemarcador, text= str(puntajetotal), font=("Arial", 10, "bold"), bg="grey")
    totalmarcador.grid(row=3, column=2, sticky="W")

    # Creacion de un Hilo para que tenga un minimo retraso entre cambio de texto
    #hilo=threading.Thread(target=mensaje, args=("Buenas, Jugadores, Vamos a empezar la Partida de BlackJack",))
    #hilo.start()
    labelentry.config(text = "Buenas, Jugadores, Vamos a empezar la Partida de BlackJack")
#----------------Metodo que contiene la funcionalidad del Hilo------------------------------
"""def mensaje(msg):
        global labelentry
        time.sleep(3)
        labelentry.config(text=msg)"""

#--------Metodo para mostrar la baraja y los componentes para Ingresar el nombre----------
def IniciarComponentes():
    global contenedor, nombrejugador, labelentry, TextoBoton
    global entrynombre, BotonOK

    DeckDir = carpetaraiz + "/Poker Cards/Images/Deck.png"
    imagendeck.append(setimagen(DeckDir,180,230))
    Decklabel = Label(contenedor, image = imagendeck[0])
    Decklabel.place(x=275,y=120)

    labelentry = Label(contenedor, text = "Ingrese el nombre del Jugador: ", font = ("Arial",10))
    labelentry.place(x=200, y=350)
    nombre = StringVar()
    entrynombre = Entry(contenedor, textvariable = nombre)
    entrynombre.place(x=200, y=380)
    entrynombre.config(width = 40, font = ("Arial",10))
    nombrejugador.set(nombre.get())
    print nombrejugador.get()

    TextoBoton = StringVar()
    TextoBoton.set("OK")
    BotonOK = Button(contenedor, textvariable = TextoBoton, font = ("Arial", 10), width = 10)
    BotonOK.place(x=489, y=376)
    #if(nombrejugador.get()!=""):
    BotonOK.config(command = lambda :Marcador(str(nombre.get())))

#----------------------Creacion de Ventana------------------------
ventana = Tk()
ventana.title("BlackJack Game v 0.1")
ventana.config(bg="grey")
ventana.iconbitmap(carpetaraiz+"\Poker Cards\Images\Poker Icon 1.ico")
contenedor = Frame(ventana, width = 720, height = 640)
contenedor.pack(fill = "y", expand = True)
"""bgimagen = Image.open(carpetaraiz + "/Poker Cards/Images/Poker Table (1).png")
ph = ImageTk.PhotoImage(bgimagen)
background_image = Label(contenedor, image = ph)
background_image.place(x=0,y=0)"""

framecartas = Frame(contenedor)
framecartas.place(width=680, height=210, x=18, y=417)
#framecartas.config(bd=3, relief="ridge")

Etitulo =Label(contenedor,text="BlackJack", font=("Arial",40,"bold"))
Etitulo.place(x=235,y=20)

BotonStart = Button(contenedor, text = "Start Game", font = ("Arial", 10), width = 30, bg = "grey",command=IniciarComponentes)
BotonStart.place(x=240, y=90)

nombrejugador= StringVar()
nombrejugador.set("")
#----------------------Metodo para saber las cordenadas de la pantalla haciendo un Click--------
def getorigin(eventorigin):
    global x0,y0
    x0 = eventorigin.x
    y0 = eventorigin.y
    print(x0,y0)
#mouseclick event
contenedor.bind("<Button 1>",getorigin)


ventana.mainloop()


Comments