Correct bug on merging and pop number

This commit is contained in:
manzerbredes 2015-05-03 01:09:19 +02:00
parent 4716e4d231
commit cfc5d425f6
5 changed files with 116 additions and 31 deletions

View file

@ -33,10 +33,11 @@ void ConsoleController::run()
keyPress=this->waitArrowKeyPress(); keyPress=this->waitArrowKeyPress();
//Apply move //Apply move
m_game.swipe(keyPress); bool moveDone=m_game.swipe(keyPress);
//Pop a random number on the grid //Pop a random number on the grid
m_game.popRandomNumber(); if(moveDone)
m_game.popRandomNumber();
//Cout grid //Cout grid
m_game.coutGrid(); m_game.coutGrid();
@ -95,3 +96,10 @@ kbdh::Direction ConsoleController::waitArrowKeyPress()
return keyPress; return keyPress;
} }
void ConsoleController::clearScreen(){
for(int i;i<100;i++){
std::cout << std::endl;
}
}

View file

@ -21,6 +21,7 @@ class ConsoleController
ConsoleController(); ConsoleController();
~ConsoleController(); ~ConsoleController();
void run(); void run();
void clearScreen();
}; };
#endif #endif

View file

@ -12,23 +12,25 @@ Game::~Game(){
bool Game::swipe(kbdh::Direction direction){ bool Game::swipe(kbdh::Direction direction){
bool moveDone;
switch(direction){ switch(direction){
case kbdh::Left: case kbdh::Left:
m_grid.swipeLeft(); moveDone=m_grid.swipeLeft();
break; break;
case kbdh::Right: case kbdh::Right:
m_grid.swipeRight(); moveDone=m_grid.swipeRight();
break; break;
case kbdh::Up: case kbdh::Up:
m_grid.swipeUp(); moveDone=m_grid.swipeUp();
break; break;
case kbdh::Down: case kbdh::Down:
m_grid.swipeDown(); moveDone=m_grid.swipeDown();
break; break;
} }
return true; return moveDone;
} }

View file

@ -9,7 +9,9 @@ Grid::Grid(): m_size(4), m_grid(4){
m_grid.at(i).push_back(0); 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 //Destructor
@ -27,20 +29,23 @@ std::string Grid::description(){
//Start to write description //Start to write description
std::stringstream gridBorder; std::stringstream gridBorder;
for(int i=0;i<(maxStrLen+2)*4+1;i++){ for(int i=0;i<(maxStrLen+1)*4+1;i++){
gridBorder<<"-"; gridBorder<<"-";
} }
description << std::endl << gridBorder.str() << std::endl; description << std::endl << gridBorder.str() << std::endl;
for(int i=0;i<m_size;i++){ for(int i=0;i<m_size;i++){
for(int j=0;j<m_size;j++){ for(int j=0;j<m_size;j++){
std::stringstream spaceCol; 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 << " "; spaceCol << " ";
} }
if(m_grid.at(i).at(j) == 0) if(m_grid.at(i).at(j) == 0)
description << "| " << " " << spaceCol.str(); description << "|" << spaceCol.str() << " ";
else else
description << "| " << m_grid.at(i).at(j) << spaceCol.str(); description << "|"<< spaceCol.str() << m_grid.at(i).at(j) ;
} }
description << "|"; description << "|";
description << std::endl; 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 j=0; j<m_size-1;j++){
for(int i=0; i<m_size-1;i++){ for(int i=0; i<m_size-1;i++){
int val1=line.at(i); int val1=line.at(i);
@ -134,7 +139,21 @@ std::vector<int> Grid::defragmentLine(std::vector<int> line){
return 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++){ for(int i=0; i< m_size-1;i++){
int val1=line.at(i); int val1=line.at(i);
int val2=line.at(i+1); int val2=line.at(i+1);
@ -148,15 +167,28 @@ std::vector<int> Grid::mergeLine(std::vector<int> line){
return 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){ std::vector<int> Grid::swipeLine(std::vector<int> line){
//Swipe line is : //Swipe line is :
//- A defragmentation //- A defragmentation
//- A merging //- A merging
//- Another defragmentation //- Another defragmentation
line=this->defragmentLine(line); line=this->rightDefragment(line);
line=this->mergeLine(line); line=this->rightMerge(line);
line=this->defragmentLine(line); line=this->rightDefragment(line);
//Return swiped line //Return swiped line
return line; return line;
@ -164,31 +196,60 @@ std::vector<int> Grid::swipeLine(std::vector<int> line){
//Swipe to right //Swipe to right
void Grid::swipeRight(){ bool Grid::swipeRight(){
bool moveDone=false;
for(int i=0; i<m_size;i++){ 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 //Swipe to right
void Grid::swipeLeft(){ bool Grid::swipeLeft(){
bool moveDone=false;
for(int i=0; i<m_size;i++){ 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++){ for(int i=0; i<m_size;i++){
std::vector<int> colVect=this->getCol(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++){ for(int i=0; i<m_size;i++){
std::vector<int> colVect=this->getCol(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){ 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;
}

View file

@ -31,8 +31,10 @@ class Grid
bool setCell(int i, int j, int value); bool setCell(int i, int j, int value);
std::vector<int> swipeLine(std::vector<int> line); std::vector<int> swipeLine(std::vector<int> line);
std::vector<int> defragmentLine(std::vector<int> line); std::vector<int> rightDefragment(std::vector<int> line);
std::vector<int> mergeLine(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); std::vector<int> getCol(int col);
@ -41,12 +43,13 @@ class Grid
void setCol(int col, std::vector<int> colVect); void setCol(int col, std::vector<int> colVect);
std::vector<int> reverseLine(std::vector<int> line); std::vector<int> reverseLine(std::vector<int> line);
bool compareLines(std::vector<int> line1, std::vector<int> line2);
//Moves //Moves
void swipeRight(); bool swipeRight();
void swipeLeft(); bool swipeLeft();
void swipeUp(); bool swipeUp();
void swipeDown(); bool swipeDown();
}; };