void CellAutomataAgent::evaluate(PPtr<KGridBasic> readLayer, PPtr<KGridBasic> writeLayer, int phase) { switch (_problem) { case LIFE: gameOfLife(readLayer, writeLayer, phase); break; case BRAIN: brianBrain(readLayer, writeLayer, phase); break; case ANT: ant(readLayer, writeLayer, phase); break; default: break; } }
int main() { srand(static_cast<unsigned int> (time(NULL))); // Create the main window sf::RenderWindow App(sf::VideoMode(WINDOW_W, WINDOW_H), "Game of Life"); App.setFramerateLimit(60); sf::Clock clock; float elapsedTime=0; //Game of life; CellularAutomaton gameOfLife(WINDOW_W, WINDOW_H); int gen=0; bool pausedGame = true; //View (pour zoom) sf::View mainView = App.getDefaultView(); sf::View zoomView; zoomView.setSize(WINDOW_W / ZOOM_FRACTION, WINDOW_H / ZOOM_FRACTION); bool zoom = false; // Start the game loop while (App.isOpen()) { // Process events sf::Event event; while (App.pollEvent(event)) { // Close window : exit if (event.type == sf::Event::Closed) App.close(); // Simulation controls if (event.type == sf::Event::KeyPressed) { switch(event.key.code) { case sf::Keyboard::Space : // Pause simulation if(event.key.code == sf::Keyboard::Space) { if(pausedGame) pausedGame = false; else pausedGame = true; } break; case sf::Keyboard::Z : // Toggle zoom if(event.key.code == sf::Keyboard::Z) { if(zoom) { zoom = false; App.setView(App.getDefaultView()); } else { zoom = true; App.setView(zoomView); } } break; case sf::Keyboard::R : // reset grid with random cell states gameOfLife.reset(); break; case sf::Keyboard::C: // clear all living cells gameOfLife.clear(false); break; case sf::Keyboard::Right : if(pausedGame) { if(event.key.control) for(unsigned int i=0; i<10; i++) gameOfLife.nextStep(); else gameOfLife.nextStep(); } break; default : break; } } if(event.type == sf::Event::MouseMoved) { if(!zoom) { sf::Vector2f mousePos = App.mapPixelToCoords(sf::Mouse::getPosition(App)); mousePos.x = floor(mousePos.x); mousePos.y = floor(mousePos.y); zoomView.setCenter(mousePos); } } // Change cell state according to mouse button if(event.type == sf::Event::MouseButtonReleased && zoom) { sf::Vector2f mousePos = App.mapPixelToCoords(sf::Mouse::getPosition(App)); mousePos.x = floor(mousePos.x); mousePos.y = floor(mousePos.y); if(event.mouseButton.button == sf::Mouse::Left) gameOfLife.setCell((int) mousePos.x, (int) mousePos.y, true); if(event.mouseButton.button == sf::Mouse::Right) gameOfLife.setCell((int) mousePos.x, (int) mousePos.y, false); } if(event.type == sf::Event::Resized) { mainView.setSize((float)App.getSize().x, (float)App.getSize().y); mainView.setCenter(App.getSize().x/2.f, App.getSize().y/2.f); zoomView.setSize((float)App.getSize().x / ZOOM_FRACTION, (float)App.getSize().y / ZOOM_FRACTION); gameOfLife.resize(App.getSize().x, App.getSize().y); } } if(zoom) { sf::Vector2i mousePos = sf::Mouse::getPosition(App); if(mousePos.x < SCROLL_WIDTH) zoomView.move(elapsedTime*(-SCROLL_SPEED), 0); else if(mousePos.x > (int)(App.getSize().x - SCROLL_WIDTH)) zoomView.move(elapsedTime*(SCROLL_SPEED), 0); if(mousePos.y < SCROLL_WIDTH) zoomView.move(0, elapsedTime*(-SCROLL_SPEED)); else if(mousePos.y > (int)(App.getSize().y - SCROLL_WIDTH)) zoomView.move(0, elapsedTime*(SCROLL_SPEED)); App.setView(zoomView); } else App.setView(mainView); if(!pausedGame) gameOfLife.nextStep(); App.clear(sf::Color(GREY,GREY,GREY)); gameOfLife.draw(App); App.display(); elapsedTime = clock.getElapsedTime().asSeconds(); clock.restart(); } return EXIT_SUCCESS; }