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.cpp170
1 files changed, 164 insertions, 6 deletions
diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp
index 92837f6..3a8a075 100644
--- a/src/Model/Grid.cpp
+++ b/src/Model/Grid.cpp
@@ -22,24 +22,48 @@ std::string Grid::description(){
//Init stringstream description
std::stringstream description;
+ //Get max str len of the grid
+ int maxStrLen=this->maxStrLenInGrid();
+
//Start to write description
- description << "-----------------" << std::endl;
+ std::stringstream gridBorder;
+ for(int i=0;i<(maxStrLen+2)*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++){
+ spaceCol << " ";
+ }
if(m_grid.at(i).at(j) == 0)
- description << "| " << " " << " ";
+ description << "| " << " " << spaceCol.str();
else
- description << "| " << m_grid.at(i).at(j) << " ";
+ description << "| " << m_grid.at(i).at(j) << spaceCol.str();
}
description << "|";
description << std::endl;
}
- description << "-----------------" << std::endl << std::endl;
+ description << gridBorder.str() << std::endl << std::endl;
//Return description
return description.str();
}
+
+int Grid::maxStrLenInGrid(){
+ int max=0;
+ for(int i=0;i<m_size;i++){
+ for(int j=0;j<m_size;j++){
+ std::string number=std::to_string(m_grid.at(i).at(j));
+ if(number.size() > max)
+ max=number.size();
+ }
+ }
+ return max;
+}
+
bool Grid::isEmpty(int i, int j){
if(m_grid.at(i).at(j) == 0)
return true;
@@ -77,8 +101,8 @@ std::tuple<int, int> Grid::getRandomEmptyCellCoord(){
//Change value of cell
bool Grid::setCell(std::tuple<int, int> coord, int value){
- int i=std::get<0>(coord);
- int j=std::get<1>(coord);
+ int i=std::get<0>(coord);
+ int j=std::get<1>(coord);
if(i>=0 && i<m_size && j>=0 && j<m_size){
m_grid.at(i).at(j)=value;
@@ -95,6 +119,140 @@ bool Grid::setCell(int i, int j, int value){
}
+std::vector<int> Grid::defragmentLine(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);
+ 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::mergeLine(std::vector<int> line){
+ for(int i=0; i< m_size-1;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);
+
+ //Return swiped line
+ return line;
+}
+
+
+//Swipe to right
+void Grid::swipeRight(){
+ for(int i=0; i<m_size;i++){
+ m_grid.at(i)=this->swipeLine(m_grid.at(i));
+ }
+}
+
+//Swipe to right
+void Grid::swipeLeft(){
+ for(int i=0; i<m_size;i++){
+ m_grid.at(i)=this->reverseLine(this->swipeLine(this->reverseLine(m_grid.at(i))));
+ }
+}
+
+
+void Grid::swipeUp(){
+ 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))));
+ }
+}
+void Grid::swipeDown(){
+ for(int i=0; i<m_size;i++){
+ std::vector<int> colVect=this->getCol(i);
+ this->setCol(i,this->swipeLine(colVect));
+ }
+}
+
+void Grid::setCol(int col, std::vector<int> colVect){
+ for(int i=0;i<m_size;i++){
+ m_grid.at(i).at(col)=colVect.at(i);
+ }
+}
+
+std::vector<int> Grid::getCol(int col){
+
+ std::vector<int> colVect;
+
+ for(int i=0;i<m_size;i++){
+ colVect.push_back(m_grid.at(i).at(col));
+ }
+
+ return colVect;
+}
+
+std::vector<int> Grid::reverseLine(std::vector<int> line){
+ std::vector<int> reversedLine;
+
+ for(int j=m_size-1; j>=0;j--){
+ reversedLine.push_back(line.at(j));
+ }
+
+ return reversedLine;
+}
+
+
+bool Grid::isFull(){
+
+ for(int i=0;i<m_size;i++){
+ for(int j=0;j<m_size;j++){
+ if(m_grid.at(i).at(j) == 0)
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool Grid::isOver(){
+
+ if(!this->isFull())
+ return false;
+
+ for(int i=0;i<m_size;i++){
+ for(int j=0;j<m_size-1;j++){
+ if(m_grid.at(i).at(j) == m_grid.at(i).at(j+1))
+ return false;
+ }
+ }
+
+ for(int i=0;i<m_size;i++){
+ std::vector<int> colVect(this->getCol(i));
+
+ for(int j=0;j<m_size-1;j++){
+ if(colVect.at(j) == colVect.at(j+1))
+ return false;
+ }
+ }
+
+ return true;
+
+
+}