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,9 +33,10 @@ 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
|
||||
if(moveDone)
|
||||
m_game.popRandomNumber();
|
||||
|
||||
//Cout grid
|
||||
|
@ -95,3 +96,10 @@ kbdh::Direction ConsoleController::waitArrowKeyPress()
|
|||
|
||||
return keyPress;
|
||||
}
|
||||
|
||||
|
||||
void ConsoleController::clearScreen(){
|
||||
for(int i;i<100;i++){
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ class ConsoleController
|
|||
ConsoleController();
|
||||
~ConsoleController();
|
||||
void run();
|
||||
void clearScreen();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,32 +196,61 @@ 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);
|
||||
}
|
||||
}
|
||||
void Grid::swipeDown(){
|
||||
return moveDone;
|
||||
}
|
||||
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){
|
||||
for(int i=0;i<m_size;i++){
|
||||
|
@ -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);
|
||||
|
||||
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();
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue