diff options
Diffstat (limited to 'src/Model')
| -rw-r--r-- | src/Model/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | src/Model/Game.cpp | 54 | ||||
| -rw-r--r-- | src/Model/Game.hpp | 8 | ||||
| -rw-r--r-- | src/Model/Grid.cpp | 187 | ||||
| -rw-r--r-- | src/Model/Grid.hpp | 22 |
5 files changed, 75 insertions, 203 deletions
diff --git a/src/Model/CMakeLists.txt b/src/Model/CMakeLists.txt index 80ea875..888589e 100644 --- a/src/Model/CMakeLists.txt +++ b/src/Model/CMakeLists.txt @@ -1,7 +1,2 @@ #Make Model lib -add_library(Model Grid.cpp Game.cpp ) - -target_link_libraries(Model Elements) - -add_subdirectory(./Elements) - +add_library(Model Grid.cpp Game.cpp) diff --git a/src/Model/Game.cpp b/src/Model/Game.cpp index 7dc32c6..32482b7 100644 --- a/src/Model/Game.cpp +++ b/src/Model/Game.cpp @@ -1,59 +1,9 @@ #include "Game.hpp" -Game::Game() -{ - m_grid = new Grid(4); -} - -Game::~Game() -{ - delete m_grid; -} - - - -void Game::showGrid() -{ - m_grid->show(); - std::cout << std::endl; -} - -void Game::pop() -{ - bool cellChosen = false; - - int i; - int j; - while(!cellChosen) - { - i = rand() % 4; - j = rand() % 4; - if (m_grid->isEmpty(i,j)) - cellChosen = true; - } - m_grid->setCell(i, j, new Cell<StringElement>(std::to_string(2))); +Game::Game() : m_grid(){ } -void Game::swipeRight(){ - m_grid->swipeRight(); -} -bool Game::isOver() -{ - if(m_grid->gridIsFull()){ - for(int i=0;i<m_grid->getNRows();i++){ - - for(int j=0;j<m_grid->getNCols()-1;j++){ - if(m_grid->getCell(i,j)->equals(m_grid->getCell(i,j+1))){ - return false; - } - } - } - - } - else { - return false; - } - return true; +Game::~Game(){ } diff --git a/src/Model/Game.hpp b/src/Model/Game.hpp index c1c636a..ee3a6a9 100644 --- a/src/Model/Game.hpp +++ b/src/Model/Game.hpp @@ -8,24 +8,18 @@ * Date : 29/04/2015 */ #include <iostream> -#include <cstdlib> #include <string> -#include "./Elements/StringElement.hpp" #include "Grid.hpp" class Game { private: - Grid *m_grid; + Grid m_grid; public: Game(); ~Game(); - void pop(); - void showGrid(); - void swipeRight(); - bool isOver(); }; #endif diff --git a/src/Model/Grid.cpp b/src/Model/Grid.cpp index 6fc41c6..92837f6 100644 --- a/src/Model/Grid.cpp +++ b/src/Model/Grid.cpp @@ -1,161 +1,100 @@ #include "Grid.hpp" //Constructor -Grid::Grid(int size) -{ - //Create Vector - m_size = size; - m_table = std::vector<std::vector<Cell<StringElement>*> >(size); - - //Init all of line and cell - for(int i = 0 ; i < size ; i++) - { - m_table[i] = std::vector<Cell<StringElement>*>(size); - for (int j = 0 ; j < size ; j++) - { - Cell<StringElement> * cell = new Cell<StringElement>(""); - m_table[i][j] = cell; +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() -{ - for(int i = 0 ; i < m_size ; i++) - { - for(int j = 0 ; j < m_size ; j++) - delete m_table[i][j]; - } } -void Grid::show() -{ - std::cout << "_________________" << std::endl; - std::cout << std::endl; - for(int i = 0 ; i < m_size ; i++) - { - std::cout << "|"; - for(int j = 0 ; j < m_size ; j++) - { - std::cout << " " << m_table[i][j]->description() << " |"; - } - std::cout << std::endl; - - if (i != m_size -1) - std::cout << std::endl; - } - std::cout << "_________________" << std::endl; +//Destructor +Grid::~Grid(){ } -bool Grid::isEmpty(int i, int j) -{ - if (i >= 0 && i < m_size && j >= 0 && j < m_size) - return m_table[i][j]->isEmpty(); - return false; -} +std::string Grid::description(){ -bool Grid::gridIsFull() -{ + //Init stringstream description + std::stringstream description; - for (int i = 0; i < m_size ; i++) - { - for (int j = 0; j < m_size ; j++) - { - if (m_table[i][j]->isEmpty()) - return false; + //Start to write description + description << "-----------------" << std::endl; + for(int i=0;i<m_size;i++){ + for(int j=0;j<m_size;j++){ + if(m_grid.at(i).at(j) == 0) + description << "| " << " " << " "; + else + description << "| " << m_grid.at(i).at(j) << " "; } + description << "|"; + description << std::endl; } + description << "-----------------" << std::endl << std::endl; - return true; + //Return description + return description.str(); } -void Grid::setCell(int i, int j, Cell<StringElement> *cell) -{ - if (i >= 0 && i < m_size && j >= 0 && j < m_size) - { - delete m_table[i][j]; - m_table[i][j] = cell; - } +bool Grid::isEmpty(int i, int j){ + if(m_grid.at(i).at(j) == 0) + return true; + return false; } -Cell<StringElement>* Grid::getCell(short i, short j){ - return m_table[i][j]; -} +std::tuple<int, int> Grid::getRandomEmptyCellCoord(){ -int Grid::getNRows(){ - return m_table[0].size(); -} + //Init list of candidate + std::vector<std::tuple<int, int> > candidates; -int Grid::getNCols(){ - return m_table.size(); -} + //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); -std::vector<Cell<StringElement>* > Grid::swipeLine(std::vector<Cell<StringElement>* > line){ - std::vector<Cell<StringElement>*> newLine = std::vector<Cell<StringElement>*>(4); + //Select the candidates + int winnerIs(rand() % candidates.size()); + //Return the candidate + return candidates.at(winnerIs); - for (int j = 0 ; j < 3 ; j++) - { - if(j>3) - break; - Cell<StringElement> * cell = new Cell<StringElement>(line.at(j)->getElementValue()); - Cell<StringElement> * cellp1 = new Cell<StringElement>(line.at(j+1)->getElementValue()); +} - int a=atoi(cell->getElementValue().c_str()); - int ap1=atoi(cellp1->getElementValue().c_str()); - std::string s=std::to_string(a); - std::string sp1=std::to_string(ap1); - if(a==ap1 && a!=0){ - s=""; - sp1=std::to_string(a+ap1); - if(ap1 == 0) - newLine[j+1] = new Cell<StringElement>(""); - else - newLine[j+1] = new Cell<StringElement>(sp1); - newLine[j] = new Cell<StringElement>(s); - j++; - } - else{ - if(ap1==0) - newLine[j+1] = new Cell<StringElement>(""); - else - newLine[j+1] = new Cell<StringElement>(sp1); - if(a==0) - newLine[j] = new Cell<StringElement>(""); - else - newLine[j] = new Cell<StringElement>(s); +//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); - } - delete cell; - delete cellp1; - + 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); +} - for (int j = 0 ; j < 3 ; j++){ - if(!newLine[j]->isEmpty()){ - if(newLine[j+1]->isEmpty()){ - newLine[j+1]=new Cell<StringElement>(newLine[j]->getElementValue()); - newLine[j]=new Cell<StringElement>(""); - } - } - } - for(int i=0; i<4;i++){ - std::cout << "|" << newLine[i]->description() << "|"; - } - std::cout << "done"; - return newLine; -} -void Grid::swipeRight(){ - std::vector<Cell<StringElement>*> a=this->swipeLine(m_table.at(0)); - m_table[0]=a; -} diff --git a/src/Model/Grid.hpp b/src/Model/Grid.hpp index 810cb9b..6942188 100644 --- a/src/Model/Grid.hpp +++ b/src/Model/Grid.hpp @@ -8,32 +8,26 @@ * Date : 29/04/2015 */ #include <iostream> +#include <sstream> #include <vector> - -//#include "ModelConstants.hpp" -#include "Cell.hpp" -#include "./Elements/StringElement.hpp" +#include <tuple> class Grid { private: int m_size; - std::vector<std::vector<Cell<StringElement>*> > m_table; + std::vector<std::vector<int> > m_grid; public: - Grid(int size); + Grid(); ~Grid(); - void show(); + std::string description(); bool isEmpty(int i, int j); - bool gridIsFull(); - int getNRows(); - int getNCols(); - std::vector<Cell<StringElement>* > swipeLine(std::vector<Cell<StringElement>* > line); - void swipeRight(); - void setCell(int i, int j, Cell<StringElement> *cell); - Cell<StringElement>* getCell(short i, short j); + std::tuple<int, int> getRandomEmptyCellCoord(); + bool setCell(std::tuple<int, int> coord, int value); + bool setCell(int i, int j, int value); }; |
