Session 04 (10.11.23) - RUB-INI-Theory-of-Machine-Learning/Info1_WS23-24 GitHub Wiki

In der vierten Session fügen wir den Rahmen um das Spielfeld hinzu. Außerdem definieren wir eine Funktion, die uns anzeigt, ob ein Tetromino an einer Stelle eine Kollision erzeugt.

Ziele

  • Globale Konfiguration
  • Rahmen in Spielfeld einfügen
  • Funktion um Kollision zu erkennen

Globale Konfiguration

Um die Spielfeldgröße global einstellen zu können haben wir eine Variable playfield_size eingeführt.

var playfield_size  = {"x": 10, "y": 20};

Rahmen in Spielfeld einfügen

Um den Rahmen um das Spielfeld zu zeichnen, fügen wir in das Spielfeldarray Blöcke mit dem Code "f" (für "frame") ein. Diese Methode hat vor allem den Vorteil, dass wir keine weiteren Funktionen schreiben müssen, die ein Out-of-Bounds der Tetrominos checken müssen. Da der Rahmen Teil des Spielfelds ist, können wir einfach über die Kollisionsdetektion ein Out-of-Bounds verhindern.

Bei der Berechnung der Blockgröße muss der Rahmen dann natürlich berücksichtigt werden, deshalb passen wir die Berechnung an.

var block_size = math.floor(math.min(
	canvas.height()/(playfield_size["y"]+2),
	canvas.width()/(playfield_size["x"]+2)
	));

Bei der Initialisierung des Spielfelds müssen wir die Rahmenblöcke dann einfügen. Zunächst fügen wir die obere Reihe mit Frameblocks hinzu, Spielfeldbreite plus zwei extra Blocks für den Rand.

Danach fügen wir vorne und hinten ein "f" ein um für jede Reihe die Randsteine festzulegen.

Zum Schluss wird wie am Anfang eine Reihe mit Frameblocks eingefügt.

var playfield = [];
playfield.push(Array(playfield_size["x"] + 2, "f"));

for 0:playfield_size["y"] do {
	var row = ["f"];
	for 0:playfield_size["x"] do row.push(0);
	row.push("f");
	playfield.push(row);
};

playfield.push(Array(playfield_size["x"] + 2, "f"));

Funktion um Kollision zu erkennen

Bei Tetris können keine Blöcke übereinanderliegen. Eine weitere zentrale Funktion ist daher Kollisionen im Spielfeld zu erkennen. Die folgende Funktion erfüllt diese Aufgabe. Als Parameter wird ein Spielstand und ein Tetromino übergeben, und sollte eine Kollision vorliegen gibt die Funktion true zurück, ansonsten false.

function check_collision(playfield, column, row, rotation, type){
	 var tetromino = tetrominos[type][rotation];

	 for var i in 0:tetromino.size() do
        for var j in 0:tetromino[i].size() do {
			if tetromino[i][j] != 0 then
			 	if playfield[column + i][row + j] != 0 then
			return true;
	}
	return false;
}