Enero 24, 2018, 01:52:46 am

Autor Tema: Buscaminas con Tkinter  (Leído 3047 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado hanlly

  • Yo vivo en CPH
  • ***
  • Mensajes: 505
    • Ver Perfil
Buscaminas con Tkinter
« en: Diciembre 24, 2013, 10:17:16 am »
Hola!!!

Los que conocemos Tkinter sabemos que no es la mejor librería para hacer juegos... pero... creo que me funcionó bien para hacer este pequeño juego: Buscaminas

Aquí el código... :)
Código: (Python) You are not allowed to view links. Register or Login
#coding: utf-8

############################
#                          #
#      BUSCAMINAS V1.0     #
#    por Hanlly Batista    #
#       24/13/2013         #
#                          #
############################

import threading
from Tkinter import *
from random import randint
from time import time

fuente=("lucida console", 12, "normal")

class explotar_celdas(threading.Thread):
def __init__(self, tablero, x, y):
threading.Thread.__init__(self)
self.tablero=tablero
self.x=x
self.y=y
self.start()

def run(self):
try:
x1=self.x-1   # izquierda
x2=self.x     # central
x3=self.x+1   # derecha
y1=self.y-1   # superior
y2=self.y     # central
y3=self.y+1   # inferior

coords=[
(x1,y1),  (x2,y1),  (x3,y1), ##
(x1,y2),            (x3,y2),  #coordenadas de las celdas alrededor
(x1,y3),  (x2,y3),  (x3,y3), ##
]
for x,y in coords: #para cada X y Y en cada coordenada
if 0<=x<self.tablero.config["celdasx"] and 0<=y<self.tablero.config["celdasy"]: #si esta dentro del tablero
cell=self.tablero.celdas["%s,%s"%(x,y)]
if not cell.mostrada:
cell.show() #mostramos la celda
except:
pass

class Celda(Canvas):

def __init__(self, tablero, x, y):
self.tablero=tablero
Canvas.__init__(self, tablero, bd=3, relief=RIDGE)
self.isMina=False
self.alrededor=0
self.marcada=False
self.x=x
self.y=y
self.mostrada=False
self.config(height=self.tablero.config["altura_celda"], width=self.tablero.config["anchura_celda"], bg="lightblue")
self.bind("<ButtonPress-1>", self.pulsar1)
self.bind("<ButtonRelease-1>", self.soltar1)
self.bind("<ButtonPress-3>", self.pulsar2)
self.bind("<ButtonRelease-3>", self.soltar2)
self.text_items=[]

def pulsar1(self, ev):
if not self.marcada and self.tablero.jugando:
self.config(bg="blue")

def soltar1(self, ev):
if not self.marcada and self.tablero.jugando:
self.config(bg="lightblue")
if self.inside(ev): #Si se suelta el clic dentro de la celda
self.show(True) #se muestra su valor
else:
if self.mostrada:
self.config(bg="gray")

def pulsar2(self, ev):
if not self.mostrada and self.tablero.jugando:
if not self.marcada:
self.config(bg="darkgreen")
else:
self.config(bg="lightblue")

def soltar2(self, ev):
if self.tablero.jugando:
if self.inside(ev):
if self.marcada:
self.config(bg="lightblue")
self.marcada=False
else:
self.marcada=True
else:
if self.marcada:
self.config(bg="darkgreen")
self.marcada=True
elif not self.mostrada:
self.marcada=False
self.config(bg="lightblue")

def show(self, click=False):
if not self.marcada:
self.config(bg="gray")
self.mostrada=True
if self.isMina and click:
self.tablero.perder()
elif self.alrededor>0:
self.texto(str(self.alrededor))
else: #mostrar alrededor...
explotar_celdas(self.tablero, self.x, self.y)
self.tablero.clicks+=1
self.tablero.comprobar()

def texto(self, texto):
h=self.winfo_height()
w=self.winfo_width()
coords=(w/2, h/2)
item=self.create_text(coords, text=texto, font=self.tablero.config["fuente_mina"])
self.text_items.append(item)

def inside(self, ev):
h=self.winfo_height()
w=self.winfo_width()
return ev.x<=w and ev.y<=h
class Tablero(Canvas):
def __init__(self, ventana):
self.ventana=ventana
Canvas.__init__(self, ventana)
self.celdas={}
self.config={}
self.clicks=0

def generar(self):
if self.celdas and not self.config["repetir"]:
for key in self.celdas:
self.celdas[key].destroy()
self.celdas={}
for x in range(self.config["celdasx"]):
for y in range(self.config["celdasy"]):
if self.config["repetir"]:

