Rotation von Formen in Tetris

Diskutiere Rotation von Formen in Tetris im Java Basics - Anfänger-Themen Bereich.
F

fire_gamer_552

Hallo zusammen,
Ich möchte Tetris Programmieren und habe auch schon einiges dahingehend getan, allerdings bin ich jetzt an dem Punkt angelangt, an dem ich die Rotation von den fallenen Formen programmieren möchte. Meine Objekte bestehen immer aus vier einzelnen Block Objekten.
Zusätzlich habe ich die Klasse BlockHandler, in der alles rund um die Steuerung von den Formen gemacht wird.
Block[][] ist ein Array, das als Koordinatensystem dient um meine Objekte zu ordnen.
Hier ein beispiel eines Quadrats, aus vier kleinen Block Objekten:
Java:
package Blocks;

public class Square extends Forms{
   
    private BlockHandler blockH;
   
    private Block first;
    private Block second;
    private Block third;
    private Block fourth;
   
    public Square(BlockHandler pBlockH) {
        super();
       
        blockH = pBlockH;
       
        first = blockH.addBlock(4,15);
        second = blockH.addBlock(4,14);
        third = blockH.addBlock(5,15);
        fourth = blockH.addBlock(5,14);
       
    }
   
    public void rotate() {
       
    //in diesem Falle nicht nötig, habe aber als Beispiel ein weitgehend fertiges Objekt genommen  
    }

    @Override
    public void move() {
       
        if(blockH.block[second.getX()][second.getY()-1] == null && blockH.block[fourth.getX()][fourth.getY()] == null) {
           
            blockH.moveDown(first.getX(),first.getY());
            blockH.moveDown(second.getX(),second.getY());
            blockH.moveDown(third.getX(),third.getY());
            blockH.moveDown(fourth.getX(),fourth.getY());
        }
        else {
            blockH.newForm();
        }
    }
}
Mein Problem ist die Rotation. Meine einzige Idee ist es für jedes Objekt, für jede Drehungsstufe, alles einzeln zu testen. Das währe allerdings sehr viel aufwand.
Hier ein Beispiel wie das gemeint ist:

Code:
if(rotation == 0) {
           
            if(first.getX() != 15 && blockH.block[first.getX()][first.getY()+1] == null && blockH.block[second.getX()][second.getY()+1] == null) {
                if(blockH.block[second.getX()][third.getY()-1] == null) {
                    blockH.moveBlock(first.getX(),first.getY(),second.getX() +1,first.getY()+1);
                    blockH.moveBlock(third.getX(),third.getY(),second.getX() +1,third.getY()-1);
                    blockH.moveBlock(fourth.getX(),fourth.getY(),first.getX() +1,first.getY()+1);
                   
                    rotation = 1;
                }
            }
        }
Das bräuchte ich dann noch vier mal für jede der sieben Formen. Deshalb wollte ich fragen, ob das irgendwie einfacher geht.

Danke schonmal für die Hilfe.
 
B

BestGoalkeeper

Vielleicht hilft dir das schon weiter (ich weiß es sieht fürchterlich kompliziert aus, möglichweise ist es das auch...)
Java:
import java.util.Arrays;

public class TestProgram {
	public static void main(String[] args) {
		Block l = new Block(BlockType.L);
		for (int i = 0; i < 5; i++) {
			int[][] game = new int[5][5];
			l.insertIn(game, 1, 1);
			l.rotate();
			for (int[] is : game) {
				System.out.println(Arrays.toString(is));
			}
			System.out.println();
		}
	}
}

enum BlockType {
	SQUARE(new int[][] { { 1, 1 }, { 1, 1 } } ), 
	L(new int[][] { { 1, 0, 0 }, { 1, 0, 0 }, { 1, 1, 0 } } ),
	S(new int[][] { { 1, 0, 0 }, { 1, 1, 1 }, { 0, 0, 1 } } ),
	LINE(new int[][] { { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } );

	int[][] figure;

	BlockType(int[][] figure) {
		this.figure = figure;
	}
}

class Block {
	BlockType t;
	int orientation = 0;

	Block(BlockType t) {
		this.t = t;
	}

	void insertIn(int[][] game, int x, int y) {
		int w = t.figure.length;
		double w2 = (w - 1) / 2.0;
		int cosa = (int) Math.cos(Math.toRadians(90 * orientation));
		int sina = (int) Math.sin(Math.toRadians(90 * orientation));
		for (int x1 = 0; x1 < w; x1++) {
			for (int y1 = 0; y1 < w; y1++) {
				double x2 = x1 - w2;
				double y2 = y1 - w2;
				int x3 = (int) (cosa * x2 - sina * y2 + w2);
				int y3 = (int) (sina * x2 + cosa * y2 + w2);
				game[y + y1][x + x1] = t.figure[y3][x3];
			}
		}
	}

	void rotate() {
		orientation = (orientation + 1) % 4;
	}
}
 
M

M.L.

Weiterhin könnte man eine 3D-Bibliothek verwenden, die einem bestimmte Dinge (z.B. farbige Kuben/Würfel und Drehungen) erleichtert, z.B. JOGL
 
mihe7

mihe7

Irgendwie kapiere ich nicht, wozu man hier trigonometrische Funktionen bzw. eine Lib bräuchte. Eine 90° Rotation besteht doch einfach darin, die Spalten des 2D-Arrays des betreffenden Teils zeilenweise auszugeben, oder?
 
B

BestGoalkeeper

Thema: 

Rotation von Formen in Tetris

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben