Determina la posizione di un elemento ruotato in Tetris


24

Le piastrelle Tetris sono memorizzate come una matrice booleana 4x4. Ogni passaggio di rotazione ha la sua matrice, la rappresentazione del T- Block sarebbe simile a questa:

[
    0, 0, 0, 0,
    0, 1, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 0, 1, 1,
    0, 0, 1, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 1,
    0, 0, 0, 0,
    0, 0, 0, 0
],
[
    0, 0, 1, 0,
    0, 1, 1, 0,
    0, 0, 1, 0,
    0, 0, 0, 0
]

Sto cercando di trovare un modo per calcolare la posizione del blocco quando viene ruotato e si scontra con la scheda (la scheda è anche una matrice). Il Tetris originale non consentirebbe semplicemente la rotazione di un blocco quando la rotazione provocherebbe una collisione. Le moderne varianti del gioco risolveranno la collisione e sposteranno il blocco in una posizione valida.

Ecco alcune situazioni che dovrebbero essere risolte. La scheda è 6x6, rossa = blocco attivo, grigia = blocchi posizionati / occupati. Ogni volta, deve essere eseguita una rotazione antioraria. La sovrapposizione verde indica la matrice per il blocco. La freccia indica la correzione risultante per risolvere la rotazione:

rotazione del blocco tetris

  1. Il blocco si trova sul lato sinistro del tabellone. Poiché il blocco non può lasciare la tavola, dovrebbe essere spostato all'interno dopo una rotazione.
  2. Il blocco colpisce "terra", ma non è ancora piazzato / impegnato. In questo caso, la piastrella deve essere spostata verso l'alto per risolvere la collisione (nel caso di un blocco "I", il movimento sarebbe di 2 celle in alto).
  3. La tessera colpirebbe i blocchi occupati, deve essere spostata a sinistra per risolvere la collisione.
  4. La piastrella non può essere ruotata.

Quale sarebbe l'approccio migliore per affrontare questo problema? In modo ottimale, la soluzione dovrebbe essere generica, ad es. lavorare con blocchi di matrice 4x4 arbitrari su una scheda di dimensioni e popolamento arbitrari.


Interessante .. Ho fatto un tetris un anno fa e ho appena ruotato la matrice e mantenuto l'originale. Se qualcosa si sovrapponeva, ho usato l'originale. Ha funzionato bene. Ho provato abbastanza spesso e non ho mai avuto problemi. Deve essere stato solo fortunato. Grazie per l'argomento interessante!
Snitch182

Risposte:


16

La situazione che descrivi si chiama " calcio a muro ".

Un calcio a muro si verifica quando un giocatore ruota un pezzo quando non c'è spazio nei quadrati in cui quel tetromino normalmente si occuperebbe dopo la rotazione.

...

L'algoritmo di kick wall più semplice ... è provare a spostare il tetromino di uno spazio a destra, quindi uno spazio a sinistra e fallire se nessuno dei due può essere fatto.

Esistono vari sistemi di rotazione Tetris, tutti documentati su Wikia: Rotation Systems

SRS è la specifica "ufficiale" di Tetris e ha un algoritmo piuttosto complesso per i calci da parete che coinvolgono le tabelle. Il pezzo finale potrebbe non sovrapporsi nemmeno al pezzo originale!

Il sistema di rotazione DTET estende l'algoritmo più semplice controllando altri cinque calci a muro oltre a destra e sinistra. Tutti i pezzi seguono le stesse regole.


+1, wiki interessante. Anche se spostare la ho un blocco di spazio a sinistra oa destra non funzionerà. Anche i sistemi di rotazione più avanzati sembrano applicare regole diverse per blocchi diversi .. Mi piacerebbe trovare un metodo che funzioni per tutte le possibilità di blocco (se non troppo costoso).
Bummzack,

1
@bummzack: Bene, allora usa la stessa tabella per tutti i blocchi come il sistema DTET. Test semplicemente più posizioni oltre a sinistra e destra. Puoi creare il tuo sistema e controllare quante posizioni vuoi. Tuttavia, l'uso della stessa tabella per tutti i pezzi potrebbe consentire calci a muro "innaturali".
Leftium,

Grazie per le modifiche. Questi sono in realtà molto meglio del materiale su wiki. Molto apprezzato.
Bummzack,
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.