jueves, 14 de septiembre de 2017

Juego del Gato con librería Tkinter

#-*- coding: utf-8 -*-
from Tkinter import *
import tkMessageBox     # Libreria para crear ventanas de diálogo
import tkSimpleDialog   # Libreria para crear ventanas de diálogo


# Variables globales.
ventanaPrincipal = Tk()
nombreJugador1 = ""                 # Variable que contendrá el nombre de un jugador.
nombreJugador2 = ""                 # Variable que contendrá el nombre de un jugador.
listaBotones = []                   # Lista/arreglo que almacenará cada uno de los botones del tablero de juego.
casillas = []                       # Lista/arreglo que almacenará la elección de cada jugador.
etiquetaTurnoJugador = StringVar()  # Declara una variable Tkinter(), de tipo cadena para mostrar el nombre del jugador.
numeroJugador = 0                   # Variable para cambiar entre jugador según el turno correspondiente.


# Función para configurar el diseño de la ventana principal y sus elementos.
def tablero():
    # Configuración de la ventana.
    ventanaPrincipal.title("Juego del gato")    # Título de la ventana
    ventanaPrincipal.geometry("370x460")        # Medidas de la ventana

    # Etiqueta en la que se muestra el nombre del jugador según sea su turno proporcionado por la variable turnoJugador
    etiquetaTurno = Label(ventanaPrincipal, textvariable=etiquetaTurnoJugador, font='bold 16')
    etiquetaTurno.place(x=130, y=10)    # Coordenadas de posición en la ventana.

    # Botón de inicio del juego que ejecuta a la función iniciarJuego()
    botonIniciar = Button(ventanaPrincipal, bg='blue', fg='white', text='Iniciar juego', cursor="sizing", width=15, height=3, command=lambda: iniciarJuego())
    botonIniciar.place(x=130, y=380)    # Coordenadas de posición en la ventana.

    # Lineas que dividen el tablero.
    linea1 = Canvas(ventanaPrincipal, width=310, height=10)
    linea1.place(x=30, y=140)           # Coordenadas de posición en la ventana.
    linea1.create_line(310, 0, 0, 0, width=25, fill='black')

    linea2 = Canvas(ventanaPrincipal, width=310, height=10)
    linea2.place(x=30, y=240)           # Coordenadas de posición en la ventana.
    linea2.create_line(310, 0, 0, 0, width=25, fill='black')

    linea3 = Canvas(ventanaPrincipal, width=10, height=310)
    linea3.place(x=130, y=45)           # Coordenadas de posición en la ventana.
    linea3.create_line(0, 310, 0, 0, width=25, fill='black')

    linea4 = Canvas(ventanaPrincipal, width=10, height=310)
    linea4.place(x=230, y=45)           # Coordenadas de posición en la ventana.
    linea4.create_line(0, 310, 0, 0, width=25, fill='black')

    # Botones del tablero de juego que ejecutan la función selección() enviando un número que hace referencia a su posición.
    boton0 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(0))
    listaBotones.append(boton0) # El botón se almacena en la lista de botones.
    boton0.place(x=50, y=70)    # Coordenadas de posición en la ventana.

    boton1 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(1))
    listaBotones.append(boton1)  # El botón se almacena en la lista de botones.
    boton1.place(x=150, y=70)    # Coordenadas de posición en la ventana.

    boton2 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(2))
    listaBotones.append(boton2)  # El botón se almacena en la lista de botones.
    boton2.place(x=250, y=70)    # Coordenadas de posición en la ventana.

    boton3 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(3))
    listaBotones.append(boton3)  # El botón se almacena en la lista de botones.
    boton3.place(x=50, y=170)    # Coordenadas de posición en la ventana.

    boton4 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(4))
    listaBotones.append(boton4)  # El botón se almacena en la lista de botones.
    boton4.place(x=150, y=170)   # Coordenadas de posición en la ventana.

    boton5 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(5))
    listaBotones.append(boton5)  # El botón se almacena en la lista de botones.
    boton5.place(x=250, y=170)   # Coordenadas de posición en la ventana.

    boton6 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(6))
    listaBotones.append(boton6)  # El botón se almacena en la lista de botones.
    boton6.place(x=50, y=270)    # Coordenadas de posición en la ventana.

    boton7 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(7))
    listaBotones.append(boton7)  # El botón se almacena en la lista de botones.
    boton7.place(x=150, y=270)   # Coordenadas de posición en la ventana.

    boton8 = Button(ventanaPrincipal, width=9, height=3, relief=SOLID, cursor="pencil", command=lambda: selecion(8))
    listaBotones.append(boton8)  # El botón se almacena en la lista de botones.
    boton8.place(x=250, y=270)  # Coordenadas de posición en la ventana.

    # Se llena la lista -> casillas = [] con la letra "N" para que la lista tenga un tamaño de 9 elementos.
    for i in range(0, 9):       # Ciclo en el que se le asignan valores a la variable "i" en un rango de 0 a 8.
        casillas.append("N")    # Se almacena la letra N en la posición i de la lista/arreglo.


