13-03-2018, 04:34 PM
Hola,
os pongo un ejemplo de como dibujar un tablero de ajedrez con esta libreria.
utiliza un validador de jugadas y control de la partida, el cual no lo pongo. Si estais interesados en estos temas os lo paso.
Bueno... a lo que vamos. Os pongo el programita:
el hilo lo he puesto aqui, porque no usa gui alguna.
espero que os sirva la idea.
saludos.
Edito:
Pongo el enlace para descargar el ejemplo completo funcionando. Está escrito a vuelapluma en un par de horas, pero funciona. Explicaciones en el fichero LEEME.txt
Ejemplo uso Pillow
os pongo un ejemplo de como dibujar un tablero de ajedrez con esta libreria.
utiliza un validador de jugadas y control de la partida, el cual no lo pongo. Si estais interesados en estos temas os lo paso.
Bueno... a lo que vamos. Os pongo el programita:
Código:
# Python 3.6.1
from PIL import Image
# libreria que valida las jugadas y tablero interno
import pyajedrez.pyAjedrez_v3 as aje
piezas_png = {
'b' : "imagenes/piezas/Merida60/bb.png", #alfil negro
'k' : "imagenes/piezas/Merida60/bk.png", #rey negro
'n' : "imagenes/piezas/Merida60/bn.png", #caballo negro
'p' : "imagenes/piezas/Merida60/bp.png", #peon negro
'q' : "imagenes/piezas/Merida60/bq.png", #dama negra
'r' : "imagenes/piezas/Merida60/br.png", #torre negra
'B' : "imagenes/piezas/Merida60/wb.png", #alfil blanco
'K' : "imagenes/piezas/Merida60/wk.png", #rey blanco
'N' : "imagenes/piezas/Merida60/wn.png", #caballo blanco
'P' : "imagenes/piezas/Merida60/wp.png", #peon blanco
'Q' : "imagenes/piezas/Merida60/wq.png", #dama blanca
'R' : "imagenes/piezas/Merida60/wr.png", #torre blanca
'False' : "imagenes/piezas/Merida60/clear.png" #casilla transparente
}
escaques_png = {
'negro' : "imagenes/piezas/Merida60/dark.png", # casilla negra
'blanco': "imagenes/piezas/Merida60/light.png" # casilla blanca
}
TAMANO_ESCAQUE = 40
TAMANO_PIEZA = int(TAMANO_ESCAQUE * 0.90) # el 90% de la casilla
# instanciamos la clase ajedrez
partida = aje.Ajedrez()
# para ajustar las imagenes
ajusta = Image.ANTIALIAS
def alterna_color_casilla(color_actual):
if color_actual == escaques_png['negro']:
return escaques_png['blanco']
else:
return escaques_png['negro']
def crea_tablero(jugada = None, tam_casilla = TAMANO_ESCAQUE, tam_pieza = TAMANO_PIEZA):
img_fondo = Image.new("RGBA", (tam_casilla * 8, tam_casilla * 8), (255, 255, 255))
dicc_piezas = partida.toArray()
# tiene el formato:
# dicc_piezas = {'a8': 'r', 'b8' : False, 'c4' : 'N', etc...}
# creamos el tablero, casillas y puezas
color_casilla = escaques_png['negro']
#coords. para pegar las casillas y piezas
tabula_fila = 0
tabula_columna = 0
for fila in range(8,0,-1):
# empezamos por la casilla sup. izq. que es blanca
color_casilla = alterna_color_casilla(color_casilla)
for columna in range(ord('a'), ord('i')):
nombre_casilla = chr(columna) + str(fila)
img = Image.open(color_casilla)
img_casilla = img.resize((tam_casilla*8, tam_casilla*8), ajusta)
# para centrar la pieza sobre cada casilla
ancho_x, alto_y = img.size
offset = ((ancho_x - alto_y) // 2, (ancho_x - alto_y) // 2)
# buscamos la pieza que hay en nombre_casilla
pieza = dicc_piezas[nombre_casilla]
if not pieza : #si la casilla esta vacia, esto es False
pieza = 'False'
# las piezas son transparentes: se añade el convert
img_pieza = Image.open(piezas_png[pieza]).convert("RGBA")
img_pieza = img_pieza.resize((tam_pieza, tam_pieza))
img_casilla.paste(img_pieza, offset, img_pieza)
img_fondo.paste(img_casilla, (tabula_columna, tabula_fila))
tabula_columna = tabula_columna + tam_casilla
color_casilla = alterna_color_casilla(color_casilla)
tabula_columna = 0
tabula_fila = tabula_fila + tam_casilla
img_fondo.show()
def inicia_grafico():
#print(partida.toArray()) es el tablero en forma de diccionario
# empezamos dibujando el tablero de inicio
crea_tablero()
# hacemos una jugada
jugada = partida.moveSAN('e4')
crea_tablero()
if __name__ == "__main__":
inicia_grafico()
"""
Todo esto es muy lento,
Mejor hacerlo en memoria. Para ello convertimos las imagenes en bytes y las guardamos:
#genera_piezas_BytesIO.py
import io, pickle
from PIL import Image
ficheros = {
'b' : "./Merida45/bb.png", #alfil negro
'k' : "./Merida45/bk.png", #rey negro
'n' : "./Merida45/bn.png", #caballo negro
'p' : "./Merida45/bp.png", #peon negro
'q' : "./Merida45/bq.png", #dama negra
'r' : "./Merida45/br.png", #torre negra
'B' : "./Merida45/wb.png", #alfil blanco
'K' : "./Merida45/wk.png", #rey blanco
'N' : "./Merida45/wn.png", #caballo blanco
'P' : "./Merida45/wp.png", #peon blanco
'Q' : "./Merida45/wq.png", #dama blanca
'R' : "./Merida45/wr.png", #torre blanca
'None' : "./Merida45/clear.png" #casilla transparente
}
piezas_png = {}
for nombre, pieza in ficheros.items():
im = Image.open(ficheros[nombre])
salida = io.BytesIO()
im.save(salida, format="PNG")
piezas_png[nombre] = salida.getvalue()
with open("piezas_png.py", "wb") as fich:
fich.write(pickle.dumps(piezas_png))
###################################
Hariamos lo mismo para los escaques
###################################
luego, el programa de arriba lo modificariamos empezando con:
#tablero_png.py
import pickle
PIEZAS = pickle.load(open( "./pyajedrez/piezas_png.py", "rb" ))
etc....
###############################################
y por ultimo leeriamos las piezas y escaques asi:
p.ej. en Tkinter
###############################################
from tkinter import *
import io
from PIL import Image, ImageTk
import pyajedrez.tablero_png as tab
root = Tk()
frm = Frame(root)
frm.pack()
imagen_bytes = io.BytesIO(tab.PIEZAS['Q'])
image = Image.open(imagen_bytes)
tkimg = ImageTk.PhotoImage(image)
print(type(tkimg))
etiqueta = Label(frm, width=45, height=45, image = tkimg)
etiqueta.pack()
root.mainloop()
"""
el hilo lo he puesto aqui, porque no usa gui alguna.
espero que os sirva la idea.
saludos.
Edito:
Pongo el enlace para descargar el ejemplo completo funcionando. Está escrito a vuelapluma en un par de horas, pero funciona. Explicaciones en el fichero LEEME.txt
Ejemplo uso Pillow