From fff9118e175516988434fb4f765be853dac0a98e Mon Sep 17 00:00:00 2001 From: nick black Date: Wed, 25 Mar 2020 23:03:56 -0400 Subject: [PATCH] tetris: factor out LockPiece() --- src/tetris/clear.h | 14 ++++++++++++++ src/tetris/lock.h | 35 +++++++++++++++++++++++++++++++++++ src/tetris/main.cpp | 2 ++ src/tetris/movedown.h | 20 +------------------- 4 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 src/tetris/clear.h create mode 100644 src/tetris/lock.h diff --git a/src/tetris/clear.h b/src/tetris/clear.h new file mode 100644 index 000000000..347d22a1e --- /dev/null +++ b/src/tetris/clear.h @@ -0,0 +1,14 @@ +// returns true iff the specified row of the board is clear (full with no gaps) +bool LineClear(int y){ + int dimx = board_->get_dim_x(); + for(int x = 1 ; x < dimx - 1 ; ++x){ + ncpp::Cell c; + if(board_->get_at(y, x, &c) < 0){ + throw TetrisNotcursesErr("get_at()"); + } + if(!c.get().gcluster || c.get().gcluster == ' '){ + return false; + } + } + return true; +} diff --git a/src/tetris/lock.h b/src/tetris/lock.h new file mode 100644 index 000000000..e4741b213 --- /dev/null +++ b/src/tetris/lock.h @@ -0,0 +1,35 @@ +void LockPiece(){ + curpiece_->mergedown(*board_); + if(!board_->cursor_move(0, 1)){ + throw TetrisNotcursesErr("cursor_move()"); + } + int bdimy, bdimx; + board_->get_dim(&bdimy, &bdimx); + int cleared; // how many contiguous lines were cleared + do{ + uint64_t tl, tr, bl, br; + tl = tr = bl = br = 0; + channels_set_bg_alpha(&tl, CELL_ALPHA_TRANSPARENT); + channels_set_bg_alpha(&tr, CELL_ALPHA_TRANSPARENT); + channels_set_bg_alpha(&bl, CELL_ALPHA_TRANSPARENT); + channels_set_bg_alpha(&br, CELL_ALPHA_TRANSPARENT); + channels_set_fg(&tl, 0xff0000); + channels_set_fg(&tr, 0x00ff00); + channels_set_fg(&bl, 0x0000ff); + channels_set_fg(&br, 0x00ffff); + if(!board_->stain(bdimy - 2, bdimx - 2, tl, tr, bl, br)){ + throw TetrisNotcursesErr("stain()"); + } + cleared = 0; + for(int y = bdimy - 2 ; y > 0 ; --y){ + if(LineClear(y)){ + ++cleared; + }else if(cleared){ + break; + } + } + if(cleared){ + // FIXME purge them, augment score + } + }while(cleared); +} diff --git a/src/tetris/main.cpp b/src/tetris/main.cpp index 356f52718..608b1a552 100644 --- a/src/tetris/main.cpp +++ b/src/tetris/main.cpp @@ -46,6 +46,8 @@ public: #include "gravity.h" #include "ticker.h" +#include "clear.h" +#include "lock.h" #include "movedown.h" #include "moveleft.h" #include "moveright.h" diff --git a/src/tetris/movedown.h b/src/tetris/movedown.h index 1a709b99f..390cc71c1 100644 --- a/src/tetris/movedown.h +++ b/src/tetris/movedown.h @@ -7,25 +7,7 @@ bool MoveDown() { if(y <= board_top_y_ - 1){ return true; } - curpiece_->mergedown(*board_); - if(!board_->cursor_move(0, 1)){ - throw TetrisNotcursesErr("cursor_move()"); - } - int bdimy, bdimx; - board_->get_dim(&bdimy, &bdimx); - uint64_t tl, tr, bl, br; - tl = tr = bl = br = 0; - channels_set_bg_alpha(&tl, CELL_ALPHA_TRANSPARENT); - channels_set_bg_alpha(&tr, CELL_ALPHA_TRANSPARENT); - channels_set_bg_alpha(&bl, CELL_ALPHA_TRANSPARENT); - channels_set_bg_alpha(&br, CELL_ALPHA_TRANSPARENT); - channels_set_fg(&tl, 0xff0000); - channels_set_fg(&tr, 0x00ff00); - channels_set_fg(&bl, 0x0000ff); - channels_set_fg(&br, 0x00ffff); - if(!board_->stain(bdimy - 2, bdimx - 2, tl, tr, bl, br)){ - throw TetrisNotcursesErr("stain()"); - } + LockPiece(); curpiece_ = NewPiece(); }else{ ++y;