c=self.celdas["%s,%s"%(x,y)]
c.mostrada=False
c.marcada=False
c.config(bg="lightblue")
while c.text_items:
c.delete(c.text_items.pop(0)) #quitamos el texto
else:
c=Celda(self, x, y)
c.grid(column=x,row=y)
self.celdas["%s,%s"%(x,y)]=c
if not self.config["repetir"]:
self.generar_minas()
self.establecer_numeros()

def generar_minas(self):
listado_minas=[]
for mina in range(self.config["cantidad"]):
while True:
x=randint(0,self.config["celdasx"]-1) #coordenada aleatoria dentro de los limites del tablero
y=randint(0,self.config["celdasy"]-1) # (el -1 es porque va de 0 a n-1)
if not (x,y) in listado_minas:
listado_minas.append((x,y)) #agregamos coordenada para que no se repita
self.celdas["%s,%s"%(x,y)].isMina=True
break

def establecer_numeros(self):
for key in self.celdas:
cell=self.celdas[key]
if cell.isMina:

x1=cell.x-1    ## izquierda
x2=cell.x     # central
x3=cell.x+1     # derecha
    #
y1=cell.y-1     # superior
y2=cell.y     # central
y3=cell.y+1    ## inferior

coords=[
(x1,y1),  (x2,y1),  (x3,y1), ##
(x1,y2),            (x3,y2),  #coordenadas de las celdas alrededor
(x1,y3),  (x2,y3),  (x3,y3), ##
]

for x,y in coords: #para cada X y Y en cada coordenada
if 0<=x<self.config["celdasx"] and 0<=y<self.config["celdasy"]: #si esta dentro del tablero
self.celdas["%s,%s"%(x,y)].alrededor+=1 #aumentamos el numero de celda que hay alrededor

def perder(self):
for key in self.celdas:
cell=self.celdas[key]
if cell.isMina and not cell.marcada:
cell.config(bg="darkred")
continue
if cell.marcada and not cell.isMina: #se marcó sin ser mina.
cell.texto("X")

self.ventana.terminar(False)

def comprobar(self):
if len([1 for key in self.celdas if not self.celdas[key].mostrada])==self.config["cantidad"]:
self.ventana.terminar(True)

class ventana(Frame):
def __init__(self, master):
self.master=master
Frame.__init__(self, master)
self.tablero=Tablero(self)
self.generar_frame_inicio()
self.frame_inicio.pack()
self.top=None

def generar_frame_inicio(self):
self.frame_inicio=Frame(self)

#Configuración de tamaño
f=Frame(self.frame_inicio)
f.pack(anchor="nw")
self.var_ancho=StringVar()
self.var_ancho.set("15")
self.var_ancho.trace("w", self.set_alto)
self.var_alto=StringVar()
self.var_alto.set("15")

Label(f, text="Tamaño del tablero", font=fuente).pack(side=LEFT)
Entry(f, textvariable=self.var_ancho, width=4, font=fuente).pack(side=LEFT)
Label(f, text="x", font=fuente).pack(side=LEFT)
Entry(f, textvariable=self.var_alto , width=4, font=fuente).pack(side=LEFT)

#Cantidad de minas
f=Frame(self.frame_inicio)
f.pack(anchor="nw")
self.cantidad_minas=StringVar()
self.cantidad_minas.set(15)
self.cantidad_minas.trace("w", self.verif_cant_minas)

Label(f, text="Cantidad de Minas ", font=fuente).pack(side=LEFT)
Entry(f, textvariable=self.cantidad_minas, width=4, font=fuente).pack(side=LEFT)

#boton aceptar...

Button(self.frame_inicio, text="¡Empezar!", font=fuente, command=self.empezar_juego).pack()

def empezar_juego(self, repetir=False):
if self.top:
self.top.destroy()
self.top=None
ancho=self.var_ancho.get()
alto=self.var_alto.get()
minas=self.cantidad_minas.get()

try:
ancho = int(ancho)
alto = int(alto)
minas = int(minas)
except:
error("Error... -_-\nLas entradas deben ser NUMEROS enteros...")
return

config_tablero={
"celdasx":ancho,
"celdasy":alto,
"cantidad":minas,
"altura_celda":20,
"anchura_celda":20,
"fuente_mina":("lucida console", 18, "normal"),
"repetir":repetir
}
self.frame_inicio.forget()
self.tablero.config=config_tablero
self.tablero.clicks=0
self.tablero.jugando=True
self.tablero.inicio=time()
self.tablero.generar()
self.tablero.pack()

