From af7f2fc8700df64f245caf7b864e777831867c3f Mon Sep 17 00:00:00 2001 From: manzerbredes Date: Sun, 3 May 2015 09:44:41 +0200 Subject: [PATCH] Organize Grid cpp code --- src/Model/Grid.cpp | 503 +++++++++++++++++++++++---------------------- 1 file changed, 255 insertions(+), 248 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,6 +18,251 @@ Grid::~Grid(){ } +//==================== Merge and defragment methods ==================== + +//Defragment the line to the right +std::vector Grid::rightDefragment(std::vector line){ + for(int j=0; j Grid::leftDefragment(std::vector line){ + + std::vector reversedLine= this->reverseLine(line); + + return this->reverseLine(this->rightDefragment(reversedLine)); +} + +//Merge line to the right +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); + + if(val1==val2){ + line.at(i)=0; + line.at(i+1)=val1*2; + m_lastMoveScore+=val1*2; + i++; + } + } + return line; +} + +//Merge line to the left +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; + m_lastMoveScore+=val1*2; + i--; + } + } + return line; +} + + +//==================== Swipe methods ==================== + + +//Swipe to the right +bool Grid::swipeRight(){ + + m_lastMoveScore=0; + bool moveDone=false; + for(int i=0; i 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 the left +bool Grid::swipeLeft(){ + m_lastMoveScore=0; + bool moveDone=false; + for(int i=0; i 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; +} + + +//Swipe to the top +bool Grid::swipeUp(){ + m_lastMoveScore=0; + bool moveDone=false; + for(int i=0; i colVect=this->getCol(i); + + std::vector swipedLine(this->leftDefragment(this->rightMerge(this->leftDefragment(colVect)))); + if(!this->compareLines(colVect, swipedLine)){ + moveDone=true; + this->setCol(i,swipedLine); + } + } + return moveDone; +} +//Swipe to the bottom +bool Grid::swipeDown(){ + m_lastMoveScore=0; + bool moveDone=false; + for(int i=0; i colVect=this->getCol(i); + + std::vector swipedLine(this->rightDefragment(this->leftMerge(this->rightDefragment(colVect)))); + + if(!this->compareLines(colVect, swipedLine)){ + moveDone=true; + this->setCol(i,swipedLine); + } + } + return moveDone; +} + +//==================== 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 max) + max=number.size(); + } + } + return max; +} + +//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; +} + +//Return a tuple that contain a random empty cell +std::tuple Grid::getRandomEmptyCellCoord(){ + + //Init list of candidate + std::vector > candidates; + + //Construct list of candidates + for(int i=0;iisEmpty(i,j)){ + std::tuple currentCandidate(i,j); + candidates.push_back(currentCandidate); + } + } + } + + //If no candidate available + if(candidates.size() == 0) + return std::tuple(-1, -1); + + //Select the candidates + int winnerIs(rand() % candidates.size()); + + //Return the candidate + return candidates.at(winnerIs); + +} + +//Reverse a line +std::vector Grid::reverseLine(std::vector line){ + std::vector reversedLine; + + for(int j=m_size-1; j>=0;j--){ + reversedLine.push_back(line.at(j)); + } + + return reversedLine; +} + +//Return true if the grid is full. False else. +bool Grid::isFull(){ + + for(int i=0;iisFull()) + return false; + + for(int i=0;i colVect(this->getCol(i)); + + for(int j=0;j line1, std::vector line2){ + + for(int i=0;i 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 Grid::getRandomEmptyCellCoord(){ - - //Init list of candidate - std::vector > candidates; - - //Construct list of candidates - for(int i=0;iisEmpty(i,j)){ - std::tuple currentCandidate(i,j); - candidates.push_back(currentCandidate); - } - } - } - - //If no candidate available - if(candidates.size() == 0) - return std::tuple(-1, -1); - - //Select the candidates - int winnerIs(rand() % candidates.size()); - - //Return the candidate - return candidates.at(winnerIs); - +//Getter for m_lastMoveScore +int Grid::getLastMoveScore(){ + return m_lastMoveScore; } - -//Change value of cell +//Change value of cell with a tuple bool Grid::setCell(std::tuple coord, int value){ int i=std::get<0>(coord); int j=std::get<1>(coord); @@ -114,157 +321,20 @@ bool Grid::setCell(std::tuple coord, int value){ return false; } -//Another setCell method +//Change value of cell with int bool Grid::setCell(int i, int j, int value){ std::tuple coord(i,j); return this->setCell(coord, value); } - -std::vector Grid::rightDefragment(std::vector line){ - for(int j=0; j 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; - //} - //} - //} - - std::vector reversedLine= this->reverseLine(line); - - return this->reverseLine(this->rightDefragment(reversedLine)); -} -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); - - if(val1==val2){ - line.at(i)=0; - line.at(i+1)=val1*2; - m_lastMoveScore+=val1*2; - i++; - } - } - 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; - m_lastMoveScore+=val1*2; - i--; - } - } - return line; -} -std::vector Grid::swipeLine(std::vector 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 to right -bool Grid::swipeRight(){ - - m_lastMoveScore=0; - bool moveDone=false; - for(int i=0; i 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 -bool Grid::swipeLeft(){ - m_lastMoveScore=0; - bool moveDone=false; - for(int i=0; i 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; -} - - -bool Grid::swipeUp(){ - m_lastMoveScore=0; - bool moveDone=false; - for(int i=0; i colVect=this->getCol(i); - - std::vector swipedLine(this->leftDefragment(this->rightMerge(this->leftDefragment(colVect)))); - if(!this->compareLines(colVect, swipedLine)){ - moveDone=true; - this->setCol(i,swipedLine); - } - } - return moveDone; -} -bool Grid::swipeDown(){ - m_lastMoveScore=0; - bool moveDone=false; - for(int i=0; i colVect=this->getCol(i); - - std::vector swipedLine(this->rightDefragment(this->leftMerge(this->rightDefragment(colVect)))); - - if(!this->compareLines(colVect, swipedLine)){ - moveDone=true; - this->setCol(i,swipedLine); - } - } - return moveDone; -} - +//Assign a vector to a column. void Grid::setCol(int col, std::vector colVect){ for(int i=0;i Grid::getCol(int col){ std::vector colVect; @@ -275,66 +345,3 @@ std::vector Grid::getCol(int col){ return colVect; } - -std::vector Grid::reverseLine(std::vector line){ - std::vector 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;iisFull()) - return false; - - for(int i=0;i colVect(this->getCol(i)); - - for(int j=0;j line1, std::vector line2){ - - for(int i=0;i