From 63f6cce65d4b6ed7cbe695c2765cb792bc740600 Mon Sep 17 00:00:00 2001 From: Anthony <anthony.noir@etu.utc.fr> Date: Sat, 5 Jun 2021 15:21:39 +0200 Subject: [PATCH] IT'S ALAIVE ! IT'S ALIVE ! --- forms/interface.ui | 8 ++-- include/interface.hpp | 7 +++ include/simulation.hpp | 9 +++- src/interface.cpp | 46 ++++++++++++++++++- .../mooreNeighborhoodRule.cpp | 4 +- src/simulation.cpp | 9 ++-- 6 files changed, 72 insertions(+), 11 deletions(-) diff --git a/forms/interface.ui b/forms/interface.ui index 9617cd3..7c54e79 100644 --- a/forms/interface.ui +++ b/forms/interface.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>1056</width> + <width>1068</width> <height>771</height> </rect> </property> @@ -212,7 +212,7 @@ pattern recorded :</string> </size> </property> <property name="text"> - <string>50</string> + <string>10</string> </property> <property name="maxLength"> <number>10</number> @@ -605,8 +605,8 @@ pattern recorded :</string> <rect> <x>0</x> <y>0</y> - <width>1056</width> - <height>25</height> + <width>1068</width> + <height>26</height> </rect> </property> <widget class="QMenu" name="menuFichier"> diff --git a/include/interface.hpp b/include/interface.hpp index f11049c..bde52bf 100644 --- a/include/interface.hpp +++ b/include/interface.hpp @@ -73,6 +73,12 @@ private slots: void on_savePatternButton_clicked(); + void on_nextButton_clicked(); + + void on_prevButton_clicked(); + + void on_playPauseButton_clicked(); + private: //! \brief Initialiser la liste des transitions et voisinages disponibles void init_transition_neighborhood_list(); @@ -114,6 +120,7 @@ private: TransitionRule* m_transition_rule; NeighborhoodRule* m_neighborhood_rule; QJsonObject m_loaded_model; + QTimer* timer; bool m_customizing; }; #endif // MAINWINDOW_HPP diff --git a/include/simulation.hpp b/include/simulation.hpp index d7190d0..8627f50 100644 --- a/include/simulation.hpp +++ b/include/simulation.hpp @@ -67,6 +67,12 @@ public: + //! \brief Indique si la simulation peut tourner + //! \return vrai si la simulation peut tourner + bool runnable() {return canRun;} + + + //! \brief Remet la simulation dans son état de départ void reset(); @@ -74,7 +80,8 @@ public: void step(); //! \brief Fais reculer la simulation d'un pas si possible - void back(); + //! \return vrai si la simulation a reculé + bool back(); }; #endif // SIMULATION_HPP diff --git a/src/interface.cpp b/src/interface.cpp index 3b4c102..9605315 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -16,12 +16,14 @@ #include <QDate> #include <QTextStream> #include <QInputDialog> +#include <QTimer> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) - , simulation(), - m_customizing(false) + , simulation() + , timer(new QTimer(this)) + , m_customizing(false) { ui->setupUi(this); @@ -55,6 +57,12 @@ MainWindow::MainWindow(QWidget *parent) ui->struct_library->update_cell_pixel_size(ui->grid_view->cell_screen_size()); load_model(default_model()); + + connect(timer, &QTimer::timeout, this, [this](){ + on_nextButton_clicked(); + std::cout << "a\n"; + timer->start(); + }); } MainWindow::~MainWindow() @@ -605,3 +613,37 @@ void MainWindow::on_savePatternButton_clicked() { save_grid_configuration(); } + +void MainWindow::on_nextButton_clicked() +{ + simulation.setGrid(ui->grid_view->get_grid()); + simulation.step(); + ui->grid_view->copy_grid(simulation.getGrid()); +} + +void MainWindow::on_prevButton_clicked() +{ + if(!simulation.back()) { + QMessageBox::critical(this, "Retour arrière impossible", "L'historique est vide : impossible de revenir en arrière."); + } + ui->grid_view->copy_grid(simulation.getGrid()); +} + +void MainWindow::on_playPauseButton_clicked() +{ + if(timer->isActive()) { + //Pause + timer->stop(); + } else { + //Play + int frequence = ui->simSpeedSpinbox->value(); + if(frequence == 0) { + QMessageBox::critical(this, "Impossible de démarrer", "Impossible de lancer la simulation à une vitesse nulle."); + } else if(!simulation.runnable()) { + QMessageBox::critical(this, "Impossible de démarrer", "Impossible de lancer la simulation : les règles ne sont pas définies ou incompatibles."); + } else { + timer->setInterval(1000/frequence); + timer->start(); + } + } +} diff --git a/src/neighborhood_rules/mooreNeighborhoodRule.cpp b/src/neighborhood_rules/mooreNeighborhoodRule.cpp index 4abc484..35fe0f1 100644 --- a/src/neighborhood_rules/mooreNeighborhoodRule.cpp +++ b/src/neighborhood_rules/mooreNeighborhoodRule.cpp @@ -15,7 +15,9 @@ mooreNeighborhoodRule::mooreNeighborhoodRule(int _radius) for(int j = -_radius; j <= _radius; j++){ newCord.x = i; newCord.y = j; - format.positions.push_back(newCord); + if(!(newCord.x == 0 && newCord.y == 0)) { + format.positions.push_back(newCord); + } } } } diff --git a/src/simulation.cpp b/src/simulation.cpp index 5c61e76..540d545 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -5,13 +5,13 @@ Simulation::Simulation() : canRun(false), time(0), automaton(), startGrid(0,0), Simulation::~Simulation() {} void Simulation::setNeighborhoodRule(NeighborhoodRule* NR) { - canRun = false; automaton.setNeighborhoodRule(NR); + canRun = automaton.getNeighborhoodRule()&&automaton.getTransitionRule()&&automaton.getTransitionRule()->acceptFormat(automaton.getNeighborhoodRule()->getFormats()); } void Simulation::setTransitionRule(TransitionRule* TR) { - canRun = false; automaton.setTransitionRule(TR); + canRun = automaton.getNeighborhoodRule()&&automaton.getTransitionRule()&&automaton.getTransitionRule()->acceptFormat(automaton.getNeighborhoodRule()->getFormats()); } void Simulation::setAlphabet(const Alphabet& A) { @@ -71,11 +71,14 @@ void Simulation::step() { ++time; } -void Simulation::back() { +bool Simulation::back() { + bool r=false; if(!hist.isEmpty()) { automaton.setGrid(hist.topGrid()); //automaton.getNeighborhoodRule()->back(); hist.popGrid(); --time; + r=true; } + return r; } -- GitLab