diff options
| author | manzerbredes <loic.guegan_secondary@yahoo.fr> | 2015-05-03 01:09:19 +0200 |
|---|---|---|
| committer | manzerbredes <loic.guegan_secondary@yahoo.fr> | 2015-05-03 01:09:19 +0200 |
| commit | cfc5d425f68c1a98b86ef91d92ac82785d0f33a2 (patch) | |
| tree | 8b6467a417c2e37b296f45a5a80f3673c2ed4d6d | |
| parent | 4716e4d231a26c45fa7d4e38a79f4f44c3b8348a (diff) | |
Correct bug on merging and pop number
| -rw-r--r-- | src/Controllers/ConsoleController/ConsoleController.cpp | 12 | ||||
| -rw-r--r-- | src/Controllers/ConsoleController/ConsoleController.hpp | 1 | ||||
| -rw-r--r-- | src/Model/Game.cpp | 12 | ||||
| -rw-r--r-- | src/Model/Grid.cpp | 107 | ||||
| -rw-r--r-- | src/Model/Grid.hpp | 15 |
5 files changed, 116 insertions, 31 deletions
diff --git a/src/Controllers/ConsoleController/ConsoleController.cpp b/src/Controllers/ConsoleController/ConsoleController.cpp index d91e807..479b25d 100644 --- a/src/Controllers/ConsoleController/ConsoleController.cpp +++ b/src/Controllers/ConsoleController/ConsoleController.cpp @@ -33,10 +33,11 @@ void ConsoleController::run() keyPress=this->waitArrowKeyPress(); //Apply move - m_game.swipe(keyPress); + bool moveDone=m_game.swipe(keyPress); //Pop a random number on the grid - m_game.popRandomNumber(); + if(moveDone) + m_game.popRandomNumber(); //Cout grid m_game.coutGrid(); @@ -95,3 +96,10 @@ kbdh::Direction ConsoleController::waitArrowKeyPress() return keyPress; } + + +void ConsoleController::clearScreen(){ + for(int i;i<100;i++){ + std::cout << std::endl; + } +} diff --git a/src/Controllers/ConsoleController/ConsoleController.hpp b/src/Controllers/ConsoleController/ConsoleController.hpp index 8d73f79..f2c19b8 100644 --- a/src/Controllers/ConsoleController/ConsoleController.hpp +++ b/src/Controllers/ConsoleController/ConsoleController.hpp @@ -21,6 +21,7 @@ class ConsoleController ConsoleController(); ~ConsoleController(); void run(); + void clearScreen(); }; #endif diff --git a/src/Model/Game.cpp b/src/Model/Game.cpp index 6039bc9..5be88d9 100644 --- a/src/Model/Game.cpp +++ b/src/Model/Game.cpp @@ -12,23 +12,25 @@ Game::~Game(){ bool Game::swipe(kbdh::Direction direction){ + bool moveDone; + switch(direction){ case kbdh::Left: - m_grid.swipeLeft(); + moveDone=m_grid.swipeLeft(); break; case kbdh::Right: - m_grid.swipeRight(); + moveDone=m_grid.swipeRight(); break; case kbdh::Up: - m_grid.swipeUp(); + moveDone=m_grid.swipeUp(); break; case kbdh::Down: - m_grid.swipeDown(); + moveDone=m_grid.swipeDown(); break; } - return true; + return moveDone; } 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; +} diff --git a/src/Model/Grid.hpp b/src/Model/Grid.hpp index 2f5160e..09f3e5e 100644 --- a/src/Model/Grid.hpp +++ b/src/Model/Grid.hpp @@ -31,8 +31,10 @@ class Grid bool setCell(int i, int j, int value); std::vector<int> swipeLine(std::vector<int> line); - std::vector<int> defragmentLine(std::vector<int> line); - std::vector<int> mergeLine(std::vector<int> line); + std::vector<int> rightDefragment(std::vector<int> line); + std::vector<int> leftDefragment(std::vector<int> line); + std::vector<int> rightMerge(std::vector<int> line); + std::vector<int> leftMerge(std::vector<int> line); std::vector<int> getCol(int col); @@ -41,12 +43,13 @@ class Grid void setCol(int col, std::vector<int> colVect); std::vector<int> reverseLine(std::vector<int> line); + bool compareLines(std::vector<int> line1, std::vector<int> line2); //Moves - void swipeRight(); - void swipeLeft(); - void swipeUp(); - void swipeDown(); + bool swipeRight(); + bool swipeLeft(); + bool swipeUp(); + bool swipeDown(); }; |
