Block sorting and bugfixing matching algorithm

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent d090c24aeb
commit 4745003c88
  1. 10
      BlockClump.cpp
  2. 3
      BlockClump.h
  3. 7
      Board.cpp
  4. BIN
      C++ProjectTemplate
  5. 29
      main.cpp

@ -16,16 +16,22 @@ void BlockClump::addBlock(vf2d offset,BlockColor color){
blocks.push_back(Block(offset,color)); blocks.push_back(Block(offset,color));
} }
void BlockClump::addBlockOnTopOf(int col,BlockColor color){ void BlockClump::addBlockOnTopOf(int col,BlockColor color,int defaultY){
int highestY=999999; int highestY=999999;
for (Block&b:blocks) { for (Block&b:blocks) {
if (b.pos.x/12==col&&b.pos.y<=highestY) { if (b.pos.x/12==col&&b.pos.y<=highestY) {
highestY=b.pos.y; highestY=b.pos.y;
} }
} }
addBlock(col,(highestY==999999)?0:highestY/12-1,color); addBlock(col,(highestY==999999)?defaultY/12:highestY/12-1,color);
} }
vf2d BlockClump::getBlockPosition(Block&b){ vf2d BlockClump::getBlockPosition(Block&b){
return {b.pos.x,b.pos.y+y}; return {b.pos.x,b.pos.y+y};
}
void BlockClump::sortBlocks(){
std::sort(blocks.begin(),blocks.end(),[](Block&b1,Block&b2){
return b1.pos.y>b2.pos.y;
});
} }

@ -16,8 +16,9 @@ class BlockClump{
void addBlock(int col,BlockColor color); void addBlock(int col,BlockColor color);
void addBlock(int col,int row,BlockColor color); void addBlock(int col,int row,BlockColor color);
void addBlock(vf2d offset,BlockColor color); void addBlock(vf2d offset,BlockColor color);
void addBlockOnTopOf(int col,BlockColor color); void addBlockOnTopOf(int col,BlockColor color,int defaultY);
//Get a block's position relative to this block clump. //Get a block's position relative to this block clump.
vf2d getBlockPosition(Block&b); vf2d getBlockPosition(Block&b);
void sortBlocks();
}; };
#endif #endif

@ -12,6 +12,11 @@ Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float
for (int i=0;i<boardSize.x;i++) { for (int i=0;i<boardSize.x;i++) {
cols.push_back(std::vector<Block>()); cols.push_back(std::vector<Block>());
} }
cols[3].push_back({{3*12,6*12},BlockColor::RED});
cols[4].push_back({{4*12,8*12},BlockColor::RED});
cols[4].push_back({{4*12,7*12},BlockColor::RED});
cols[4].push_back({{4*12,6*12},BlockColor::RED});
cols[5].push_back({{5*12,6*12},BlockColor::RED});
} }
void Board::spawnBlock(int col){ void Board::spawnBlock(int col){
@ -73,7 +78,9 @@ void Board::convertClump(int ind){
} }
} }
for (BlockClump&bc:clumpsToAdd) { for (BlockClump&bc:clumpsToAdd) {
bc.sortBlocks();
clumps.push_back(bc); clumps.push_back(bc);
} }
removeClump(ind); removeClump(ind);
} }

Binary file not shown.

