Session 05 (17.11.23) - RUB-INI-Theory-of-Machine-Learning/Info1_WS23-24 GitHub Wiki
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);
}