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 Grid::defragmentLine(std::vector line){ +std::vector Grid::rightDefragment(std::vector line){ for(int j=0; j Grid::defragmentLine(std::vector line){ return line; } -std::vector Grid::mergeLine(std::vector line){ +std::vector 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; + } + } + } + return line; +} +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); @@ -148,15 +167,28 @@ std::vector Grid::mergeLine(std::vector line){ 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; + i--; + } + } + return line; +} std::vector Grid::swipeLine(std::vector 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 Grid::swipeLine(std::vector line){ //Swipe to right -void Grid::swipeRight(){ +bool Grid::swipeRight(){ + + bool moveDone=false; for(int i=0; iswipeLine(m_grid.at(i)); + std::vector 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; ireverseLine(this->swipeLine(this->reverseLine(m_grid.at(i)))); + std::vector 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 colVect=this->getCol(i); - this->setCol(i,this->reverseLine(this->swipeLine(this->reverseLine(colVect)))); + + std::vector 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 colVect=this->getCol(i); - this->setCol(i,this->swipeLine(colVect)); + + std::vector 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 colVect){ @@ -256,3 +317,13 @@ bool Grid::isOver(){ } + +bool Grid::compareLines(std::vector line1, std::vector line2){ + + for(int i=0;i swipeLine(std::vector line); - std::vector defragmentLine(std::vector line); - std::vector mergeLine(std::vector line); + std::vector rightDefragment(std::vector line); + std::vector leftDefragment(std::vector line); + std::vector rightMerge(std::vector line); + std::vector leftMerge(std::vector line); std::vector getCol(int col); @@ -41,12 +43,13 @@ class Grid void setCol(int col, std::vector colVect); std::vector reverseLine(std::vector line); + bool compareLines(std::vector line1, std::vector line2); //Moves - void swipeRight(); - void swipeLeft(); - void swipeUp(); - void swipeDown(); + bool swipeRight(); + bool swipeLeft(); + bool swipeUp(); + bool swipeDown(); };