Dietro le quinte del gioco

Come il solver di Meowdoku legge una griglia da uno screenshot

Il solver di Meowdoku riceve un dato insolito: una foto del puzzle, non il puzzle stesso. Prima di risolverlo deve localizzare la griglia, contarne le celle e capire quali condividono un colore. Ecco come decide e dove può ancora sbagliare.

La parte difficile non è leggere i colori

Uno screenshot di Meowdoku contiene molto più della griglia: intestazione, indicatori delle regole, timer e spesso la barra di stato del telefono. La griglia è un blocco quadrato al centro, con posizione e dimensioni diverse da dispositivo a dispositivo, e nell’immagine non ci sono etichette.

Prima di leggere un solo colore bisogna risolvere tre incognite. Sbagliarne una non rende il risultato appena impreciso: crea un puzzle diverso, risolto con sicurezza.

Tutto avviene nel tuo browser

Lo screenshot non viene mai caricato. L’immagine viene disegnata su un canvas, i pixel vengono letti e tutti i passaggi successivi lavorano su quei numeri nella tua scheda. Nessun server vede o conserva l’immagine.

Un’immagine mai inviata non deve essere archiviata né cancellata. Senza passaggi di rete, la griglia viene restituita in molto meno di un secondo.

Per prima cosa l’immagine viene ridotta fino a un massimo di 900 pixel sul lato lungo. Serve un colore rappresentativo per cella, non una foto nitida, e il lavoro per pixel cala con il quadrato della scala.

Passaggio 1: trovare la griglia

Il solver stima lo sfondo campionando la fascia esterna del 7% sui quattro lati e calcolando la mediana di ogni canale. Prima scarta i pixel molto vividi, così un banner colorato in un angolo non altera la stima.

Poi classifica ogni pixel come sfondo o non sfondo e conta questi ultimi riga per riga. Ne ricava un profilo di densità: quasi zero nei margini, alto sulla griglia, intermedio nell’intestazione. Le sequenze dense diventano candidate. I piccoli avvallamenti delle linee di griglia vengono colmati, perché una linea di un pixel non è uno spazio; il vero vuoto sopra la griglia resta e tiene fuori gli indicatori.

Il test decisivo è la forma quadrata. Ogni candidato viene analizzato sull’altro asse e sopravvive solo se larghezza e altezza differiscono di circa meno di un terzo e coprono almeno il 3% dell’immagine. Banner e barre sono larghi e bassi; in uno screenshot di Meowdoku la griglia è l’unico quadrato.

Se non emerge alcun quadrato, il solver presume che l’immagine sia già ritagliata e usa l’intero fotogramma. È un buon tipo di fallimento: l’immagine che non riesce a localizzare spesso non aveva bisogno di essere localizzata.

Passaggio 2: contare la griglia

Sapere dove si trova il tabellone non dice se sia 7×7 o 9×9. Il solver lo attraversa in 400 passi e misura ogni variazione di colore, mediando 48 linee parallele sull’altro asse affinché un gatto scuro non sembri un bordo. Le celle emergono come picchi regolari.

Anziché misurare la distanza tra i picchi, prova ipotesi. Per ogni N da 4 a 12 calcola la posizione dei N−1 confini interni, cerca un picco vicino e assegna un punteggio alla corrispondenza. Vince il valore N che spiega meglio il profilo.

I due assi vengono misurati separatamente e poi riconciliati, perché la griglia è quadrata. Se l’orizzontale dice 8 e il verticale 7, uno ha perso una linea debole e si sceglie il numero maggiore.

Passaggio 3: campionare ogni cella su un anello

Trovata la griglia e contato il reticolo, serve un colore per cella. La scelta naturale sarebbe il pixel centrale.

È esattamente il pixel sbagliato: al centro si trovano il gatto e la ✕. In una partita parzialmente risolta, il campionamento centrale scambierebbe molti simboli per colori di regione.

Ogni cella viene quindi campionata su tre anelli concentrici, al 28%, 36% e 43% dal centro, in sedici angoli ciascuno: 48 campioni. L’anello resta dentro il bordo e fuori dal simbolo. La mediana di ogni canale esclude i pochi campioni caduti su bordi sfumati o riflessi.

Passaggio 4: raggruppare i colori in esattamente N regioni

Ora bisogna ordinare N×N colori in regioni. Il problema tipico del clustering è non sapere quanti gruppi cercare: sbagliare il numero rovina la risposta senza segnalarlo.

Le regole di Meowdoku fissano il numero. Un tabellone N×N ha esattamente N regioni connesse; un 9×9 ne ha nove, mai otto o dieci. La domanda aperta diventa k-means con k noto, rendendo questo passaggio più affidabile dei due precedenti.

I centri iniziali vengono scelti dal più lontano al più lontano, distribuendoli sui toni presenti, e la scelta è deterministica. Lo stesso screenshot produce sempre la stessa griglia.

Infine le regioni vengono rinumerate in ordine di lettura, iniziando da quella in alto a sinistra. Non cambia la soluzione; presenta solo i dati come farebbe una persona.

Passaggio 5: risolvere e cercare una seconda soluzione

Con dimensione e regioni note, risolvere è semplice: viene usato lo stesso motore di vincoli del generatore. La scelta interessante è richiedere due soluzioni anziché una.

Una griglia letta correttamente ha una sola soluzione. Due indicano una cella assegnata alla regione sbagliata; nessuna indica vincoli contraddittori dovuti a un altro errore di lettura. La seconda ricerca verifica la lettura iniziale.

Dove fallisce e perché puoi dipingere

Tutto ciò che precede il passaggio 4 è un tentativo ragionato e può fallire. I casi reali più comuni sono:

Lo strumento di pittura è parte del progetto

Per questo ogni cella può essere ricolorata trascinando, e il solver si rifiuta di partire finché non esistono esattamente N regioni distinte, mostrando il conteggio corrente. La protezione blocca una risposta falsa dovuta a una fusione o divisione errata.

La griglia viene ridisegnata con i colori del tuo screenshot, non con la palette del gioco, così puoi controllare subito. Se una cella appare del colore sbagliato, lo è, e basta un trascinamento. Il rilevamento svolge il noioso novanta e passa per cento; tu dai il giudizio finale.

Provalo su una tua griglia

Cattura una griglia su cui sei bloccato, inseriscila nel solver e controlla quali celle legge male. Gli errori compaiono quasi sempre nei casi descritti qui.

Il solver funziona interamente nel browser. Gli screenshot vengono letti sul dispositivo e non sono mai caricati.