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;
...
});