#-*- 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.
jueves, 14 de septiembre de 2017
Juego del Gato con librería Tkinter
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario