Ayudante de cartones de bingo · 3×9, 4×8 y 3×5

Canta el bingo sin perder de vista ningún cartón.

Fotografías tus cartones, CheckBingo los reconoce y los guarda. Vas marcando los números que salen del bombo y la app vigila todos tus cartones a la vez, avisándote en cuanto hay línea o bingo. Pensada para partidas caseras y fiestas de pueblo, sin registro y sin conexión. Con letra grande, para que la use cualquiera, también quien no se lleva bien con la tecnología.

Para jugar

Cómo funciona, en tres pasos

Lo que ve quien solo quiere echar una partida.

1
Fotografía tus cartones
La app los lee con la cámara y los guarda. Corriges con un toque lo que haga falta.
2
Marca lo que canta el bombo
Vas tocando los números conforme salen. Sin lápiz y sin tachones.
3
Deja que vigile por ti
CheckBingo comprueba todos los cartones a la vez y avisa en cuanto hay línea o bingo.
En pantalla

La app por dentro

Cinco pantallas del recorrido, de añadir un cartón a cantar bingo.

Pantalla de inicio de CheckBingo
Inicio. Empiezas añadiendo tus cartones.
Reconocimiento del cartón
Reconocimiento. La app lee el cartón desde la foto.
Corrección de números
Corrección. Ajustas cualquier número con un toque.
Partida en curso
Partida. Marcas los números que van saliendo.
Aviso de línea y bingo
Aviso. La app detecta línea y bingo por ti.
Para curiosos

Con qué está construida

Una app móvil multiplataforma, offline-first, con arquitectura hexagonal y OCR en el propio dispositivo.

Frontend
Vue 3Ionic 8Capacitor 8TypeScriptPiniaViteVitestPlaywright
Datos
SQLiteoffline-firstarquitectura hexagonal
Visión y OCR
Vision (iOS)ML Kit (Android)plugin nativo propiok-means 1D
Por qué existe

Un proyecto para aprender OCR y visión por computador

CheckBingo se eligió a propósito como banco de pruebas para trabajar con IA aplicada, reconocimiento de texto (OCR), visión por computador, tratamiento de imágenes y algoritmos como k-means. Es un proyecto de autoaprendizaje: la app en sí es la excusa para montar el pipeline de visión.

Así se hizo

Cómo lee la app un cartón

01 · Punto de partida
Las reglas del bingo
15 números por cartón en el bingo de 90, un rango por columna, sin repetidos. Cuándo hay línea y cuándo bingo. Es código que no sabe que existen Vue ni el OCR, así que se prueba por su cuenta.
02 · El problema
Leer un cartón desde una foto
Un OCR corriente lee texto, no cuadrículas. Junta celdas, confunde el 6 con el 8 y se salta los huecos. Y aunque acierte los números, devuelve una lista suelta: no sabe que ese 47 va en la segunda fila, séptima columna. Colocar cada número en su celda era lo que había que resolver.
03 · Opción 1
Un pipeline de visión por computador con OpenCV
La primera idea fue hacerlo del todo automático: detectar el contorno del cartón, enderezar la perspectiva con una homografía, partir la cuadrícula y leer celda a celda. Sobre el papel, cero errores. En un iPhone real no llegó a arrancar: el motor pedía más de 1 GB, demasiado cerca del límite de 1,4 GB que aguanta el WebView de iOS, y la pantalla se quedaba congelada. Se comprobó con una sonda instrumentada en el propio teléfono, para no quedarse en la sospecha. Se evaluaron cuatro alternativas (APIs de visión nativas, servir el binario aparte, un web worker, un plugin propio) y ninguna quitaba el problema de memoria.
04 · Opción 2. Lo que funcionó
El OCR del propio móvil y un toque del usuario
La solución fue aceptar que el OCR se equivoque de vez en cuando y que el usuario lo corrija. La app usa el reconocimiento que ya trae el sistema, Vision en iOS y ML Kit en Android. Pinta los números detectados sobre una rejilla donde cualquiera se cambia con un toque. Para saber en qué celda va cada número tampoco hace falta visión por computador: como el usuario elige el tipo de cartón, se sabe de antemano que hay 3 filas y 9 columnas. Las posiciones verticales se agrupan en 3 grupos y las horizontales en 9 con un k-means de una dimensión. Cada número cae en su celda por geometría y el número de serie del cartón se queda fuera como outlier porque está lejos de la rejilla. Con esto OpenCV dejó de hacer falta.
05 · Resultado de la v1
Entre un 73% y un 87% de las celdas se rellenan solas
El resto se remata con el dedo. Subir la resolución de trabajo de 1000 a 2400 píxeles llevó el acierto del 73% a cerca del 80% y recortar cada celda para leerla por separado aportó el resto. Con una foto clara y bien iluminada sale bien. Torcida o a contraluz, hay que corregir más números a mano.
06 · La v2
La columna no sale de la imagen, sale del número
En la versión 2 cambió la colocación. En un cartón de 90 bolas la primera columna solo admite números del 1 al 9, la segunda del 10 al 19, y así hasta la novena, de modo que el propio número dice en qué columna va sin mirar dónde estaba en la foto. El k-means quedó para las filas, sobre la coordenada Y, y la posición horizontal pasó a ser una comprobación de coherencia. Con eso desapareció la mitad del problema y, con ella, la fragilidad ante la perspectiva y los márgenes del cartón. La misma versión añadió dos variantes, 4×8 con bombo de 80 y una 3×5 densa; esta última no tiene rangos por columna, así que ahí la columna sigue saliendo de un k-means sobre la X, con k = 5.

Los diagramas

Tres esquemas para ver el recorrido completo, del píxel a la celda.

El pipeline completo, de la foto al cartón

El OCR nativo devuelve números sueltos con su posición, pero no sabe a qué celda van. El resto del pipeline convierte esa lista en una rejilla, la muestra sobre la foto y deja que el usuario remate con un toque.

Situar cada número: la fila por k-means, la columna por su rango

La fila sale de agrupar las posiciones verticales con un k-means de una dimensión, tantos grupos como filas tenga el cartón. La columna sale del propio número: en el bingo de 90, la primera columna solo admite del 1 al 9, la segunda del 10 al 19, y así. La posición horizontal se usa solo para comprobar que el orden cuadra. Un número que queda lejos del centro de su grupo de filas se marca como outlier, que es justo lo que le pasa al número de serie del cartón.

Por dentro del k-means, un bucle sencillo

La "IA" aquí es un algoritmo clásico bien aplicado. Se parte de centros repartidos, se asigna cada valor al más cercano, se recalculan los centros y se repite hasta que se estabilizan o se alcanzan 20 iteraciones. Al final se ordenan los clústeres para que el 0 sea siempre arriba o a la izquierda. Es lo que coloca las filas en las tres variantes, y también las columnas en la 3×5 densa.

Cómo se decidió

  • El bloqueo de OpenCV en iOS se diagnosticó con una sonda en un iPhone real, no suponiendo cuál era la causa.
  • Cada elección importante quedó escrita en un ADR con sus opciones y sus consecuencias, así que se puede volver sobre ella.
  • Recortar el alcance ahorró semanas de trabajo y un plugin nativo de OpenCV que habría que mantener en iOS y en Android por separado.
Arquitectura hexagonal Offline-first Plugin nativo propio k-means 1D Sin backend Sin seguimiento Accesibilidad, letra grande

Versión 1. El reconocimiento se puede mejorar y es lo que se abordará en las próximas versiones.

Organización

Cómo se llevó el proyecto

Decisiones como ADRs
12 registros de decisión de arquitectura. Cada elección relevante tiene contexto, opciones con sus pros y sus contras, y consecuencias.
Tests
Más de 850 tests automáticos entre Vitest y Playwright. Cada entrega se verifica antes de aprobarse, en una pasada aparte de la que la implementó.
Qué se dejó fuera
Fuera de la v1 quedaron, de forma explícita y documentada, las nuevas variantes de cartón, los tests E2E y las mejoras de reconocimiento.
Desarrollo asistido por IA
La programación se ha hecho asistida por Claude Code, con un flujo definido: análisis y decisión primero, implementación después, y revisión humana e independiente de cada cambio antes de integrarlo.
Descarga y verificación

Verificar la descarga de Android

Si descargas el APK de CheckBingo 2.0.0 para Android, puedes verificar que no ha sido modificado comparando su huella digital SHA-256 con la publicada aquí.

Descargar en el App Store

En iOS la verificación de firma la hace el App Store automáticamente. Las huellas publicadas en esta página aplican solo al APK de Android.

Descargar APK para Android

Huella del certificado de firma

67f51a6fec00db8ecabb1a28081fa1d2e6d3ba95c462b89342c4e54ce8572bc2

CN=Luis Julve, O=Nonsense Development Group, C=ES

Huella del fichero APK

18c74553e7e5a220110f7f1abe77245a7b222ef83766e6af4d96dd3e8e00c810

CheckBingo_2.0.0.apk, 74.862.513 bytes

Cómo comprobar la huella del archivo paso a paso

En macOS o Linux. Abre Terminal, ve a la carpeta donde has descargado el archivo y ejecuta:

shasum -a 256 CheckBingo_2.0.0.apk

En Windows. Abre PowerShell o el símbolo del sistema en la carpeta de descarga y ejecuta:

certutil -hashfile CheckBingo_2.0.0.apk SHA256

Directamente en el móvil Android. Hay aplicaciones gratuitas en Play Store que calculan checksums de archivos (por ejemplo "Hash Droid" o "Hash Checker"). Instala una, abre el APK descargado desde ella y compara el SHA-256 que muestra con el de esta página.

El resultado debe coincidir carácter a carácter con el SHA-256 publicado más arriba. Si coincide, la descarga es íntegra. Si no coincide, no instales el archivo y vuelve a descargarlo desde el enlace original.

el laboratorio

Más proyectos

<ndg> </ndg>
Nonsense Development Group

Mi laboratorio personal de apps móviles, desarrolladas en solitario de extremo a extremo: frontend, backend e infraestructura.

Desarrollo end-to-end iOS & Android Full-stack en solitario
Privacidad

Política de privacidad

Términos

Términos de uso