summaryrefslogtreecommitdiff
path: root/src/Model/Grid.cpp
diff options
context:
space:
mode:
authormanzerbredes <loic.guegan_secondary@yahoo.fr>2015-05-02 23:05:44 +0200
committermanzerbredes <loic.guegan_secondary@yahoo.fr>2015-05-02 23:05:44 +0200
commit710cc4001f65ac2fee39e25d79f43a01b9e12512 (patch)
tree2e78e337b0c7d0f79bd68205badc1630326118ed /src/Model/Grid.cpp
parentfec126f0d2d48310109f85c3647b10ce393db5e8 (diff)
parent1d09a0fd3ae35ccf51a3b5f929f77a8c8850712c (diff)
First stable fusionning
Diffstat (limited to 'src/Model/Grid.cpp')
-rw-r--r--src/Model/Grid.cpp258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp
new file mode 100644
index 0000000..3a8a075
--- /dev/null
+++ b/src/Model/Grid.cpp
@@ -0,0 +1,258 @@
+#include "Grid.hpp"
+
+//Constructor
+Grid::Grid(): m_size(4), m_grid(4){
+
+ //Init all cells
+ for(int i=0;i<m_size;i++){
+ for(int j=0;j<m_size;j++){
+ m_grid.at(i).push_back(0);
+ }
+ }
+
+}
+
+//Destructor
+Grid::~Grid(){
+}
+
+
+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
+ 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 << "| " << " " << spaceCol.str();
+ else
+ description << "| " << m_grid.at(i).at(j) << spaceCol.str();
+ }
+ description << "|";
+ description << 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;
+ return false;
+}
+
+std::tuple<int, int> Grid::getRandomEmptyCellCoord(){
+
+ //Init list of candidate
+ std::vector<std::tuple<int, int> > candidates;
+
+ //Construct list of candidates
+ for(int i=0;i<m_size;i++){
+ for(int j=0;j<m_size;j++){
+ if(this->isEmpty(i,j)){
+ std::tuple<int, int> currentCandidate(i,j);
+ candidates.push_back(currentCandidate);
+ }
+ }
+ }
+
+ //If no candidate available
+ if(candidates.size() == 0)
+ return std::tuple<int, int>(-1, -1);
+
+ //Select the candidates
+ int winnerIs(rand() % candidates.size());
+
+ //Return the candidate
+ return candidates.at(winnerIs);
+
+}
+
+
+
+//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);
+
+ if(i>=0 && i<m_size && j>=0 && j<m_size){
+ m_grid.at(i).at(j)=value;
+ return true;
+ }
+
+ return false;
+}
+
+//Another setCell method
+bool Grid::setCell(int i, int j, int value){
+ std::tuple<int, int> coord(i,j);
+ return this->setCell(coord, 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;
+
+
+}