PlayPendium
Contraption · Spunti di riflessione

Un livello che dimostra da solo di essere risolvibile

Il gioco non crea mai un rompicapo a mano. Lo fa crescere da un solo numero, e poi gioca quel rompicapo contro se stesso per assicurarsi che non sia né banale né impossibile prima ancora che tu lo veda.

La data di oggi 1 numero, ridotto a un seme tramite hash
diventa
Il rompicapo giornaliero 1 campo identico per tutti

Scritto e redatto in inglese. Questa versione italiana è stata prodotta con traduzione automatica; dove conta la precisione, fa fede l'originale inglese. Leggi l'originale in inglese →

01 · Tutto da un solo numero

Un mondo intero ripiegato in un seme

Un livello di Contraption non è memorizzato da nessuna parte. Non esiste un file che indichi dove si trova l'obiettivo o come sono disposte le sporgenze. Al contrario, l'intero livello, la posizione di partenza della palla, la posizione dell'obiettivo, il numero e la collocazione dei muri fissi, l'inventario di parti che ti viene consegnato, è calcolato a partire da un singolo numero iniziale chiamato seme. Dai al generatore lo stesso seme e ottieni, byte per byte, lo stesso rompicapo. 1

Questo è possibile perché l'unica fonte di "casualità" del generatore è un piccolo generatore deterministico di numeri pseudocasuali. Quello usato da Contraption è mulberry32, un generatore compatto a 32 bit scritto da Tommy Ettinger, lo riconosci dalla sua costante caratteristica, 0x6d2b79f5, sommata allo stato a ogni estrazione. 2 È veloce, sta in poche righe e, cosa fondamentale, non è affatto casuale: è una sequenza matematica fissa che sembra soltanto mescolata. Dagli un punto di partenza e produrrà per sempre lo stesso flusso di numeri. Il generatore legge poi quel flusso per decidere dove mettere ogni cosa.

02 · Il rompicapo giornaliero

Come una data diventa una sfida condivisa

La modalità Giornaliero si appoggia a questo determinismo per fare qualcosa di sociale. Il suo seme non è casuale, viene fabbricato a partire dal calendario. Il gioco prende la data di oggi in tempo universale, la scrive in una breve stringa come "contraption:2026-7-28" e fa passare quel testo attraverso una funzione di hash per ridurlo a un unico numero a 32 bit. 1

L'hash è FNV-1a, un noto mescolatore non crittografico: parte da un offset fisso, il decimale 2166136261, ovvero 0x811c9dc5, e per ogni carattere incorpora la lettera con un OR esclusivo e poi moltiplica per il numero primo FNV 16777619. 3 Ne resta un numero che è stabile per un dato giorno e radicalmente diverso da un giorno all'altro, tanto che il cambio di un solo carattere nella data sparpaglia completamente il seme. Poiché il calendario è lo stesso per tutti, lo è anche il seme, e lo è anche il rompicapo. Due sconosciuti ai lati opposti del mondo aprono la modalità Giornaliero e si trovano davanti il campo identico, ed è proprio questo che rende significativo il confronto dei punteggi.

La sfida giornaliera è equa non perché un server manda a tutti lo stesso livello, ma perché la copia di ciascuno ricalcola in modo indipendente lo stesso livello dalla stessa data.

03 · Il generatore mette in dubbio se stesso

Scartare il rompicapo che si risolve da solo

La geometria casuale è facile; la buona geometria casuale non lo è. Un generatore che si limita a sparpagliare un obiettivo e qualche sporgenza produrrà a volte un livello in cui la palla, lasciata cadere dall'alto, finisce semplicemente dritta nell'obiettivo da sola. Quello non è un rompicapo, è un filmato. Così, prima che Contraption accetti un mondo candidato, esegue un test silenzioso che il codice chiama preSolved: simula il livello senza alcuna parte piazzata e controlla se la palla nuda raggiunge l'obiettivo per sola gravità. Se ci riesce, il livello viene buttato via e il generatore tira di nuovo. 1

È una sottile inversione del modo in cui di solito si pensa a un motore fisico. La stessa funzione simulate() che fa girare la tua macchina viene rivolta verso l'interno, al momento della generazione, per verificare la difficoltà del livello stesso. Il motore è insieme l'arbitro della tua soluzione e l'ispettore di qualità del rompicapo.

04 · Un minuscolo risolutore, incorporato

"Si può fare con una sola parte?"

Scartare il livello troppo facile è solo metà del lavoro. L'altro pericolo è il livello impossibile, un obiettivo nascosto in un punto che nessuna disposizione di parti può raggiungere. Contraption se ne difende con un piccolo risolutore a forza bruta chiamato plausiblySolvable. Non ragiona in modo astuto. Prova e basta. 1

