jueves, 14 de septiembre de 2017

Juego del gato

from Tkinter import *
""" Se utiliza para mandar alertas al usuario mediante una caja de texto """
import tkMessageBox
from SimpleDialog import SimpleDialog
""" Son cajas con las cuales nosotros podemos pedir por ejemplo los nombres del jugador dentro del programa para
hacerlo un poco mas interactivo """
import tkSimpleDialog

def bloquear():
    """ con este for ya estamos bloqueando los botones """
    for i in range (0,9):
        listaBotones[i].config(state="disable")
     
def iniciarJ():
    """ Necesitamos desbloquear los botones """
    for i in range (0,9):
        listaBotones[i].config(state="normal")
        listaBotones[i].config(bg="blue")
        listaBotones[i].config(text="")
        tablero[i] = "N"
     
    """ La palabra global nos sirve para definir que estamos utilizando una variable global y no una local, el tksimpledialog
    nos sirve para mostrar unas cajas de texto, que es una de las importaciones que estamos utilizando mas arriba """
    global nombreJugador1,nombreJugador2
    nombreJugador1 = tkSimpleDialog.askstring("Jugador","Escribe el nombre del jugador 1: ")
    nombreJugador2 = tkSimpleDialog.askstring("Jugador","Escribe el nombre del jugador 2: ")
 
    """ Aqui vamos a poner el turno del jugador """
    turnoJugador.set("Turno: "+nombreJugador1)
 
def cambiar(num):
    global turno,nombreJugador1,nombreJugador2
    if tablero[num]=="N" and turno==0:
        listaBotones[num].config(text="X")
        listaBotones[num].config(bg="white")
        tablero[num] = "X"
        turno = 1
        turnoJugador.set("Turno jugador: "+nombreJugador1)
    elif tablero[num] == "N" and turno == 1:
        listaBotones[num].config(text="O")
        listaBotones[num].config(bg="lightblue")
        tablero[num] = "O"
        turno = 0
        turnoJugador.set("Turno jugador: "+ nombreJugador2)
    listaBotones[num].config(state="disable")
    verificar()
 
""" Esta funcion se utiliza para verificar que jugador gano """  
def verificar():
    if (tablero[0]=="X" and tablero[1]=="X" and tablero[2]=="X") or (tablero[3]=="X" and tablero[4]=="X" and tablero[5]=="X") or (tablero[6]=="X" and tablero[7]=="X" and tablero[8]=="X"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador1)
 
    elif (tablero[0]=="X" and tablero[3]=="X" and tablero[6]=="X") or (tablero[1]=="X" and tablero[4]=="X" and tablero[7]=="X") or (tablero[2]=="X" and tablero[5]=="X" and tablero[8]=="X"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador1)  
 
    elif (tablero[0]=="X" and tablero[4]=="X" and tablero[8]=="X") or (tablero[2]=="X" and tablero[4]=="X" and tablero[6]=="X"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador1)


    elif (tablero[0]=="O" and tablero[1]=="O" and tablero[2]=="O") or (tablero[3]=="O" and tablero[4]=="O" and tablero[5]=="O") or (tablero[6]=="O" and tablero[7]=="O" and tablero[8]=="O"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador2)
 
    elif (tablero[0]=="O" and tablero[3]=="O" and tablero[6]=="O") or (tablero[1]=="O" and tablero[4]=="O" and tablero[7]=="O") or (tablero[2]=="O" and tablero[5]=="O" and tablero[8]=="O"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador2)  
 
    elif (tablero[0]=="O" and tablero[4]=="O" and tablero[8]=="O") or (tablero[2]=="O" and tablero[4]=="O" and tablero[6]=="O"):
        bloquear()
        tkMessageBox.showinfo("Ganador", "Ganaste jugador "+nombreJugador2)
     
