Session 07 (01.12.23) - RUB-INI-Theory-of-Machine-Learning/Info1_WS23-24 GitHub Wiki

In der siebten Session entfernen wir volle Reihen und zählen die Anzahl aller Lines. Daraus berechnen wir den Level, der die Fallgeschwindigkeit bestimmt. Hierfür machen wir die Gravity variabel, abhängig vom Level. Außerdem führen wir den Soft-Drop ein und zählen Punkte, die sowohl von entfernten Lines als auch vom Soft-Drop kommen.

Ziele

  • Volle Reihen entfernen
  • Level und Gravity
  • Lines und Punkte zählen
  • Soft-Drop

Volle Reihen entfernen

class Playfield {

    ... 

    function remove_full_rows(){
        var full_rows = [];
    
        for var row in 1:this.bitmap.size()-1 do {
            var is_full = true;
            for var column in 0:this.bitmap[row].size() do {
                if this.bitmap[row][column] == 0 then {
                    is_full = false;
                    break;
                }
                # if column == this.bitmap[row].size()-1 then full_rows.push(row);
    
            }
            if is_full then full_rows.push(row);
        }
    
    
        for var row_idx in full_rows do {
            this.bitmap.remove(row_idx);
            var row = ["f"];
            for 0:this.width do row.push(0);
            row.push("f");
            this.bitmap.insert(1, row);
        }
    
        return full_rows.size();
    }

    ...

}

Level und Gravity

var level_gravity = [
        887, 	#level 0
        820,  	#level 1
        753,	#level 2
        686,	#level 3
        619,	#level 4
        552,	#level 5
        469,	#level 6
        368,	#level 7
        285,	#level 8
        184,	#level 9
        167, 	#level 10
        151,	#level 11
        134,	#level 12
        117,	#level 13
        100,	#level 14
        100,	#level 15
        84,     #level 16
        84,     #level 17
        67,     #level 18
        67,     #level 19
        50,     #level 20
    ];

var base_score_values = [0, 40, 100, 300, 1200];
var level = 0;
var gravity = level_gravity[level];

Lines und Punkte zählen


var lines = 0;
var score = 0;

setEventHandler("timer", function(event) {

    ...
    
    var cleared_rows = playfield.remove_full_rows();
    score = score + base_score_values[cleared_rows] * (level + 1);
    
    lines = lines + cleared_rows;
    if this.lines // 10 > this.level and this.level < this.level_gravity.size() then this.level = this.lines // 10;

    ...
    
});

Soft-Drop

var soft_drop_start = 0;
setEventHandler("canvas.keydown", function(event){

    ...
    
    if event.key == " " then {
        if soft_drop_start == 0 then soft_drop_start = Integer(tetromino.row);
        gravity = 50;
    };
    
    ...
    
}
setEventHandler("canvas.keyup", function(event){
    if event.key == " " then {
        soft_drop_start = 0;
        gravity = level_gravity[level];
    }
});
setEventHandler("timer", function(event) {

    ...

    var soft_drop_points = tetromino.row - soft_drop_start;
    score = score + base_score_values[cleared_rows] * (level + 1) + soft_drop_points;
    
    ...

});