diff options
Diffstat (limited to 'src/Model/Grid.cpp')
| -rw-r--r-- | src/Model/Grid.cpp | 170 |
1 files changed, 164 insertions, 6 deletions
diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp index 92837f6..3a8a075 100644 --- a/src/Model/Grid.cpp +++ b/src/Model/Grid.cpp @@ -22,24 +22,48 @@ std::string Grid::description(){ //Init stringstream description std::stringstream description; + //Get max str len of the grid + int maxStrLen=this->maxStrLenInGrid(); + //Start to write description - description << "-----------------" << std::endl; + std::stringstream gridBorder; + for(int i=0;i<(maxStrLen+2)*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++){ + spaceCol << " "; + } if(m_grid.at(i).at(j) == 0) - description << "| " << " " << " "; + description << "| " << " " << spaceCol.str(); else - description << "| " << m_grid.at(i).at(j) << " "; + description << "| " << m_grid.at(i).at(j) << spaceCol.str(); } description << "|"; description << std::endl; } - description << "-----------------" << std::endl << std::endl; + description << gridBorder.str() << std::endl << std::endl; //Return description return description.str(); } + +int Grid::maxStrLenInGrid(){ + int max=0; + for(int i=0;i<m_size;i++){ + for(int j=0;j<m_size;j++){ + std::string number=std::to_string(m_grid.at(i).at(j)); + if(number.size() > max) + max=number.size(); + } + } + return max; +} + bool Grid::isEmpty(int i, int j){ if(m_grid.at(i).at(j) == 0) return true; @@ -77,8 +101,8 @@ std::tuple<int, int> Grid::getRandomEmptyCellCoord(){ //Change value of cell bool Grid::setCell(std::tuple<int, int> coord, int value){ - int i=std::get<0>(coord); - int j=std::get<1>(coord); + int i=std::get<0>(coord); + int j=std::get<1>(coord); if(i>=0 && i<m_size && j>=0 && j<m_size){ m_grid.at(i).at(j)=value; @@ -95,6 +119,140 @@ bool Grid::setCell(int i, int j, int value){ } +std::vector<int> Grid::defragmentLine(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); + 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::mergeLine(std::vector<int> line){ + for(int i=0; i< m_size-1;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); + + //Return swiped line + return line; +} + + +//Swipe to right +void Grid::swipeRight(){ + for(int i=0; i<m_size;i++){ + m_grid.at(i)=this->swipeLine(m_grid.at(i)); + } +} + +//Swipe to right +void Grid::swipeLeft(){ + for(int i=0; i<m_size;i++){ + m_grid.at(i)=this->reverseLine(this->swipeLine(this->reverseLine(m_grid.at(i)))); + } +} + + +void Grid::swipeUp(){ + 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)))); + } +} +void Grid::swipeDown(){ + for(int i=0; i<m_size;i++){ + std::vector<int> colVect=this->getCol(i); + this->setCol(i,this->swipeLine(colVect)); + } +} + +void Grid::setCol(int col, std::vector<int> colVect){ + for(int i=0;i<m_size;i++){ + m_grid.at(i).at(col)=colVect.at(i); + } +} + +std::vector<int> Grid::getCol(int col){ + + std::vector<int> colVect; + + for(int i=0;i<m_size;i++){ + colVect.push_back(m_grid.at(i).at(col)); + } + + return colVect; +} + +std::vector<int> Grid::reverseLine(std::vector<int> line){ + std::vector<int> reversedLine; + + for(int j=m_size-1; j>=0;j--){ + reversedLine.push_back(line.at(j)); + } + + return reversedLine; +} + + +bool Grid::isFull(){ + + for(int i=0;i<m_size;i++){ + for(int j=0;j<m_size;j++){ + if(m_grid.at(i).at(j) == 0) + return false; + } + } + + return true; +} + +bool Grid::isOver(){ + + if(!this->isFull()) + return false; + + for(int i=0;i<m_size;i++){ + for(int j=0;j<m_size-1;j++){ + if(m_grid.at(i).at(j) == m_grid.at(i).at(j+1)) + return false; + } + } + + for(int i=0;i<m_size;i++){ + std::vector<int> colVect(this->getCol(i)); + + for(int j=0;j<m_size-1;j++){ + if(colVect.at(j) == colVect.at(j+1)) + return false; + } + } + + return true; + + +} |
