Correct bug on merging and pop number
This commit is contained in:
parent
4716e4d231
commit
cfc5d425f6
5 changed files with 116 additions and 31 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ class ConsoleController
|
||||||
ConsoleController();
|
ConsoleController();
|
||||||
~ConsoleController();
|
~ConsoleController();
|
||||||
void run();
|
void run();
|
||||||
|
void clearScreen();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue