Tabla de contenido
Una vez más aquí …. Después de tanto tiempo … y en un rato libre que me encontré, voy a publicar un pequeño ejercicio que escribí el otro día en el curso que estoy haciendo. La idea original del proyecto era hacer un programa para jugar al piedra papel o tijera, cosa que también hice. Pero una vez terminado el ejercicio, pensé que hacer una máquina tragaperritos, podría hacerse con la misma lógica (aproximadamente). Entonces a eso me puse. Y como hacía tanto tiempo que no actualizaba esta web, pues que mejor excusa.
En este artículo exploraremos este proyecto desarrollado en Python, el cual que simula una máquina tragaperritos con una interfaz gráfica creada con tkinter y customtkinter (por que hay vida más allá de Flet). Como digo, la aplicación combina varias librerías como tkinter y customtkinter para el diseño de la interfaz, pygame para la gestión de sonidos y PIL para el manejo de imágenes. La integración de múltiples módulos y el uso de threading para animaciones hacen de este proyecto un excelente ejemplo para aprender y practicar algunas cosas de programación con Python, enfocadas sobre todo en el desarrollo de aplicaciones interactivas y visuales.

Descripción general del proyecto
El código implementa una máquina tragaperritos que simula el comportamiento de una tragamonedas (o como se dice allí de donde yo vengo, tragaperras), pero con un toque un poco diferente que me hizo gracia. Algunas de las características principales son:
- Interfaz gráfica personalizada: Se utiliza customtkinter para lograr un diseño oscuro y moderno, complementado con colores vibrantes y efectos de iluminación.
- Animaciones y efectos visuales: Durante el giro de los rodillos se muestran efectos de luces y cambios de color que mejoran la experiencia de usuario.
- Gestión de sonidos: Con pygame se reproducen distintos sonidos para eventos clave, como la acción de tirar, ganar o cuando ocurre un error.
- Lógica de juego interactiva: El juego gestiona créditos, premios y efectos especiales, como giros gratis en función de la combinación de resultados obtenidos.
Estructura y diseño del código
El proyecto se organiza en torno a la clase MaquinaTragaperras
, que encapsula toda la lógica de la aplicación. A continuación, se destacan algunos puntos clave del diseño:
- Configuración inicial:
Se configuran los modos de apariencia y la paleta de colores utilizando customtkinter, lo que asegura una experiencia de usuario coherente y atractiva. - Metodología modular:
La clase contiene métodos dedicados a cada parte del juego, como:pantalla_inicio()
: Presenta la pantalla de inicio para ingresar el nombre y el crédito inicial del jugador.pantalla_juego()
: Crea la interfaz principal del juego, mostrando información relevante, rodillos y controles.tirar()
: Ejecuta la lógica para realizar una jugada, descontando créditos y actualizando la visualización.animar_giro()
yefectos_durante_giro()
: Gestionan las animaciones y efectos visuales de los rodillos.verificar_resultado()
: Evalúa el resultado de cada giro y determina si se ha ganado o se obtiene un avance especial.
- Uso de hilos (threading):
Para evitar que la interfaz se bloquee durante las animaciones y el procesamiento de los sonidos, se utilizan hilos que permiten ejecutar tareas en paralelo. Esto asegura una experiencia fluida y receptiva.
El código de Tragaperritos
Importaciones, configuración y constantes de la máquina
import tkinter as tk import customtkinter as ctk import random import time import threading from PIL import Image, ImageTk import os import pygame # Configuración de customtkinter ctk.set_appearance_mode("dark") ctk.set_default_color_theme("dark-blue") # Constantes de estilo COLOR_FONDO = "#1a1a1a" COLOR_ACENTO = "#FFD700" COLOR_SECUNDARIO = "#C0C0C0" COLOR_BOTON = "#E74C3C" FUENTE_TITULO = ("Arial Black", 28, "bold") FUENTE_TEXTO = ("Impact", 16) FUENTE_NUMEROS = ("LCDMono", 20) FUENTE_SIMBOLOS = ("Arial", 72, "bold") .....
El resto del código necesario, ahora mismo la base de datos y el plugin que utilizo para dejar aquí el código de las aplicaciones, no me dejan pegarlo en este artículo. Por eso si quieres ver todo el código, te sugiero que te dirijas al repositorio en el que he colocado todo el código necesario de este proyecto.
Las dependencias
Todo el código que se acaba de ver, debe de ir todo junto dentro de un archivo que yo he llamado tragaperras.py. Además se puede crear el archivo requirements.txt, con el contenido:
customtkinter==5.2.0 pygame==2.5.0 Pillow==10.0.0
Cuando tengas los dos archivos creados, puedes instalar las dependencias necesarias (se recomienda dentro de un entorno virtual) escribiendo en la termina en la que estén los archivos del proyecto:
pip3 install -r requirements.txt
Después, para iniciar la aplicación bastaría con escribir:
python3 tragaperras.py
Estos comandos son los que yo utilizo en Linux. Si alguien utiliza Windows, es posible que los comandos varíen un poco.
Características y funcionalidades destacadas
Interfaz de usuario y estilo visual
La aplicación destaca por su cuidado en el diseño de la interfaz. Se han definido constantes para los colores y fuentes, garantizando una apariencia consistente:
- Fondo oscuro y acentos en dorado: Realzan el ambiente de casino.
- Efectos dinámicos en botones y bordes: Cambios de color y símbolos durante las animaciones que aportan dinamismo.
Gestión de sonidos
La integración de pygame permite reproducir distintos efectos sonoros:
- Sonido de tirada: Se reproduce al iniciar el giro.
- Sonido de ganar y error: Ayudan a enfatizar los resultados de cada jugada.
- Sonido de avance: Se activa cuando se otorgan giros gratis en función de combinaciones específicas.
Animaciones y efectos en tiempo real
Gracias a la utilización de threading y el manejo cuidadoso de la interfaz mediante la función after
de Tkinter, se logran animaciones que no bloquean la aplicación:
- Efecto de iluminación: Cambios rápidos de color en los bordes de los rodillos.
- Animación de rodillos: Simula el giro de una tragamonedas, haciendo uso de símbolos aleatorios y actualizando la pantalla en intervalos cortos.
Aquí quiero aclarar que hay uno de los emojis de perretes que se usan, que tiene como un fondo grisaceo (semitransparente) por lo que al hacer girar los rodillos (en Windows) se ve algo un poco raro en uno de los perros. Pero eso ya es cuestión de adaptar la imagen … a mi no me ha dado tiempo.
Lógica de juego y gestión de créditos
El juego simula una experiencia de casino donde el usuario introduce un nombre y una cantidad inicial de créditos. Por lo que durante el juego encontraremos:
- Descuento de fichas por cada jugada.
- Acumulación de un bote que aumenta con cada intento.
- Comprobación de combinaciones ganadoras: Tres símbolos iguales otorgan el premio acumulado y la posibilidad de reiniciar el bote.
Explicación de funciones clave
Función pantalla_inicio()
Esta función se encarga de construir la pantalla de bienvenida, donde el usuario escribe su nombre y el número de monedas. Se emplea un diseño bastante limpio, y se añaden efectos decorativos, como luces y marcos.
Función tirar()
y animar_giro()
La función tirar()
verifica las condiciones del juego (como la disponibilidad de créditos) antes de iniciar la jugada. Luego, animar_giro()
utiliza un bucle de animación para simular el giro de los rodillos, actualizando los símbolos en pantalla de manera aleatoria. Durante este proceso, se reproducen sonidos y se activan efectos de luz para aumentar la emoción del juego.
Función verificar_resultado()
Una vez finalizado el giro, esta función evalúa los símbolos mostrados. Si se cumple la condición de ganar (tres símbolos iguales), se actualizan los créditos del jugador y se activa un efecto visual especial. En otros casos, se notifica al usuario que intente de nuevo, e incluso se gestiona la posibilidad de giros gratis en caso de obtener combinaciones parciales.
Conclusiones
Esto nació como alternativa al programa del piedra, papel o tijera que hice el otro día. La lógica creo que se parece bastante, por eso me animé a hacerlo. Si eres un programador que busca inspiración para desarrollar interfaces gráficas complejas o deseas profundizar en la programación de juegos en Python, ¡explora, modifica y alomejor puedes aprender algo de este ejemplo! pues creo que este código se puede adaptar tanto a desarrolladores principiantes como a aquellos con cierta experiencia. O al menos esa era la idea …
Si te interesa ver todo el código o descargarlo junto con los archivos de audio, puedes hacerlo desde el repositorio en GitHub en el que he alojado este pequeño proyecto.