diff options
Diffstat (limited to 'src/Model/Grid.cpp')
| -rw-r--r-- | src/Model/Grid.cpp | 107 |
1 files changed, 89 insertions, 18 deletions
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<m_size;i++){ for(int j=0;j<m_size;j++){ std::stringstream spaceCol; - for(int k=0;k<maxStrLen-std::to_string(m_grid.at(i).at(j)).size();k++){ + //Get number of space needed in cell + int nbSpace=maxStrLen-std::to_string(m_grid.at(i).at(j)).size(); + + for(int k=0;k<nbSpace;k++){ spaceCol << " "; } if(m_grid.at(i).at(j) == 0) - description << "| " << " " << spaceCol.str(); + description << "|" << spaceCol.str() << " "; else - description << "| " << m_grid.at(i).at(j) << spaceCol.str(); + description << "|"<< spaceCol.str() << m_grid.at(i).at(j) ; } description << "|"; description << std::endl; @@ -119,7 +124,7 @@ bool Grid::setCell(int i, int j, int value){ } -std::vector<int> Grid::defragmentLine(std::vector<int> line){ +std::vector<int> Grid::rightDefragment(std::vector<int> line){ for(int j=0; j<m_size-1;j++){ for(int i=0; i<m_size-1;i++){ int val1=line.at(i); @@ -134,7 +139,21 @@ std::vector<int> Grid::defragmentLine(std::vector<int> line){ return line; } -std::vector<int> Grid::mergeLine(std::vector<int> line){ +std::vector<int> Grid::leftDefragment(std::vector<int> line){ + for(int j=0; j<m_size-1;j++){ + for(int i=m_size-1; i>0;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<int> Grid::rightMerge(std::vector<int> 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<int> Grid::mergeLine(std::vector<int> line){ return line; } +std::vector<int> Grid::leftMerge(std::vector<int> 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<int> Grid::swipeLine(std::vector<int> 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<int> Grid::swipeLine(std::vector<int> line){ //Swipe to right -void Grid::swipeRight(){ +bool Grid::swipeRight(){ + + bool moveDone=false; for(int i=0; i<m_size;i++){ - m_grid.at(i)=this->swipeLine(m_grid.at(i)); + std::vector<int> 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; i<m_size;i++){ - m_grid.at(i)=this->reverseLine(this->swipeLine(this->reverseLine(m_grid.at(i)))); + std::vector<int> 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<m_size;i++){ std::vector<int> colVect=this->getCol(i); - this->setCol(i,this->reverseLine(this->swipeLine(this->reverseLine(colVect)))); + + std::vector<int> 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<m_size;i++){ std::vector<int> colVect=this->getCol(i); - this->setCol(i,this->swipeLine(colVect)); + + std::vector<int> 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<int> colVect){ @@ -256,3 +317,13 @@ bool Grid::isOver(){ } + +bool Grid::compareLines(std::vector<int> line1, std::vector<int> line2){ + + for(int i=0;i<m_size;i++){ + + if(line1.at(i) != line2.at(i)) + return false; + } + return true; +} |
