summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormanzerbredes <loic.guegan_secondary@yahoo.fr>2015-05-03 01:09:19 +0200
committermanzerbredes <loic.guegan_secondary@yahoo.fr>2015-05-03 01:09:19 +0200
commitcfc5d425f68c1a98b86ef91d92ac82785d0f33a2 (patch)
tree8b6467a417c2e37b296f45a5a80f3673c2ed4d6d
parent4716e4d231a26c45fa7d4e38a79f4f44c3b8348a (diff)
Correct bug on merging and pop number
-rw-r--r--src/Controllers/ConsoleController/ConsoleController.cpp12
-rw-r--r--src/Controllers/ConsoleController/ConsoleController.hpp1
-rw-r--r--src/Model/Game.cpp12
-rw-r--r--src/Model/Grid.cpp107
-rw-r--r--src/Model/Grid.hpp15
5 files changed, 116 insertions, 31 deletions
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<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,31 +196,60 @@ 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);
+ }
}
+ return moveDone;
}
-void Grid::swipeDown(){
+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){
@@ -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;
+}
diff --git a/src/Model/Grid.hpp b/src/Model/Grid.hpp
index 2f5160e..09f3e5e 100644
--- a/src/Model/Grid.hpp
+++ b/src/Model/Grid.hpp
@@ -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();
};