summaryrefslogtreecommitdiff
path: root/src
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
parentfec126f0d2d48310109f85c3647b10ce393db5e8 (diff)
parent1d09a0fd3ae35ccf51a3b5f929f77a8c8850712c (diff)
First stable fusionning
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt7
-rw-r--r--src/Controllers/CMakeLists.txt1
-rw-r--r--src/Controllers/ConsoleController/CMakeLists.txt3
-rw-r--r--src/Controllers/ConsoleController/ConsoleController.cpp97
-rw-r--r--src/Controllers/ConsoleController/ConsoleController.hpp26
-rw-r--r--src/Helpers/Keyboard.hpp17
-rw-r--r--src/Model/CMakeLists.txt2
-rw-r--r--src/Model/Game.cpp49
-rw-r--r--src/Model/Game.hpp31
-rw-r--r--src/Model/Grid.cpp258
-rw-r--r--src/Model/Grid.hpp53
-rw-r--r--src/main.cpp45
12 files changed, 567 insertions, 22 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b30833e..da444d2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -7,9 +7,12 @@ add_executable(
#Find all libraries
find_package(SFML 2.2 COMPONENTS system window graphics audio REQUIRED)
+set_property(GLOBAL PROPERTY SFML_LIBRARIES "${SFML_LIBRARIES}")
+set_property(GLOBAL PROPERTY SFML_INCLUDE_DIR "${SFML_INCLUDE_DIR}")
#Include "Includes" and "Libraries"
include_directories(${SFML_INCLUDE_DIR})
-target_link_libraries(2P11 ${SFML_LIBRARIES})
+target_link_libraries(2P11 ${SFML_LIBRARIES} Model ConsoleController)
-message("${SFML_LIBRARIES}")
+add_subdirectory(./Model)
+add_subdirectory(./Controllers/)
diff --git a/src/Controllers/CMakeLists.txt b/src/Controllers/CMakeLists.txt
new file mode 100644
index 0000000..7ebeb19
--- /dev/null
+++ b/src/Controllers/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(./ConsoleController/)
diff --git a/src/Controllers/ConsoleController/CMakeLists.txt b/src/Controllers/ConsoleController/CMakeLists.txt
new file mode 100644
index 0000000..d42803f
--- /dev/null
+++ b/src/Controllers/ConsoleController/CMakeLists.txt
@@ -0,0 +1,3 @@
+#Make Model lib
+add_library(ConsoleController ./ConsoleController.cpp)
+target_link_libraries(ConsoleController Model)
diff --git a/src/Controllers/ConsoleController/ConsoleController.cpp b/src/Controllers/ConsoleController/ConsoleController.cpp
new file mode 100644
index 0000000..d91e807
--- /dev/null
+++ b/src/Controllers/ConsoleController/ConsoleController.cpp
@@ -0,0 +1,97 @@
+#include "./ConsoleController.hpp"
+#include <SFML/Window/Keyboard.hpp>
+#include "../../Helpers/Keyboard.hpp"
+
+ConsoleController::ConsoleController()
+{
+}
+
+ConsoleController::~ConsoleController()
+{
+}
+
+void ConsoleController::run()
+{
+
+ //Init keyPress
+ kbdh::Direction keyPress;
+
+ //Intruction msg
+ std::cout << "Use arrows to play !" << std::endl;
+
+ //Pop a random number on the grid
+ m_game.popRandomNumber();
+
+ //First cout grid
+ m_game.coutGrid();
+
+
+ //Start game
+ while (!m_game.isOver())
+ {
+ //Get key press
+ keyPress=this->waitArrowKeyPress();
+
+ //Apply move
+ m_game.swipe(keyPress);
+
+ //Pop a random number on the grid
+ m_game.popRandomNumber();
+
+ //Cout grid
+ m_game.coutGrid();
+
+ }
+ m_game.coutGrid();
+}
+
+
+
+kbdh::Direction ConsoleController::waitArrowKeyPress()
+{
+ //Initialise keyPress
+ kbdh::Direction keyPress;
+
+ //Wait for keypress
+ while(1){
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
+ {
+ keyPress=kbdh::Left;
+ while(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
+ {
+ //Wait for release
+ }
+ break;
+ }
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
+ {
+ keyPress=kbdh::Right;
+ while(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
+ {
+ //Wait for release
+ }
+ break;
+ }
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
+ {
+ keyPress=kbdh::Up;
+ while(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
+ {
+ //Wait for release
+ }
+ break;
+ }
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
+ {
+ // la touche "flèche gauche" est enfoncée : on bouge le personnage
+ keyPress=kbdh::Down;
+ while(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
+ {
+ //Wait for release
+ }
+ break;
+ }
+ }
+
+ return keyPress;
+}
diff --git a/src/Controllers/ConsoleController/ConsoleController.hpp b/src/Controllers/ConsoleController/ConsoleController.hpp
new file mode 100644
index 0000000..8d73f79
--- /dev/null
+++ b/src/Controllers/ConsoleController/ConsoleController.hpp
@@ -0,0 +1,26 @@
+#ifndef DEF_CTCONSOLE
+#define DEF_CTCONSOLE
+
+/* CTConsole.hpp
+ * Defines the class CTConsole
+ * CTConsole is a controller which displays a game in a terminal
+ * Creators : krilius, manzerbredes
+ * Date : 29/04/2915 */
+
+#include <iostream>
+#include "../../Helpers/Keyboard.hpp"
+#include "../../Model/Game.hpp"
+
+class ConsoleController
+{
+ private:
+
+ Game m_game;
+ kbdh::Direction waitArrowKeyPress();
+ public:
+ ConsoleController();
+ ~ConsoleController();
+ void run();
+};
+
+#endif
diff --git a/src/Helpers/Keyboard.hpp b/src/Helpers/Keyboard.hpp
new file mode 100644
index 0000000..9d2dfa3
--- /dev/null
+++ b/src/Helpers/Keyboard.hpp
@@ -0,0 +1,17 @@
+#ifndef DEF_MODELCONSTANTS
+#define DEF_MODELCONSTANTS
+
+/* ModelConstants.hpp
+ * Constains constants and enums used in the whole model
+ * Creators : krilius, manzerbredes
+ * Date : 29/04/2015 */
+
+namespace kbdh {
+
+ //Key arrow
+ enum Direction { Up, Down, Left, Right };
+ typedef enum Direction Direction;
+
+}
+
+#endif
diff --git a/src/Model/CMakeLists.txt b/src/Model/CMakeLists.txt
new file mode 100644
index 0000000..888589e
--- /dev/null
+++ b/src/Model/CMakeLists.txt
@@ -0,0 +1,2 @@
+#Make Model lib
+add_library(Model Grid.cpp Game.cpp)
diff --git a/src/Model/Game.cpp b/src/Model/Game.cpp
new file mode 100644
index 0000000..6039bc9
--- /dev/null
+++ b/src/Model/Game.cpp
@@ -0,0 +1,49 @@
+#include "Game.hpp"
+
+
+
+Game::Game() : m_grid(){
+}
+
+Game::~Game(){
+}
+
+
+
+bool Game::swipe(kbdh::Direction direction){
+
+ switch(direction){
+
+ case kbdh::Left:
+ m_grid.swipeLeft();
+ break;
+ case kbdh::Right:
+ m_grid.swipeRight();
+ break;
+ case kbdh::Up:
+ m_grid.swipeUp();
+ break;
+ case kbdh::Down:
+ m_grid.swipeDown();
+ break;
+ }
+
+ return true;
+}
+
+
+void Game::coutGrid(){
+ std::cout << m_grid.description();
+}
+
+bool Game::isOver(){
+ return m_grid.isOver();
+}
+
+void Game::popRandomNumber(){
+ std::tuple<int, int> coord(m_grid.getRandomEmptyCellCoord());
+
+ int number=2;
+
+ m_grid.setCell(coord, number);
+}
diff --git a/src/Model/Game.hpp b/src/Model/Game.hpp
new file mode 100644
index 0000000..ab19340
--- /dev/null
+++ b/src/Model/Game.hpp
@@ -0,0 +1,31 @@
+#ifndef DEF_GAME
+#define DEF_GAME
+
+/* Game.h
+ * Defines the class Game
+ * A game allows a player to play. It contains a grid and pops numbers
+ * Creators : krilius, manzerbredes
+ * Date : 29/04/2015 */
+
+#include <iostream>
+#include <string>
+#include "../Helpers/Keyboard.hpp"
+#include "Grid.hpp"
+#include <tuple>
+
+class Game
+{
+ private:
+ Grid m_grid;
+
+ public:
+ Game();
+ ~Game();
+
+ bool swipe(kbdh::Direction direction);
+ void coutGrid();
+ void popRandomNumber();
+ bool isOver();
+};
+
+#endif
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;
+
+
+}
diff --git a/src/Model/Grid.hpp b/src/Model/Grid.hpp
new file mode 100644
index 0000000..21c653a
--- /dev/null
+++ b/src/Model/Grid.hpp
@@ -0,0 +1,53 @@
+#ifndef DEF_GRID
+#define DEF_GRID
+
+/* Grid.h
+ * Defines the class Grid
+ * A grid contains a table of cells the game will be set on
+ * Creators : krilius, manzerbredes
+ * Date : 29/04/2015 */
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <tuple>
+
+class Grid
+{
+ private:
+ int m_size;
+ std::vector<std::vector<int> > m_grid;
+
+ int maxStrLenInGrid();
+ public:
+ Grid();
+ ~Grid();
+
+ std::string description();
+ bool isEmpty(int i, int j);
+ std::tuple<int, int> getRandomEmptyCellCoord();
+
+ bool setCell(std::tuple<int, int> coord, int value);
+ 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> getCol(int col);
+
+ bool isFull();
+ bool isOver();
+
+ void setCol(int col, std::vector<int> colVect);
+ std::vector<int> reverseLine(std::vector<int> line);
+
+ //Moves
+ void swipeRight();
+ void swipeLeft();
+ void swipeUp();
+ void swipeDown();
+};
+
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
index 0d3b950..49c7a20 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,25 +1,30 @@
-#include <SFML/Graphics.hpp>
+//----- STD include -----
+#include <iostream>
#include <string>
+#include <time.h>
+#include <tuple>
+//----------------------
+//----- Personnal include -----
+#include "./Controllers/ConsoleController/ConsoleController.hpp"
+//-----------------------------
+
+
+
+
+
+//----- Start -----
int main()
{
- sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
- sf::CircleShape shape(100.f);
- shape.setFillColor(sf::Color::Green);
-
- while (window.isOpen())
- {
- sf::Event event;
- while (window.pollEvent(event))
- {
- if (event.type == sf::Event::Closed)
- window.close();
- }
-
- window.clear();
- window.draw(shape);
- window.display();
- }
-
- return 0;
+ //Init random
+ srand(time(NULL));
+
+ //Init controller
+ ConsoleController controller;
+
+ //Run the game
+ controller.run();
+
+
+ return 0;
}