# Función para bloquear todos los botones del tablero según sea necesario.
def bloquearInicio():
    for i in range(0, 9):                           # Ciclo en el que se le asignan valores a la variable "i" en un rango de 0 a 8.
        listaBotones[i].config(state="disable")     # Se inhabilita el botón en la posición i de la lista/arreglo.


# Función para iniciar la ejecución del juego.
def iniciarJuego():
    for i in range(0, 9):                           # Ciclo en el que se le asignan valores a la variable "i" en un rango de 0 a 8.
        listaBotones[i].config(state="normal")      # Se habilita el botón en la posición i de la lista/arreglo.
        listaBotones[i].config(bg="lightgray")      # Se le asigna un nuevo fondo al botón.
        listaBotones[i].config(text="")             # Se le asigna una cadena de texto vacía al botón para limpiar cualquier texto anterior.
        casillas[i] = "N"                           # Para no tener que reiniciar la ventana al volver a precionar el botón Iniciar juego.
    print casillas

    global nombreJugador1, nombreJugador2           # Se llama a las variables globales a las que vamos a acceder.

    # Lanza una ventana de diálogo en la que se puede ingresar una cadena de texto, la cual se va almacenar en la variable.
    # Se le envía como parametro el título de la ventana y un mensaje para mostrar.
    nombreJugador1 = tkSimpleDialog.askstring("Jugador", "Escribe el nombre del jugador 1: ")
    nombreJugador2 = tkSimpleDialog.askstring("Jugador", "Escribe el nombre del jugador 2: ")

    # Comprobamos que no se hayan ingresado datos sin tipo a las variables de los nombres o cadenas vacías
    # Si se cumple la condición anterior se concatena el contenido de nombreJugador1 a la etiqueta que muestra los turnos.
    if ((nombreJugador1 and nombreJugador2) is not None) and ((nombreJugador1 and nombreJugador2)!=""):
        etiquetaTurnoJugador.set("Turno: " + nombreJugador1)
    else:
    #Si no se cumple la condición aparece una ventana informando el error, y se bloquea el inicio del juego.
        tkMessageBox.showwarning("Error", "Favor de llenar correctamente los nombres de usuario.")
        bloquearInicio()


# Función que slecciona y marca el botón (casilla) deacuerdo al turno y al jugador, recibiendo como parámetro el número del botón.
def selecion(numero):
    global numeroJugador, nombreJugador1, nombreJugador2    # Se llama a las variables globales a las que vamos a acceder

    if numeroJugador == 0:                                  # Se verifica que la casilla contenga N y que sea el turno del jugador 0.
        listaBotones[numero].config(text="X")               # Coloca X en el botón.
        listaBotones[numero].config(bg="white")             # Cambia el fondo del botón.
        casillas[numero] = "X"                              # Se almacena X en la lista casillas = []
        numeroJugador = 1                                   # Cambia el turno del jugador.
        etiquetaTurnoJugador.set("Turno: " + nombreJugador2)# La etiqueta cambia y muestra el nombre del otro jugador.
        print casillas

    elif casillas[numero] == "N" and numeroJugador == 1:    # Se verifica que la casilla contenga N y que sea el turno del jugador 1.
        listaBotones[numero].config(text="O")               # Coloca O en el botón.
        listaBotones[numero].config(bg="lightblue")         # Cambia el fondo del botón.
        casillas[numero] = "O"                              # Se almacena O en la lista casillas = []
        numeroJugador = 0                                   # Cambia el turno del jugador.
        etiquetaTurnoJugador.set("Turno: " + nombreJugador1)# La etiqueta cambia y muestra el nombre del otro jugador.
        print casillas

    listaBotones[numero].config(state="disable")            # El botón seleccionado de acuerdo a su número (parámetro enviado) se desactiva.

    verificarVictoria()                                     # Se llama a la función verificarVictoria() al finalizar la selección en cada turno.


