diff options
Diffstat (limited to 'src/Model/Grid.cpp')
| -rw-r--r-- | src/Model/Grid.cpp | 279 |
1 files changed, 143 insertions, 136 deletions
diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp index ed8686f..cc0fe60 100644 --- a/src/Model/Grid.cpp +++ b/src/Model/Grid.cpp @@ -1,5 +1,7 @@ #include "Grid.hpp" +//==================== Constructor and Destructor ==================== + //Constructor Grid::Grid(): m_size(4), m_grid(4){ @@ -16,111 +18,9 @@ Grid::~Grid(){ } -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 - std::stringstream gridBorder; - 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; - //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() << " "; - else - description << "|"<< spaceCol.str() << m_grid.at(i).at(j) ; - } - description << "|"; - description << 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; - return false; -} - -std::tuple<int, int> Grid::getRandomEmptyCellCoord(){ - - //Init list of candidate - std::vector<std::tuple<int, int> > candidates; - - //Construct list of candidates - for(int i=0;i<m_size;i++){ - for(int j=0;j<m_size;j++){ - if(this->isEmpty(i,j)){ - std::tuple<int, int> currentCandidate(i,j); - candidates.push_back(currentCandidate); - } - } - } - - //If no candidate available - if(candidates.size() == 0) - return std::tuple<int, int>(-1, -1); - - //Select the candidates - int winnerIs(rand() % candidates.size()); - - //Return the candidate - return candidates.at(winnerIs); - -} - - - -//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); - - if(i>=0 && i<m_size && j>=0 && j<m_size){ - m_grid.at(i).at(j)=value; - return true; - } - - return false; -} - -//Another setCell method -bool Grid::setCell(int i, int j, int value){ - std::tuple<int, int> coord(i,j); - return this->setCell(coord, value); -} - +//==================== Merge and defragment methods ==================== +//Defragment the line to the right 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++){ @@ -136,24 +36,15 @@ std::vector<int> Grid::rightDefragment(std::vector<int> line){ return line; } +//Defragment the line to the left using right defragmentation 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; - //} - //} - //} - std::vector<int> reversedLine= this->reverseLine(line); return this->reverseLine(this->rightDefragment(reversedLine)); } + +//Merge line to the right std::vector<int> Grid::rightMerge(std::vector<int> line){ for(int i=0; i< m_size-1;i++){ int val1=line.at(i); @@ -169,6 +60,7 @@ std::vector<int> Grid::rightMerge(std::vector<int> line){ return line; } +//Merge line to the left std::vector<int> Grid::leftMerge(std::vector<int> line){ for(int i=m_size-1; i>0;i--){ int val1=line.at(i); @@ -183,22 +75,12 @@ std::vector<int> Grid::leftMerge(std::vector<int> line){ } return line; } -std::vector<int> Grid::swipeLine(std::vector<int> line){ - //Swipe line is : - //- A defragmentation - //- A merging - //- Another defragmentation - line=this->rightDefragment(line); - line=this->rightMerge(line); - line=this->rightDefragment(line); - //Return swiped line - return line; -} +//==================== Swipe methods ==================== -//Swipe to right +//Swipe to the right bool Grid::swipeRight(){ m_lastMoveScore=0; @@ -214,7 +96,7 @@ bool Grid::swipeRight(){ return moveDone; } -//Swipe to right +//Swipe to the left bool Grid::swipeLeft(){ m_lastMoveScore=0; bool moveDone=false; @@ -229,6 +111,7 @@ bool Grid::swipeLeft(){ } +//Swipe to the top bool Grid::swipeUp(){ m_lastMoveScore=0; bool moveDone=false; @@ -243,6 +126,7 @@ bool Grid::swipeUp(){ } return moveDone; } +//Swipe to the bottom bool Grid::swipeDown(){ m_lastMoveScore=0; bool moveDone=false; @@ -259,23 +143,63 @@ bool Grid::swipeDown(){ return moveDone; } -void Grid::setCol(int col, std::vector<int> colVect){ +//==================== Helpers ==================== + +//Get the max len of a string of the numbers in the grid : +// Exemple: +// - 1 return 1 +// - 22 return 2 +// - 120 return 3 +// - 1000 return 4 +//This method help to calculate the columns size +int Grid::maxStrLenInGrid(){ + int max=0; for(int i=0;i<m_size;i++){ - m_grid.at(i).at(col)=colVect.at(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; } -std::vector<int> Grid::getCol(int col){ +//Test if the cell at (i,j) is empty +bool Grid::isEmpty(int i, int j){ + if(m_grid.at(i).at(j) == 0) + return true; + return false; +} - std::vector<int> colVect; +//Return a tuple that contain a random empty cell +std::tuple<int, int> Grid::getRandomEmptyCellCoord(){ + + //Init list of candidate + std::vector<std::tuple<int, int> > candidates; + //Construct list of candidates for(int i=0;i<m_size;i++){ - colVect.push_back(m_grid.at(i).at(col)); + for(int j=0;j<m_size;j++){ + if(this->isEmpty(i,j)){ + std::tuple<int, int> currentCandidate(i,j); + candidates.push_back(currentCandidate); + } + } } - return colVect; + //If no candidate available + if(candidates.size() == 0) + return std::tuple<int, int>(-1, -1); + + //Select the candidates + int winnerIs(rand() % candidates.size()); + + //Return the candidate + return candidates.at(winnerIs); + } +//Reverse a line std::vector<int> Grid::reverseLine(std::vector<int> line){ std::vector<int> reversedLine; @@ -286,7 +210,7 @@ std::vector<int> Grid::reverseLine(std::vector<int> line){ return reversedLine; } - +//Return true if the grid is full. False else. bool Grid::isFull(){ for(int i=0;i<m_size;i++){ @@ -299,6 +223,7 @@ bool Grid::isFull(){ return true; } +//Return true if the grid is full and no move can be performed. False else. bool Grid::isOver(){ if(!this->isFull()) @@ -325,6 +250,7 @@ bool Grid::isOver(){ } +//Return true if line1 is equals to line2. False else. bool Grid::compareLines(std::vector<int> line1, std::vector<int> line2){ for(int i=0;i<m_size;i++){ @@ -335,6 +261,87 @@ bool Grid::compareLines(std::vector<int> line1, std::vector<int> line2){ return true; } +//Return the description of the grid in a string. +//In other terms, the grid in ASCII +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 + std::stringstream gridBorder; + 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; + //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() << " "; + else + description << "|"<< spaceCol.str() << m_grid.at(i).at(j) ; + } + description << "|"; + description << std::endl; + } + description << gridBorder.str() << std::endl << std::endl; + + //Return description + return description.str(); +} + +//==================== Getters and Setters ==================== + +//Getter for m_lastMoveScore int Grid::getLastMoveScore(){ return m_lastMoveScore; } + + +//Change value of cell with a tuple +bool Grid::setCell(std::tuple<int, int> coord, int value){ + 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; + return true; + } + + return false; +} + +//Change value of cell with int +bool Grid::setCell(int i, int j, int value){ + std::tuple<int, int> coord(i,j); + return this->setCell(coord, value); +} + +//Assign a vector to a column. +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); + } +} + +//Retrieve a specific column. +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; +} |