def set_alto(self, a, b, c):
try:
num=int(self.var_ancho.get())
if num>40:
error("Demasiadas celdas\nla ejecución sería lenta. Cuidado.")

self.var_alto.set(num)
except:
if self.var_ancho.get():
error("Las entradas deben ser numéricas")
self.var_ancho.set(self.var_ancho.get()[:-1])

def verif_alto(self, a, b, c):
try:
num=int(self.var_alto.get())
except:
if self.var_alto.get():
error("Las entradas deben ser numéricas")
self.var_alto.set(self.var_alto.get()[:-1])

def verif_cant_minas(self, a, b, c):
try:
if int(self.cantidad_minas.get())>int(self.var_ancho.get())*int(self.var_alto.get()):
error("Demasiadas minas...")
self.cantidad_minas.set(self.cantidad_minas.get()[:-1])
except:
if self.cantidad_minas.get():
error("Las entradas deben ser numéricas")

def terminar(self, win=True):
fin=time()
segundos=fin-self.tablero.inicio
self.top=Toplevel(self)
self.tablero.jugando=False
texto="Has Ganado!!! :D\nFelicidades!" if win else "Has Perdido!!! >:D\nWahahahahaha!!!"
texto+="\nDuración: %.2f segundos"%segundos
Label(self.top, text="%s\n¿Desea jugar otra partida?"%texto, font=fuente).pack()
f=Frame(self.top)
f.pack()
Button(f, text="Si", command=self.nuevo_juego, font=fuente).pack(side=LEFT, padx=5, pady=5)
Button(f, text="No", command=self.master.destroy, font=fuente).pack(side=LEFT, padx=5, pady=5)
Button(f, text="Repetir", command=lambda:self.empezar_juego(True), font=fuente).pack(side=LEFT, padx=5, pady=5)

def nuevo_juego(self):
self.top.destroy()
self.top=None
self.tablero.forget()
self.frame_inicio.pack()
def error(msg):
v=Tk()
Label(v, text=msg, font=fuente).pack()
Button(v, text="Aceptar", command=v.destroy).pack()

root=Tk()
ventana(root).pack(expand=1, fill=BOTH)
root.mainloop()


Cualquier duda o sugerencia, las acepto :)
You are not allowed to view links. Register or Login


xx
Tkinter ---> Combobox

Iniciado por JCH00

1 Respuestas
2779 Vistas
Último mensaje Noviembre 17, 2015, 11:16:45 pm
por mou
xx
ayuda con mainloop en tkinter

Iniciado por the_trooper

1 Respuestas
2007 Vistas
Último mensaje Agosto 29, 2009, 02:53:57 pm
por JaAViEr
xx
posts nuevos tkinter

Iniciado por daryo

0 Respuestas
895 Vistas
Último mensaje Marzo 17, 2012, 08:49:22 am
por daryo
xx
[Python] Cliente Ftp Tkinter

Iniciado por runex

5 Respuestas
1774 Vistas
Último mensaje Abril 16, 2012, 07:31:52 pm
por JaAViEr
xx
Bolas saltonas.... en Tkinter

Iniciado por hanlly

0 Respuestas
1518 Vistas
Último mensaje Diciembre 25, 2013, 11:55:41 am
por hanlly
xx
Introduccion a tkinter (Interfaz grafica)

Iniciado por daryo

3 Respuestas
2136 Vistas
Último mensaje Mayo 19, 2012, 10:43:26 pm
por SixP4ck3r
xx
¿Dirección para descargar TKinter?

Iniciado por Jairus

2 Respuestas
2124 Vistas
Último mensaje Agosto 14, 2012, 03:12:27 pm
por Jairus
xx
Buscaminas v0.1

Iniciado por WaesWaes

0 Respuestas
1415 Vistas
Último mensaje Enero 29, 2010, 07:42:40 pm
por WaesWaes
xx
Crear menus profecionales en Tkinter. by Sokoleonardo

Iniciado por Sokoleonardo

0 Respuestas
3208 Vistas
Último mensaje Febrero 22, 2012, 06:42:07 pm
por Sokoleonardo
xx
Crear menus profecionales en Tkinter. by Sokoleonardo

Iniciado por Sokoleonardo

0 Respuestas
1129 Vistas
Último mensaje Febrero 22, 2012, 12:15:39 pm
por Sokoleonardo