Come posso garantire che una griglia possa essere riempita con pezzi simili a Tetris?


8

Sto pensando di creare un puzzle game in cui l'obiettivo è riempire una griglia con pezzi di puzzle sagomati (ad esempio, le forme classiche di Tetris).

Come posso fare per generare un insieme di pezzi che possono essere garantiti per essere utilizzati per riempire la griglia, senza lasciare spazi? Come potrei adattare questo algoritmo per ridimensionare la difficoltà del puzzle risultante?



1
Permettete due o due quadratini singoli o piccoli?
Steven,

@steven "monominos" e "dominos". Tutti i pezzi classici di Tetris sono tetrominos. Ci sono 12 pentominos e 35 hexominos ...
David Van

Risposte:


8

Questo è un problema noto, che determina quali rettangoli possono essere piastrellati con determinati pezzi.

Tuttavia, se stai costruendo puzzle e riesci a controllare i pezzi, è l'opposto, il problema costruttivo e più facile ...

Costruisci una soluzione in modo costruttivo. Prendi alcuni pezzi che ti piacciono e riempi il puzzle come preferisci. Quindi inserisci abbastanza singoli quadrati per compilarlo e hai garantito che ci sia almeno una soluzione. O meglio, includi alcuni piccoli pezzi nel tuo set di pezzi consentito.

Per quanto riguarda la risoluzione / disposizione dei pezzi, un tipico approccio alla forza bruta è di riempirlo da sinistra a destra, quindi dall'alto verso il basso. Trova la prima cella aperta (numerata LR, TB) e prova a inserire i pezzi consentiti nei loro orientamenti consentiti (8 orientamenti per un pezzo asimmetrico se consenti il ​​capovolgimento). Magari controlla i primi pezzi di grandi dimensioni ammessi e, se necessario, ricorri a quelli più piccoli. Quando raggiungi uno stato che non ti piace (vicolo cieco, troppi piccoli pezzi, o cosa no), fai un passo indietro. Se un determinato set di griglie / pezzi non soddisfa i tuoi criteri, ovvero è tornato indietro completamente senza finire, prova un rettangolo e un set di pezzi diversi.

Un modo per rendere un puzzle "più semplice" potrebbe essere quello di scambiare pezzi più grandi con pezzi più piccoli come monomini e domino, poiché ciò lascerà più modi per riempire le ultime buche. O, equivalentemente, costruisci una soluzione che favorisca quei pezzi più piccoli.

Alcuni noti polominominologi includono:

==> http://ee.usc.edu/faculty_staff/faculty_directory/golomb.htm Golomb originariamente ha coniato il termine "Polyomino"

==> http://www.eklhad.net/polyomino/ Dahlke ha risolto alcuni rettangoli pieni di pezzi identici (una forma di piastrellatura particolarmente rara)


3

Questo articolo (pagina 11-13, dichiarazione di non responsabilità: sono uno degli autori) descrive un algoritmo che utilizza la programmazione dinamica per generare uniformemente regioni rettangolari perfettamente piastrellate di larghezza w e altezza h , nel tempo che è lineare in h dopo una pre-elaborazione che richiede circa 2 ( w . D ) tempo / spazio ( D è la dimensione più lunga di una forma individuale, ad esempio 4 nel caso di pezzi Tetris).

L'idea è simile a quella descritta da David sopra e si concentra sulla striscia superiore , posizionando pezzi che non creano buchi . La cosa chiave qui è iniziare precompilando le alternative consentite per ogni stato della striscia superiore, in modo da non pagare più per l'esplosione combinatoria quando si generano le regioni.

L'algoritmo funziona per qualsiasi set di forme (convesse).

Inoltre, un aspetto interessante di una generazione casuale uniforme è che garantisce la massima diversità tra generazioni consecutive (ma è anche possibile vincolare la generazione nel modo desiderato). Ecco alcuni output tipici:

Alcune tetrise generate casualmente di larghezza 6

Sentiti libero di chiedere se hai problemi con l'implementazione (potrei anche avere un'implementazione veloce e sporca di Python in giro da qualche parte ...)


l'implementazione di Python che hai menzionato sarebbe molto utile
user2682863

1

Ecco una tecnica che abbiamo usato in passato per imbrogliare un po 'su hardware più limitato. Non è puro come le soluzioni più complesse, ma ha il netto vantaggio di essere molto più facile da implementare e funzionare ogni volta.

Invece di concentrarti sull'intero puzzle, suddividilo in unità più piccole e uniformi . Ognuna di queste unità è composta da un numero prestabilito di pezzi che si uniscono per formare quadrati o rettangoli che sono molto più facili da riempire in un puzzle. Scegli casualmente tra le diverse configurazioni per riempire la larghezza del puzzle (esempi sotto, ma ci sono molte, molte configurazioni). Di seguito sono riportati 4x4s, un 5x4 e persino un esempio 10x4.

Quadrati e rettangoli

L'idea è che si "striscia" il puzzle ... scegliere le larghezze in modo casuale in base alla stanza rimanente disponibile. Una volta terminata una "striscia", inizia una nuova striscia.

Rilasci pezzi una striscia alla volta, randomizzando all'interno di ogni set di "strisce". Se si desidera aumentare la difficoltà, rilasciare casualmente da due o più strisce alla volta.

Usando questa tecnica, non solo hai garantito che il puzzle è risolvibile, ma hai anche aiutato a "imbrogliare" l'ordine di rilascio per rendere più facile rimanere in vita. Ovviamente in pratica, i giocatori non sono in grado di risolvere perfettamente ogni striscia e quindi ne deriva il caos.

Continua a generare strisce fino a quando il giocatore perde. Certo, il mio esempio è una striscia alta 4 blocchi, ma puoi scegliere qualcosa di più grande e più complesso:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.