diff options
| author | manzerbredes <loic.guegan_secondary@yahoo.fr> | 2015-05-02 23:05:44 +0200 |
|---|---|---|
| committer | manzerbredes <loic.guegan_secondary@yahoo.fr> | 2015-05-02 23:05:44 +0200 |
| commit | 710cc4001f65ac2fee39e25d79f43a01b9e12512 (patch) | |
| tree | 2e78e337b0c7d0f79bd68205badc1630326118ed /src/Model/Grid.cpp | |
| parent | fec126f0d2d48310109f85c3647b10ce393db5e8 (diff) | |
| parent | 1d09a0fd3ae35ccf51a3b5f929f77a8c8850712c (diff) | |
First stable fusionning
Diffstat (limited to 'src/Model/Grid.cpp')
| -rw-r--r-- | src/Model/Grid.cpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp new file mode 100644 index 0000000..3a8a075 --- /dev/null +++ b/src/Model/Grid.cpp @@ -0,0 +1,258 @@ +#include "Grid.hpp" + +//Constructor +Grid::Grid(): m_size(4), m_grid(4){ + + //Init all cells + for(int i=0;i<m_size;i++){ + for(int j=0;j<m_size;j++){ + m_grid.at(i).push_back(0); + } + } + +} + +//Destructor +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+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 << "| " << " " << spaceCol.str(); + else + description << "| " << m_grid.at(i).at(j) << spaceCol.str(); + } + 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); +} + + +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; + + +} |