@ -17,6 +17,7 @@ bool Meteos::OnUserCreate()
coinFlip=std::uniform_int_distribution<>(0, 1); coinFlip=std::uniform_int_distribution<>(0, 1);
gameBoard=Board({10,14},20.f,100.f,-60.f,1.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]); gameBoard=Board({10,14},20.f,100.f,-60.f,1.0f,{3,0,0,0,0,0,0,0,0,0},SPRITES["blocks_test.png"]);
return true; return true;
} }
@ -128,9 +129,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (i==j)continue; if (i==j)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkX+=12; checkX+=12;
tempMatchIDsX.push_back(j); tempMatchIDsX.push_back(j);
break;
} }
} }
}while(found); }while(found);
@ -144,9 +145,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (i==j)continue; if (i==j)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkX-=12; checkX-=12;
tempMatchIDsX.push_back(j); tempMatchIDsX.push_back(j);
break;
} }
} }
}while(found); }while(found);
@ -160,9 +161,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (i==j)continue; if (i==j)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkY-=12; checkY-=12;
tempMatchIDsY.push_back(j); tempMatchIDsY.push_back(j);
break;
} }
} }
}while(found); }while(found);
@ -176,9 +177,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (i==j)continue; if (i==j)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkY+=12; checkY+=12;
tempMatchIDsY.push_back(j); tempMatchIDsY.push_back(j);
break;
} }
} }
}while(found); }while(found);
@ -205,7 +206,6 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
} }
for (int i:matchedBlockIDs) { for (int i:matchedBlockIDs) {
Block&b=c.getBlocks()[i]; Block&b=c.getBlocks()[i];
std::cout<<"Launch Block ("<<b.pos<<")"<<b.addedToLaunchList<<std::endl;
b.col=BlockColor::LAUNCHED; b.col=BlockColor::LAUNCHED;
c.vspeed=gameBoard.launchSpd; c.vspeed=gameBoard.launchSpd;
} }
@ -234,9 +234,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
Block&b2=gameBoard.getBlocks(i+checkX)[k]; Block&b2=gameBoard.getBlocks(i+checkX)[k];
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX*12<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
tempMatchIDsX.push_back({i+checkX,k}); tempMatchIDsX.push_back({i+checkX,k});
checkX++; checkX++;
break;
} }
} }
} }
@ -251,9 +251,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
Block&b2=gameBoard.getBlocks(i+checkX)[k]; Block&b2=gameBoard.getBlocks(i+checkX)[k];
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==b.pos.x+checkX*12&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX*12<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
tempMatchIDsX.push_back({i+checkX,k}); tempMatchIDsX.push_back({i+checkX,k});
checkX--; checkX--;
break;
} }
} }
} }
@ -268,9 +268,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (j==k)continue; if (j==k)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkY-=12; checkY-=12;
tempMatchIDsY.push_back({i,k}); tempMatchIDsY.push_back({i,k});
break;
} }
} }
}while(found); }while(found);
@ -284,9 +284,9 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (j==k)continue; if (j==k)continue;
if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) { if (b.col==b2.col&&b2.col!=BlockColor::LAUNCHED&&b2.pos.x==checkX&&b2.pos.y==checkY) {
found=true; found=true;
std::cout<<"Found match @ ("<<checkX<<","<<checkY<<") Block ("<<b2.pos<<")"<<b2.addedToLaunchList<<std::endl;
checkY+=12; checkY+=12;
tempMatchIDsY.push_back({i,k}); tempMatchIDsY.push_back({i,k});
break;
} }
} }
}while(found); }while(found);
@ -314,13 +314,14 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
if (matchedBlockIDs.size()>0) { if (matchedBlockIDs.size()>0) {
BlockClump c; BlockClump c;
bool firstBlock=true; bool firstBlock=true;
int baseBlockPos;
for (std::pair<int,int>&info:matchedBlockIDs) { for (std::pair<int,int>&info:matchedBlockIDs) {
Block&b=gameBoard.getBlocks(info.first)[info.second]; Block&b=gameBoard.getBlocks(info.first)[info.second];
if (firstBlock) { if (firstBlock) {
c.y=b.pos.y-1; baseBlockPos=b.pos.y;
c.y=baseBlockPos-1;
firstBlock=false; firstBlock=false;
} }
std::cout<<"Launch Block ("<<b.pos<<")"<<b.addedToLaunchList<<std::endl;
b.col=BlockColor::LAUNCHED; b.col=BlockColor::LAUNCHED;
c.vspeed=gameBoard.launchSpd; c.vspeed=gameBoard.launchSpd;
} }
@ -328,7 +329,11 @@ bool Meteos::OnUserUpdate(float fElapsedTime)
Block&b=gameBoard.getBlocks(info.first)[info.second]; Block&b=gameBoard.getBlocks(info.first)[info.second];
for (Block&b2:gameBoard.getBlocks(b.pos.x/12)) { for (Block&b2:gameBoard.getBlocks(b.pos.x/12)) {
if (!b2.markedForRemoval&&b2.pos.y<=b.pos.y) { if (!b2.markedForRemoval&&b2.pos.y<=b.pos.y) {
c.addBlockOnTopOf(b.pos.x/12,b2.col); if (b.pos.x==b2.pos.x&&b.pos.y==b2.pos.y){
c.addBlockOnTopOf(b.pos.x/12,b2.col,b2.pos.y-baseBlockPos);
} else {
c.addBlockOnTopOf(b.pos.x/12,b2.col,0);
}
b2.markedForRemoval=true; b2.markedForRemoval=true;
} }
} }

Loading…
Cancel
Save