Nello specifico, fa scorrere una singola rampa lungo una griglia di posizioni sul campo e, in ogni punto, la prova inclinata in quattro modi diversi. Per ognuno di questi piazzamenti di prova esegue la simulazione completa e chiede: quella sola rampa ha portato la palla a casa? Nell'istante in cui un piazzamento qualsiasi ha successo, il livello viene dichiarato risolvibile e ti viene consegnato. Se nessuno funziona dopo l'intera scansione, il generatore preferisce scartare il livello e provare un seme nuovo.

La ricerca del risolutore a una sola parte: una griglia grossolana, quattro inclinazioni per punto
Parametro della scansioneIntervalloSignificato
Rampa X15 → 85, passo 14colonne attraverso il campo
Rampa Y30 → 120, passo 18righe lungo il campo
Angoli provati4±0,45 e ±0,8 radianti
Test per piazzamento1 simulazione completala palla raggiunge l'obiettivo?

Vale la pena essere onesti su ciò che questo dimostra, perché anche il codice lo è: il commento lo definisce un "controllo di plausibilità economico … non esaustivo". Un livello che supera il test ha di sicuro almeno una rozza soluzione a rampa singola. Un livello che lo fallisce potrebbe comunque essere risolvibile con una ventola, un ingranaggio o una rampa più astuta che la griglia non ha mai provato, quindi il generatore non tratta il fallimento come prova di impossibilità. Conserva il primo mondo non banale che ha trovato come riserva e, se passano quaranta tentativi senza una soluzione pulita a una sola parte, consegna quella riserva invece di girare in tondo all'infinito. Il risultato è una garanzia pragmatica: mai una vittoria gratis, quasi sempre una strada vera per arrivarci, e mai un'attesa infinita per il livello "perfetto". 1

05 · L'idea di fondo

Genera e verifica, la forma più umile di intelligenza

Fai un passo indietro e il creatore di livelli di Contraption si rivela un esempio pulito di uno schema di risoluzione dei problemi molto antico e molto generale: genera e verifica. Proponi un candidato a caso; confrontalo con i tuoi requisiti; tienilo se passa, scartalo e proponine un altro se fallisce. È il ciclo che sta dietro i contenuti procedurali di innumerevoli giochi, dietro gran parte del calcolo evolutivo e, strizzando un po' gli occhi, dietro la stessa selezione naturale: la mutazione propone, l'ambiente verifica, i sopravvissuti persistono. 4

Ciò che rende elegante la versione di Contraption è che il test non è un surrogato economico della giocabilità, è la giocabilità. Il generatore non stima se un livello è equo contando le sporgenze o misurando le distanze. Gioca letteralmente il livello, due volte: una volta vuoto per assicurarsi che non sia un regalo, e una volta con una rampa di sondaggio per assicurarsi che esista un percorso. La stessa fisica deterministica che giudicherà la tua soluzione è la fisica che ha esaminato il rompicapo. Non esiste un "validatore di livelli" separato che potrebbe perdere l'allineamento con le regole vere, perché esiste un solo insieme di regole, usato per tutto.

E poiché è tutto deterministico, la verifica è libera dalla fortuna in entrambe le direzioni. Il seme giornaliero non può cospirare per dare a un giocatore un campo più facile che a un altro, e non può darne a nessuno uno ingiusto, perché prima di essere una sfida il livello è già sopravvissuto all'essere giocato, dal gioco, contro se stesso.

Sources & notes
  1. Seed-to-level generation, the preSolved rejection test, the plausiblySolvable one-ramp solver (grid ranges, four angles, up to 40 attempts, fallback world), and the daily-seed date string are all read directly from Contraption's own game engine and random-number code. Grounded in the game's code, not invented.
  2. mulberry32 is a compact 32-bit pseudo-random generator by Tommy Ettinger; it advances its state with the constant 0x6d2b79f5 and has a period of 2³². Author's reference gist (with his own later caveats on its equidistribution). gist.github.com/tommyettinger/46a874533244883189143505d203312c
  3. "Fowler–Noll–Vo hash function." Wikipedia, the 32-bit FNV offset basis is 2166136261 (0x811c9dc5) and the FNV prime is 16777619 (0x01000193); FNV-1a XORs each byte into the hash first and then multiplies by the prime. en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function
  4. On generate-and-test / "generation followed by evaluation" as a general search and problem-solving strategy, and its kinship with procedural generation and evolutionary methods. See "Procedural generation," Wikipedia. en.wikipedia.org/wiki/Procedural_generation
  5. Further reading on Procedural generation, [2410.15644] Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. arxiv.org.
  6. Further reading on Procedural generation, Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. doi.org.
  7. Further reading on Procedural generation, "Procedural City Generation with Combined Architectures for Real-time V" by Gr. open.clemson.edu.
Was this worth reading?
← Back to Contraption
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Inspirations · © 2026