""" Empezamos creando nuestra ventana (ventana es igual a un nuevo constructor de Tkinter)  """
Ventana=Tk()
""" Empezamos a configuar las cosas basicas como la geometria """
Ventana.geometry("400x500")
Ventana.title("Juego de gato")
Ventana.config(bg="white")
""" Se va a manejar una variable turno que sera de tipo entero y nos dira el turno del jugador en caso de que sea turno
del jugador 1 o 2 """
turno = 0
""" Queremos hacer un juego interactivo por lo tanto vamos a pedir los nombres de los jugadores """
nombreJugador1 = ""
nombreJugador2 = ""

""" Ahora vamos a declarar una lista de botones para crear el tablero """
listaBotones = []

""" Necesitamos llevar un control interno del tablero por lo que hay que crear una lista del tablero donde
internamente manejamos donde hay una X, una O o donde no hay nada """
tablero = []

""" Por ultimo haremos una etiqueta donde nos diga que jugador esta actuando, declaramos un stringvar que pueda estar
cambiando el nombre del jugador """
turnoJugador=StringVar()

""" Si el tablero no tienen nada adentro le asignamos tres valor X, O u N """
for i in range (0,9):
    """ estamos agregando al tablero una N para saber que no hay nada ahi al principio """
    tablero.append("N")
 
""" Despues de esto empezamos a generar cada uno de los botones """
""" Boton0 es igual a un nuevo boton que estara dentro de la ventana que tiene un ancho y un alto y despues
lleva el comando de la funcion que queremos mandar llamar """
boton0 = Button(Ventana, width=9, height=3,command=lambda: cambiar(0))

""" la lista de botones va a agregar al boton0 para que despues lo podamos modificar en el momento que nosotros
queseemos """
listaBotones.append(boton0)

""" Le damos una localizacion al boton """
boton0.place(x=50,y=50)

"""" Creamos todos los botones """
boton1 = Button(Ventana, width=9, height=3,command=lambda: cambiar(1))
listaBotones.append(boton1)
boton1.place(x=150,y=50)

boton2 = Button(Ventana, width=9, height=3,command=lambda: cambiar(2))
listaBotones.append(boton2)
boton2.place(x=250,y=50)

boton3 = Button(Ventana, width=9, height=3,command=lambda: cambiar(3))
listaBotones.append(boton3)
boton3.place(x=50,y=150)

boton4 = Button(Ventana, width=9, height=3,command=lambda: cambiar(4))
listaBotones.append(boton4)
boton4.place(x=150,y=150)

boton5 = Button(Ventana, width=9, height=3,command=lambda: cambiar(5))
listaBotones.append(boton5)
boton5.place(x=250,y=150)

boton6 = Button(Ventana, width=9, height=3,command=lambda: cambiar(6))
listaBotones.append(boton6)
boton6.place(x=50,y=250)

boton7 = Button(Ventana, width=9, height=3,command=lambda: cambiar(7))
listaBotones.append(boton7)
boton7.place(x=150,y=250)

boton8 = Button(Ventana, width=9, height=3,command=lambda: cambiar(8))
listaBotones.append(boton8)
boton8.place(x=250,y=250)

""" Ahora vaos a deshabilitar los botones para que no se les pueda dar click antes de iniciar el juego y despues
anyadir otro boton para iniciar el juego, se anyadira tambien la etiqueta del jugador """

turnoEtiqueta = Label(Ventana,textvariable=turnoJugador).place(x=100,y=20)
iniciar = Button(Ventana,bg='blue',fg='white',text='Iniciar juego',width=15,height=3,command=iniciarJ).place(x=130,y=350)

""" Ahora vamos a crear la funcion bloquear """
bloquear()
print(tablero)
Ventana.mainloop()

""" Al momento de nosotros utilizar la funcion command=cambiar en los botones hay un error de logica porque al momento
de dar click en iniciar se mandan los numeros que esta mandando cada boton y ya no pasa nada mas, para solucionar esto
se usa una funcion llamada lambda que son funciones anonimas de una sola linea, como lambda no recibe parametros
entonces no se manda a llamar automaticamente al momento de iniciar la ventana, pero al darle click lamba lo que tiene
adentro manda a llamar la funcion cambiar en este caso y asi se truquea el error """

No hay comentarios:

Publicar un comentario