Block matching

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent cd95a546bd
commit 2a50fb0fff
  1. 3
      Block.h
  2. 4
      Board.cpp
  3. 3
      Board.h
  4. BIN
      C++ProjectTemplate
  5. BIN
      assets/blocks_test.png
  6. 79
      main.cpp

@ -12,7 +12,8 @@ enum class BlockColor{
LIGHT, LIGHT,
DARK, DARK,
SOUL, SOUL,
TIME TIME,
LAUNCHED,
}; };
class Block{ class Block{

@ -5,8 +5,8 @@ extern Meteos*game;
Board::Board() Board::Board()
:colorHandler({}){} :colorHandler({}){}
Board::Board(vi2d boardSize,float gravity,float spawnRate,std::array<int,10> colorRates,Renderable&tileset) Board::Board(vi2d boardSize,float gravity,float launchSpd,float spawnRate,std::array<int,10> colorRates,Renderable&tileset)
:boardSize(boardSize),gravity(gravity),spawnRate(spawnRate),colorHandler(colorRates),tileset(tileset.Decal()){ :boardSize(boardSize),gravity(gravity),launchSpd(launchSpd),spawnRate(spawnRate),colorHandler(colorRates),tileset(tileset.Decal()){
drawOffset={(float)game->ScreenWidth()/2-boardSize.x/2*12,(float)game->ScreenHeight()/2-boardSize.y/2*12}; drawOffset={(float)game->ScreenWidth()/2-boardSize.x/2*12,(float)game->ScreenHeight()/2-boardSize.y/2*12};
yBottom=(boardSize.y-1)*12; yBottom=(boardSize.y-1)*12;
for (int i=0;i<boardSize.x;i++) { for (int i=0;i<boardSize.x;i++) {

@ -39,8 +39,9 @@ class Board{
vi2d boardSize; vi2d boardSize;
float gravity; float gravity;
float spawnRate; float spawnRate;
float launchSpd;
Board(); Board();
Board(vi2d boardSize,float gravity,float spawnRate,std::array<int,10> colorRates,Renderable&tileset); Board(vi2d boardSize,float gravity,float launchSpd,float spawnRate,std::array<int,10> colorRates,Renderable&tileset);
void spawnBlock(int col); void spawnBlock(int col);
std::vector<Block>&getBlocks(int col); std::vector<Block>&getBlocks(int col);
std::vector<BlockClump>&getBlockClumps(); std::vector<BlockClump>&getBlockClumps();

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 759 B

After

Width:  |  Height:  |  Size: 6.1 KiB

@ -16,7 +16,7 @@ bool Meteos::OnUserCreate()
randBlockPos=std::uniform_int_distribution<>(0, 9); randBlockPos=std::uniform_int_distribution<>(0, 9);
coinFlip=std::uniform_int_distribution<>(0, 1); coinFlip=std::uniform_int_distribution<>(0, 1);
gameBoard=Board({10,14},12.f,3.0f,{3,3,2,3,2,3,0,0,0,0},SPRITES["blocks_test.png"]); gameBoard=Board({10,14},12.f,-20.f,3.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]);
return true; return true;
} }
@ -102,6 +102,83 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
} }
nextClump:; nextClump:;
} }
for (BlockClump&c:gameBoard.getBlockClumps()){
for (Block&b:c.getBlocks()) {
float targetX=b.pos.x;
float targetY=b.pos.y;
bool found=false;
std::vector<Block*>matchedBlocksX;
std::vector<Block*>matchedBlocksY;
matchedBlocksX.push_back(&b);
matchedBlocksY.push_back(&b);
rightCheck:
float checkX=targetX+12;
float checkY=targetY;
do{
found=false;
for (Block&b2:c.getBlocks()){
if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true;
checkX+=12;
matchedBlocksX.push_back(&b2);
}
}
}while(found);
leftCheck:
checkX=targetX-12;
checkY=targetY;
do{
found=false;
for (Block&b2:c.getBlocks()){
if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true;
checkX-=12;
matchedBlocksX.push_back(&b2);
}
}
}while(found);
upCheck:
checkX=targetX;
checkY=targetY-12;
do{
found=false;
for (Block&b2:c.getBlocks()){
if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true;
checkY-=12;
matchedBlocksY.push_back(&b2);
}
}
}while(found);
downCheck:
checkX=targetX;
checkY=targetY+12;
do{
found=false;
for (Block&b2:c.getBlocks()){
if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true;
checkY+=12;
matchedBlocksY.push_back(&b2);
}
}
}while(found);
if (matchedBlocksX.size()>2) {
for (Block*b2:matchedBlocksX) {
b2->col=BlockColor::LAUNCHED;
}
}
if (matchedBlocksY.size()>2) {
for (Block*b2:matchedBlocksY) {
b2->col=BlockColor::LAUNCHED;
}
}
}
}
for (int i=0;i<gameBoard.boardSize.x;i++){ for (int i=0;i<gameBoard.boardSize.x;i++){
for (int y=0;y<gameBoard.getBlocks(i).size();y++){ for (int y=0;y<gameBoard.getBlocks(i).size();y++){
Block&b=gameBoard.getBlocks(i)[y]; Block&b=gameBoard.getBlocks(i)[y];

Loading…
Cancel
Save