2013-04-03 19 views
11

Sto costruendo Tetris e sto cercando di pensare a come ruotare i pezzi.Tetris Java - Pensando alla rotazione dei pezzi

Girano su un singolo blocco? Oppure dovrebbero trasformarsi in posizioni di swap?

enter image description here

Il modo in cui sto pensando di farlo è una sorta di hardcode ... come (pseudocodice):

if (rotateRight()) { 

    if (Piece == "T") { 
     if (Piece.getCurrRotation() == down (aka.. 180 degrees)) 
      move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot's of hardcoding 
    } 
    if (Piece == "L") { etc... 

    } 
} 
if (rotateLeft()) { 
    perform same checks for the Left... 
} 

Ma questo sembra essere una quantità massssssive di codice solo per capire

lato) che rotazione il pezzo corrente è (c'è 4 possibili rotazioni per ogni pezzo)

dall'altro) Da lì ... impostalo sulle nuove coordinate codificate in base a quel pezzo

Dovrei farlo per ogni pezzo ... sembra il modo sbagliato di pensarci.

Qualche altra idea?

+2

C'è qualche ragione per cui è necessario sapere dove ciascun blocco è in relazione con gli altri? –

+1

Non so quanta parte del tuo codice sia pseudo, ma in Java, le variabili non iniziano con una lettera maiuscola - e non dovresti confrontare le stringhe usando '=='. – kba

+0

@ChrisCooper Bene, ho già un metodo isOpen per verificare che gli spazi sulla griglia siano aperti ... ma non penso che debbano sapere le rispettive posizioni ... Immagino che potrei semplicemente calcolare nuove posizioni sulla base di rotazione, seleziona tutte le tessere (Imposta tutto == null), quindi ripristina la nuova posizione ... ma ciò richiederebbe comunque la codifica delle coordinate. – Growler

risposta

1

Avrei probabilmente 1-4 oggetti di orientamento per ogni oggetto PieceType. Ogni Orientamento definirà quindi le posizioni dei blocchi effettivi (relativamente ad un pivot).Per esempio

PieceType "L": 

    Orientation 1: 
    # 
    # 
    ## 

    Orientation 2: 
    ### 
    # 

    Orientation 3: 
    ## 
    # 
    # 

    Orientation 4: 
     # 
    ### 

PieceType "I": 

    Orientation 1: 
    # 
    # 
    # 
    # 

    Orientation 2: 
    #### 

Ogni PieceType potrebbe anche contenere informazioni circa lo spazio necessario per ogni possibile "cambiamento di orientamento" (cioè rotazione). Queste sono tutte informazioni statiche, quindi non c'è davvero bisogno di spostare blocchi durante il gioco. Basta cambiare l'Orientamento del Pezzo e lasciare che l'oggetto Orientamento ti indichi le posizioni del blocco.

+0

La cosa con questo è ... Al runtime, il gioco chiama Pezzo classe '' int [] getShape (String shape) {'metodo che dice, ad esempio,' if (shape == "L") {pieceCoordinates = new int [] {0, 1, 0, 2, 1, 2 , 2, 2}; 'imposterà quei punti sulla scacchiera. Se precalcolo ogni orientamento, come posso impostarli dove devono essere presenti sulla lavagna? – Growler

+1

@Growler Se si dispone di ogni orientamento salvato come un gruppo di coppie di coordinate (x, y), è sufficiente aggiungere le coordinate del pezzo corrente a ciascuna di esse. – kba

+1

Anche tu devi pensare al centro di rotazione. Conservare la forma non è abbastanza. Immagina come ruoti "PieceType" I "" da "Orientamento 1" a "Orientamento 2" e viceversa. – gaborsch

1

Se i pezzi sono memorizzati come matrice, è possibile ruotare la matrice con una funzione generica. Supponi di voler ruotare [[1, 1, 1], [0, 0, 0], [0, 0, 0]] 90 gradi a sinistra -> [[1,0,0], [1,0 , 0], [1,0,0]]. Questo aiuta?

0

IMHO, il modo più semplice è di non ruotare o trasformare il blocco, ma per ricordare la forma di blocco in ogni suo stato (normale, rotated_90_degrees, rotated_180_degrees, rotated_270_degrees)

0

vorrei suggerire che si definisce un pezzo come punti relativi a un singolo punto di rotazione. È quindi possibile (con una piccola algebra di matrice) applicare una semplice rotazione 3 volte per ottenere gli altri layout rispetto al punto centrale.

La rotazione quindi disattiva i punti correnti dal gioco visualizzato, passa alla rotazione successiva e riapplica i nuovi punti al gioco visualizzato.

1

hai 2 opzioni (a seconda di come si memorizzano le forme):

  • Fare il runtime di rotazione (mantenere i vostri punti di forma in una matrice, e ruotano intorno al centro) con riposizionamento tuo blocco forma.
  • Store 4 (o per le forme di rotazione-invariante, 2 o addirittura 1) fasi per la forma, e solo aumentare/diminuire la fase di tua forma è in.

Nella prima versione si deve calcolare runtime , trova il centro della tua forma, ecc.

Nella seconda versione devi eseguire i calcoli preliminari e codificare le forme.

Penso che il secondo approccio sia migliore, dal momento che si ha un numero fisso di pezzi e un numero fisso di fasi. Ma dipende da te.

1

Questo codice di esempio sembra un incubo in divenire.

L'altro modo per farlo, sarebbe molto semplice, sarebbe trattare la scheda come un numero fisso di celle e quindi trattare ogni "rotazione" come un modo per calcolare quanto la posizione di ogni pezzo dovrebbe essere spostata poi rimetti i pezzi, per così dire, poi li fai disegnare da soli, quindi dal punto di vista dei pezzi, gli viene solo detto: 'ok, ora sei in A5'.

Se si guarda al primo esempio, le nuove posizioni sono semplicemente una funzione del loro offset attuale dal centro e dalla direzione di rotazione desiderata.

La cosa migliore di questo approccio è che non si sta andando in giro a fare una tonnellata di affermazioni orribili, e rendendo il codice oggetto di Dio che sarà completamente insostenibile.

+0

Mente dando un rapido esempio? – Growler

+0

Sicuro. Il blocco ha sempre un pezzo centrale? (entrambi i tuoi esempi lo fanno). (Ho giocato a Tetris un paio di volte, ma non molti .. :)) ... – Rob

+0

Non penso che avrebbero bisogno di – Growler

Problemi correlati