Tutorial TKInter Python (GUI) Parte 5

RESUMEN INTERFAZ GRÁFICA
V PARTE
5 Noviembre del 2010

Autor: Grupo 50, Segundo Semestre 2010 (Sede San Carlos)

21. EJEMPLO DE INTERFAZ GRÁFICA CON UN JUEGO GATO (TRES EN LINEA)

Para este ejemplo se creó un gato, en el que juegan dos jugadores. Cuando un jugador hace 3 líneas seguidas gana el juego.

Se utilizan algunos de los elementos explicados en los tutoriales anteriores:

- Uso del IDE PyScripter
- Módulo Tkinter
- Evento objetografico.after(milisegundos,función)
- Método objetografico.grid(row=i,column=j)
- Método lambda para asignar más de un evento a un botón
- Control de Flujo
- Uso de ventana.withdraw() para ocultar ventanas
- Uso de ventana.deiconify() para mostrar ventanas
- Uso de listas para almacenar información de manera temporal
- Abastracción y aprovechamiento del lenguaje para declarar variables por medio de tuplas ()
- Uso de la codificación utf-8 para evitar problemas con caracteres tales como tildes, eñes, entre otros
- Propiedades y atributos de las ventanas como resizable para evitar que se pueda redimencionar, o title para colocar
 título a esta
- Uso de font para cambiar el tamaño de la letra de un control de tipo Label

Ejemplo 33

http://i.imgur.com/syRp9.jpg
Para la elaboración de este proyecto se tomaron en cuenta aspectos de movimientos. Si un
 espacio del gato ya fue usado no se puede volver a usar.

Si todos los espacios del gato están llenos y nadie hizo un tres en linea se termina el juego.

Si hay un tres en línea se avisa cuál jugador en específico ganó la partida y se reinician las
 casillas, así como la lista donde se guarda la información. La lista contiene 9 ceros que
 corresponden a cada casilla. Si juega el jugador 1, el espacio en la lista donde jugó se
 transforma en un 1 o en un 2, dependiendo del turno del jugador.

La primera vez el jugador que inicia es el azul. La segunda vez, inicia el jugador que haya
 ganado la partida anterior, si ninguno ganó, entonces el turno es para el jugador que hizo la
 penúltima jugada en el juego anterior.

Los jugadores hacen click en cada casilla, transformando el color de esta para identificarle.
# -*- coding: utf-8 -*-
from Tkinter import *
v0=Tk()
v0.title("Gato")
v0.resizable(0,0)

color,nl,matriz,ganador=["red"],[],[0,0,0,0,0,0,0,0,0],[0]

def imprimir(t): print t
def doit(f): v0.after(100,f) # Evento por tiempo

# Crea un gato
def gato():
    ind=0
    c1,c2=0,0
    while ind < 9:
        nl.append(Button(v0,text="",width=10,height=5,bg="white"))
        nl[ind].grid(row=c2,column=c1)
        ind+=1
        if c1==2: c1,c2=0,c2+1
        else: c1+=1
    nl[0].config(command=lambda: jugar(0)), nl[1].config(command=lambda: jugar(1))
    nl[2].config(command=lambda: jugar(2)), nl[3].config(command=lambda: jugar(3))
    nl[4].config(command=lambda: jugar(4)), nl[5].config(command=lambda: jugar(5))
    nl[6].config(command=lambda: jugar(6)), nl[7].config(command=lambda: jugar(7))
    nl[8].config(command=lambda: jugar(8))

def juego_finalizado(): # Revisa si el gato está lleno. Si lo está devuelve True
    ind,largo=0,len(matriz)
    while ind < largo:
        if matriz[ind] == 0:
            return False
            break
        ind+=1
    return True

def tres_linea(lista):
    if matriz[lista[0]] != 0 and matriz[lista[1]] != 0 and matriz[lista[2]] != 0:
        if matriz[lista[0]] == matriz[lista[1]] == matriz[lista[2]]:
            ganador[0]=matriz[lista[0]]
            return True
    return False

def gana():
    if tres_linea([0,1,2]) or tres_linea([3,4,5]) or tres_linea([6,7,8]) or tres_linea([0,3,6]) or tres_linea([1,4,7]) or tres_linea([2,5,8]) or tres_linea([0,4,8]) or tres_linea([2,4,6]):
        return True

def limpiar_botones():
    color="white"
    ind,largo=0,len(nl)
    while ind < largo:
        nl[ind].config(bg=color)
        ind+=1
    matriz[0],matriz[1],matriz[2],matriz[3],matriz[4],matriz[5],matriz[6],matriz[7],matriz[8]=0,0,0,0,0,0,0,0,0

def declarar_ganador():
    v0.after(200,declarar_ganador)
    if gana():
        limpiar_botones()
        v0.withdraw()
        v1=Toplevel(v0)
        if ganador[0] == 1:
            l1=Label(v1,text="Ganador: Jugador 1 (Azul)",font=(16))
            color[0]="red"
        if ganador[0] == 2:
            l1=Label(v1,text="Ganador: Jugador 2 (Rojo)",font=(16))
            color[0]="blue"
        l1.pack()
        b1=Button(v1,text="OK",command=lambda: v1.withdraw() or v0.deiconify(),font=(16))
        b1.pack()
        v1.focus_force()

def reiniciar_juego():
    v0.after(200,reiniciar_juego)
    if juego_finalizado():
        v0.withdraw()
        v1=Toplevel(v0)
        v1.title("Finalizado")
        v1.resizable(0,0)
        l1=Label(v1,text="Nadie Ganó.",font=(16))
        l1.pack()
        b1=Button(v1,text="OK",command=lambda: v1.withdraw() or v0.deiconify(),font=(16))
        b1.pack()
        doit(limpiar_botones())

def jugar(posicion):
    if matriz[posicion] != 0:
        print "Ya se jugó en esta posición"
    else:
        if color[0]=="red":
            matriz[posicion]=1
            color[0]="blue"
            nl[posicion].config(bg=color)
        elif color[0]=="blue":
            matriz[posicion]=2
            color[0]="red"
            nl[posicion].config(bg=color)
        print "ESTADO DE LA MATRIZ:",matriz

gato()
declarar_ganador()
reiniciar_juego()
v0.mainloop()

No hay comentarios:

Publicar un comentario

gmendezm
Portada
Lista Principal