Entrada destacada

Como usar enums en Android, kotlin

Dibujando un tablero de ajedrez en Pygame

Veamos como dibujar un tablero de ajedrez utilizando rectángulos y que pueda adecuarse a las medidas de la ventana.

Primero se muestra una forma sencilla de dibujar los cuadros y poder ir intercalando los colores de cada rectángulo, después haremos otro ejemplo para poder detectar que cuadro se ha seleccionado con el ratón.

El código completo para dibujar un tablero de 8x8 es el siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import pygame

NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)

pygame.init()

dimensiones = [500, 400]
pantalla = pygame.display.set_mode(dimensiones)
pygame.display.set_caption("TABLERO")

juego_terminado = False

reloj = pygame.time.Clock()
ancho = int(dimensiones[0] / 8)
alto = int(dimensiones[1] / 8)
while juego_terminado is False:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            juego_terminado = True
    pantalla.fill(BLANCO)
    color = 0
    for i in range(0, dimensiones[0], ancho):
        for j in range(0, dimensiones[1], alto):
            if color % 2 == 0:
                pygame.draw.rect(pantalla, NEGRO, [i, j, ancho, alto], 0)
            else:
                pygame.draw.rect(pantalla, BLANCO, [i, j, ancho, alto], 0)
            color += 1
        color += 1
    pygame.display.flip()
    reloj.tick(5)

pygame.quit()

Ejemplos con distintas medidas, la primera de 400x600 y la segunda de 600x600.


A partir de aquí se vuelve un poco complejo, así que iremos separando el código en funciones.

Lo primero es pasar el código que dibuja el tablero en una función en específico.

def dibujarTablero(screen, dimension, p_inicio, tamanio_fuente, fuente, seleccion):
    color = 0
    for i in range(8):
        for j in range(8):
            x = i * dimension + p_inicio[0]
            y = j * dimension + p_inicio[1]
            if color % 2 == 0:
                pygame.draw.rect(screen, NEGRO, [x, y, dimension, dimension], 0)
            else:
                pygame.draw.rect(screen, BLANCO, [x, y, dimension, dimension], 0)
            if seleccion[0] == LETRAS[i] and j == seleccion[1] - 1:
                pygame.draw.rect(screen, SELECCIONA, [x, y, dimension, dimension], 0)
            color += 1
        color += 1
        dibujarTexto(screen, LETRAS[i], [x, p_inicio[1] - tamanio_fuente], fuente)
        dibujarTexto(screen, str(i + 1), [p_inicio[0] - tamanio_fuente, x], fuente)

Para dibujar los números y las letras usamos la siguiente función.

def dibujarTexto(screen, texto, posicion, fuente):
    Texto = fuente.render(texto, 1, AZUL)
    screen.blit(Texto, posicion)

Con la siguiente función obtenemos la coordenadas adecuadas para dibujar el tablero según el tamaño de la fuente.
def ajustarMedidas(tamanio_fuente):
    if DIMENCIONES[1] < DIMENCIONES[0]:
        ancho = int((DIMENCIONES[1] - (tamanio_fuente * 2)) / 8)
        inicio = ((DIMENCIONES[0] - DIMENCIONES[1]) / 2) + tamanio_fuente, tamanio_fuente
    else:
        ancho = int((DIMENCIONES[0] - (tamanio_fuente * 2)) / 8)
        inicio = tamanio_fuente, ((DIMENCIONES[1] - DIMENCIONES[0]) / 2) + tamanio_fuente
    return [inicio, ancho]

Una función más para obtener en que coordenada se a pulsado con el puntero del ratón.

def obtenerPosicion(mouse, dimension, p_inicio, actual):
    xr, yr = mouse[0], mouse[1]
    for i in range(8):
        for j in range(8):
            x = i * dimension + p_inicio[0]
            y = j * dimension + p_inicio[1]
            if (xr >= x) and (xr <= x + dimension) and (yr >= y) and (yr <= y + dimension):
                actual = [LETRAS[i], j + 1]
    return actual

Y para finalizar el código principal de programa lo podremos en una función main.

def main():
    pygame.init()
    screen = pygame.display.set_mode(DIMENCIONES)
    pygame.display.set_caption("__Tablero__")
    game_over = False
    clock = pygame.time.Clock()
    tamanio_fuente = 30
    seleccion = ['Z', -1]
    fuente = pygame.font.Font("fuentes/AliceandtheWickedMonster.ttf", tamanio_fuente)
    puntoInicio, dimension = ajustarMedidas(tamanio_fuente)
    while game_over is False:
        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                game_over = True
        botones = pygame.mouse.get_pressed()
        if botones[0]:
            pos = pygame.mouse.get_pos()
            seleccion = obtenerPosicion(pos, dimension, puntoInicio, seleccion)
        screen.fill(FONDO)
        dibujarTablero(screen, dimension, puntoInicio, tamanio_fuente, fuente, seleccion)
        pygame.display.flip()
        clock.tick(60)
    pygame.quit()


if __name__ == "__main__":
    main()



El código completo que se muestra en el vídeo lo puedes encontrar en Código del tablero.

Comenta tus dudas en los comentarios.


Comentarios

Publicar un comentario