# Función que ejecuta las condiciones de victoria.
def verificarVictoria():
    # Verificación de victoria horizontal para el numeroJugador = 0 (1).
    if (casillas[0] == "X" and casillas[1] == "X" and casillas[2] == "X") or (
        casillas[3] == "X" and casillas[4] == "X" and casillas[5] == "X") or (
        casillas[6] == "X" and casillas[7] == "X" and casillas[8] == "X"):
        bloquearInicio()  # Bloquemos las botones.
        # Mostramos ventana de victoria con nombreJugador1.
        tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador1)

    # Verificación de victoria vertical para el numeroJugador = 0 (1).
    elif (casillas[0] == "X" and casillas[3] == "X" and casillas[6] == "X") or (
          casillas[1] == "X" and casillas[4] == "X" and casillas[7] == "X") or (
          casillas[2] == "X" and casillas[5] == "X" and casillas[8] == "X"):
          bloquearInicio() # Bloquemos las botones.
          # Mostramos ventana de victoria con nombreJugador1.
          tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador1)

    # Verificación de victoria diagonal para el numeroJugador = 0 (1).
    elif (casillas[0] == "X" and casillas[4] == "X" and casillas[8] == "X") or (
          casillas[2] == "X" and casillas[4] == "X" and casillas[6] == "X"):
        bloquearInicio()  # Bloquemos las botones.
        # Mostramos ventana de victoria con nombreJugador1.
        tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador1)

    # Verificación de victoria horizontal para el numeroJugador = 1 (2).
    elif (casillas[0] == "O" and casillas[1] == "O" and casillas[2] == "O") or (
          casillas[3] == "O" and casillas[4] == "O" and casillas[5] == "O") or (
          casillas[6] == "O" and casillas[7] == "O" and casillas[8] == "O"):
          bloquearInicio()  # Bloquemos las botones.
          # Mostramos ventana de victoria con nombreJugador2.
          tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador2)

    # Verificación de victoria vertical para el numeroJugador = 1 (2).
    elif (casillas[0] == "O" and casillas[3] == "O" and casillas[6] == "O") or (
          casillas[1] == "O" and casillas[4] == "O" and casillas[7] == "O") or (
          casillas[2] == "O" and casillas[5] == "O" and casillas[8] == "O"):
          bloquearInicio()  # Bloquemos las botones.
          # Mostramos ventana de victoria con nombreJugador2.
          tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador2)

    # Verificación de victoria diagonal para el numeroJugador = 1 (2).
    elif (casillas[0] == "O" and casillas[4] == "O" and casillas[8] == "O") or (
          casillas[2] == "O" and casillas[4] == "O" and casillas[6] == "O"):
          bloquearInicio()  # Bloquemos las botones.
          # Mostramos ventana de victoria con nombreJugador2.
          tkMessageBox.showinfo("Ganaste", "Ganaste jugador: " + nombreJugador2)

    # Si todas las condiciones anteriores no se cumplen y todas las casillas han sido seleccionadas
    # muestra una ventana de diálogo indicando el empate.
    elif (casillas[0] != "N" and casillas[1] != "N" and casillas[2] != "N" and
          casillas[3] != "N" and casillas[4] != "N" and casillas[5] != "N" and
          casillas[6] != "N" and casillas[7] != "N" and casillas[8] != "N"):
          bloquearInicio()  # Bloquemos las botones.
          # Mostramos ventana de empate con los nombres de los jugadores.
          tkMessageBox.showinfo("Empate", "Los jugadores: " + nombreJugador1 + " y " + nombreJugador2 + " han empatado.")



tablero()                   # Se ejecuta la función tablero para crear todos los elementos de la ventana de juego.
bloquearInicio()            # Bloqueamos los botones.
ventanaPrincipal.mainloop() # Se ejecuta la ventana principal.


No hay comentarios:

Publicar un comentario