-
Notifications
You must be signed in to change notification settings - Fork 1
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.
- Rework in Klassen: Tetromino, Playfield, Renderer
- Klasse TetrominoPool um zufällige Tetrominos zu ziehen
- Aufruf des Programms
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;
}
}
class Playfield {
public:
var bitmap = [];
var width, height;
constructor(width, height){
...
}
function insert_tetromino(tetromino){
...
}
function remove_tetromino(tetromino){
...
}
function check_collision(tetromino){
...
}
}
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();
}
}
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();
}
}
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);
}