Session 02 (27.10.23) - RUB-INI-Theory-of-Machine-Learning/Info1_WS23-24 GitHub Wiki

In der zweiten Session werden wir die grafische Ausgabe von Tetris weiter entwickeln. Wir werden das Spielfeld zeichnen, die Blockgröße anhand des Canvasgröße berechnen und wir werden Funktionen benutzen, um das Zeichnen der Tetrominos zu vereinfachen.

Ziele

  • Funktion um einen Block zu zeichnen
  • Blockgröße anhand der Spielfeldgröße bestimmen
  • Kompletten Tetromino zeichnen und fallen lassen

Zusammenfassung

Funktion um einen Block zu zeichnen

Damit wir in Zukunft nicht immer wieder Code schreiben müssen, um einen Block auf den Canvas zu zeichnen, verschieben wir den Code dafür in eine eigene Funktion draw_block(pos_x, pos_y, color).

Funktionen dienen dazu, dass wir den Code, der an mehreren Stellen gebraucht wird, nicht ständig neu schreiben müssen.

Diese Funktion hat als Parameter (Eingabewerte) pos_x, pos_y und color. Die Position wird in pos_x, pos_y übergeben. Beide Größen sind in der Einheit Block anzugeben. Dies muss innerhalb der Funktion noch in Pixel umgerechnet werden.

pos_x = pos_x * block_size;
pos_y = pos_y * block_size;

Die Farbe wird als String in dem Parameter color übergeben. Dazu definieren wir eine globale Variable des Typs dictionary, welches die RGB-Werte für die jeweiligen Farben der Tetromino Blöcke enthält.

var colors = {
	"yellow": {
		"base": [204, 204, 0],
		"light": [255, 255, 0],
		"dark": [153, 153, 0]
	}
};

Funktionen dienen außerdem dazu, layers of abstraction zu erschaffen, in dem low-level Probleme in ihren jeweiligen Funktionen zu behandeln und sich auf höherer Abstraktionsebene vollkommen um die dortigen Probleme zu kümmern.

Beispielsweise haben wir die Umrechnung von Blöcken in Pixel in draw_block untergebracht. Dadurch können wir im Rest des Programms in Blöcken denken und müssen uns um die Umrechnung in Pixel nicht mehr kümmern.

Die Farben für den Block rufen wir dann beispielsweise folgendermaßen auf (in diesem Fall für die light Variante der Farbe):

colors[color]["light"][0]

Blockgröße anhand der Spielfeldgröße bestimmen

Bisher haben wir die Blockgröße anhand der maximalen Breite bestimmt. Wir müssen auch die Höhe berücksichtigen, um sicherzustellen, dass das Spielfeld immer komplett angezeigt werden kann. Hierfür berechnen wir die Blocksize für die Höhe und für die Breite und nehmen den kleineren Wert.

var block_size = math.min(canvas.width()/10, canvas.height()/20);

Kompletten Tetromino zeichnen und fallen lassen

Zum Abschluss lassen wir einmal einen kompletten Tetromino fallen. Da wir jetzt Blöcke mittels der Funktion draw_block() zeichnen können, gestaltet sich dies Vergleichsweise einfach.

# Within the loop
draw_block(pos_x, pos_y, "yellow");
draw_block(pos_x+1, pos_y+1, "yellow");
draw_block(pos_x+1, pos_y, "yellow");
draw_block(pos_x, pos_y+1, "yellow");

Commit zur Session