From cfc5d425f68c1a98b86ef91d92ac82785d0f33a2 Mon Sep 17 00:00:00 2001 From: manzerbredes Date: Sun, 3 May 2015 01:09:19 +0200 Subject: Correct bug on merging and pop number --- src/Model/Grid.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 18 deletions(-) (limited to 'src/Model/Grid.cpp') diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp index 30193dd..666f228 100644 --- a/src/Model/Grid.cpp +++ b/src/Model/Grid.cpp @@ -9,7 +9,9 @@ Grid::Grid(): m_size(4), m_grid(4){ m_grid.at(i).push_back(0); } } - + m_grid.at(0).at(0)=2; + m_grid.at(1).at(0)=2; + m_grid.at(2).at(0)=2; } //Destructor @@ -27,20 +29,23 @@ std::string Grid::description(){ //Start to write description std::stringstream gridBorder; - for(int i=0;i<(maxStrLen+2)*4+1;i++){ + for(int i=0;i<(maxStrLen+1)*4+1;i++){ gridBorder<<"-"; } description << std::endl << gridBorder.str() << std::endl; for(int i=0;i Grid::defragmentLine(std::vector line){ +std::vector Grid::rightDefragment(std::vector line){ for(int j=0; j Grid::defragmentLine(std::vector line){ return line; } -std::vector Grid::mergeLine(std::vector line){ +std::vector Grid::leftDefragment(std::vector line){ + for(int j=0; j0;i--){ + int val1=line.at(i); + int val2=line.at(i-1); + + if(val1 != 0 && val2 == 0){ + line.at(i)=0; + line.at(i-1)=val1; + } + } + } + return line; +} +std::vector Grid::rightMerge(std::vector line){ for(int i=0; i< m_size-1;i++){ int val1=line.at(i); int val2=line.at(i+1); @@ -148,15 +167,28 @@ std::vector Grid::mergeLine(std::vector line){ return line; } +std::vector Grid::leftMerge(std::vector line){ + for(int i=m_size-1; i>0;i--){ + int val1=line.at(i); + int val2=line.at(i-1); + + if(val1==val2){ + line.at(i)=0; + line.at(i-1)=val1*2; + i--; + } + } + return line; +} std::vector Grid::swipeLine(std::vector line){ //Swipe line is : //- A defragmentation //- A merging //- Another defragmentation - line=this->defragmentLine(line); - line=this->mergeLine(line); - line=this->defragmentLine(line); + line=this->rightDefragment(line); + line=this->rightMerge(line); + line=this->rightDefragment(line); //Return swiped line return line; @@ -164,31 +196,60 @@ std::vector Grid::swipeLine(std::vector line){ //Swipe to right -void Grid::swipeRight(){ +bool Grid::swipeRight(){ + + bool moveDone=false; for(int i=0; iswipeLine(m_grid.at(i)); + std::vector swipedLine(this->rightDefragment(this->leftMerge(this->rightDefragment(m_grid.at(i))))); + + if(!this->compareLines(m_grid.at(i), swipedLine)){ + moveDone=true; + m_grid.at(i)=swipedLine; + } } + return moveDone; } //Swipe to right -void Grid::swipeLeft(){ +bool Grid::swipeLeft(){ + bool moveDone=false; for(int i=0; ireverseLine(this->swipeLine(this->reverseLine(m_grid.at(i)))); + std::vector swipedLine(this->leftDefragment(this->rightMerge(this->leftDefragment(m_grid.at(i))))); + if(!this->compareLines(m_grid.at(i), swipedLine)){ + moveDone=true; + m_grid.at(i)=swipedLine; + } } + return moveDone; } -void Grid::swipeUp(){ +bool Grid::swipeUp(){ + bool moveDone=false; for(int i=0; i colVect=this->getCol(i); - this->setCol(i,this->reverseLine(this->swipeLine(this->reverseLine(colVect)))); + + std::vector swipedLine(this->leftDefragment(this->rightMerge(this->leftDefragment(colVect)))); + if(!this->compareLines(colVect, swipedLine)){ + moveDone=true; + this->setCol(i,swipedLine); + } } + return moveDone; } -void Grid::swipeDown(){ +bool Grid::swipeDown(){ + bool moveDone=false; for(int i=0; i colVect=this->getCol(i); - this->setCol(i,this->swipeLine(colVect)); + + std::vector swipedLine(this->rightDefragment(this->leftMerge(this->rightDefragment(colVect)))); + + if(!this->compareLines(colVect, swipedLine)){ + moveDone=true; + this->setCol(i,swipedLine); + } } + return moveDone; } void Grid::setCol(int col, std::vector colVect){ @@ -256,3 +317,13 @@ bool Grid::isOver(){ } + +bool Grid::compareLines(std::vector line1, std::vector line2){ + + for(int i=0;i