Skip to content

Session 05 (17.11.23)

Stephan Frank edited this page Feb 11, 2024 · 2 revisions

In der fünften Session reworken wir den Code in Klassen um die Strukturen auch im Code abzubilden. Der Vorteil davon, dass einzelne Teile des Programms unabhängig voneinander arbeiten ist eine verbesserte Übersichtlichkeit, die sowohl bei Weiterentwicklung als auch bei der Fehlersuche hilft.

Ziele

  • Rework in Klassen: Tetromino, Playfield, Renderer
  • Klasse TetrominoPool um zufällige Tetrominos zu ziehen
  • Aufruf des Programms

Rework in Klassen: Tetromino, Playfield, Renderer

Tetromino

class Tetromino {
public:
	var column, row, rotation, type;

	var tetrominos = { ... };

	constructor(type, column, row = 1, rotation = 0){
		this.column = column;
		this.row = row;
		this.rotation = rotation;
		this.type = type;
	}

	function bitmap(){
		return this.tetrominos[this.type][this.rotation];
	}

	function drop(){
		this.row = this.row + 1;
	}

	function undrop(){
		this.row = this.row - 1;
	}
}

Playfield

class Playfield {
public:
    var bitmap = [];
    var width, height;
    
    constructor(width, height){
        ...
    }
    
    function insert_tetromino(tetromino){
        ...
    }
    
    function remove_tetromino(tetromino){
        ...
    }
    
    function check_collision(tetromino){
        ...
    }
}

Renderer

class Renderer {
	public:
	var block_size;
	var outline_size;
	
	var colors = { ... };

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

		this.outline_size = this.block_size/8;
	}

	function render(playfield) {
        for var column in 0:playfield.bitmap.size() do
	        for var row in 0:playfield.bitmap[column].size() do
	            if (playfield.bitmap[column][row] != 0) then this.draw_block(column, row, playfield.bitmap[column][row]);
	}

    function draw_block(column, row, color) {
        ...
    }
    
    function reset() {
		canvas.setFillColor(1, 1, 1);
		canvas.clear();
	}

}

Klasse TetrominoPool um zufällige Tetrominos zu ziehen

class TetrominoPool{
	public:
	var pool = [];

	function fill_pool(){
		var pool_ = ["o", "s", "z", "i", "j", "l", "t"];

	 	while pool_.size() > 0 do {
			var rand_idx = Integer((math.random() * pool_.size()));
			this.pool.push(pool_[rand_idx]);
			pool_.remove(rand_idx);
		}
	}

	function get(){
		if this.pool.size() == 0 then this.fill_pool();

		return this.pool.pop();
	}
}

Aufruf des Programms

var pool = TetrominoPool();
var tetromino = Tetromino(pool.get(), Integer((playfield_size["x"] + 2)/2 - 2));
var playfield = Playfield(playfield_size["x"], playfield_size["y"]);
var renderer = Renderer();


while true do {
    renderer.reset();   

    playfield.remove_tetromino(tetromino);

    tetromino.drop();
    if playfield.check_collision(tetromino) == true then {
        tetromino.undrop();
        playfield.insert_tetromino(tetromino);
        tetromino = Tetromino(pool.get(), Integer((playfield_size["x"] + 2)/2 - 2));
    }

    playfield.insert_tetromino(tetromino);
    renderer.render(playfield);

    wait(200);
}
Clone this wiki locally