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));
}
void BlockClump::addBlockOnTopOf(int col,BlockColor color){
void BlockClump::addBlockOnTopOf(int col,BlockColor color,int defaultY){
int highestY=999999;
for (Block&b:blocks) {
if (b.pos.x/12==col&&b.pos.y<=highestY) {
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){
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,int row,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.
vf2d getBlockPosition(Block&b);
void sortBlocks();
};
#endif

@ -12,6 +12,11 @@ Board::Board(vi2d boardSize,float gravity,float maxGravity,float launchSpd,float
for (int i=0;i<boardSize.x;i++) {
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){
@ -73,7 +78,9 @@ void Board::convertClump(int ind){
}
}
for (BlockClump&bc:clumpsToAdd) {
bc.sortBlocks();
clumps.push_back(bc);
}
removeClump(ind);
}

Binary file not shown.

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

Loading…
Cancel
Save