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,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;
}
}

View file

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

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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();
};