summaryrefslogtreecommitdiff
path: root/src/Model/Grid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Model/Grid.cpp')
-rw-r--r--src/Model/Grid.cpp107
1 files changed, 89 insertions, 18 deletions
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;
+}