add ipi9
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
#include <iostream>
|
||||
#include <unistd.h> // needed for usleep
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
#include "board.hh"
|
||||
|
||||
// Basisklassen
|
||||
struct Regel
|
||||
{
|
||||
virtual void anwenden(Board& board) = 0;
|
||||
};
|
||||
|
||||
class TorusCondition : public BoundaryCondition
|
||||
{
|
||||
bool boundary(Board& board, int i, int j) {
|
||||
if (i == board.height() - 1) {
|
||||
return board.isLiving(0, j);
|
||||
} else if (i == -1) {
|
||||
return board.isLiving(board.height() - 1, j);
|
||||
} else if (j == board.width() - 1) {
|
||||
return board.isLiving(i, 0);
|
||||
} else if (j == -1) {
|
||||
return board.isLiving(i, board.width() - 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class AliveCondition : public BoundaryCondition
|
||||
{
|
||||
bool boundary(Board& board, int i, int j) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class DeadCondition : public BoundaryCondition
|
||||
{
|
||||
bool boundary(Board& board, int i, int j) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class GameOfLifeRules : public Regel
|
||||
{
|
||||
public :
|
||||
//void anwenden(Board& board) {
|
||||
// // copy new board from old board
|
||||
// Board updated = Board(board.width(), board.height());
|
||||
// for (int i = 0; i < board.height(); i++) {
|
||||
// for (int j = 0; i < board.width(); i++) {
|
||||
// int n = board.livingCells(i, j);
|
||||
// int self = board.isLiving(i, j);
|
||||
// if (self && n < 2) {
|
||||
// updated.updateField(i, j, false);
|
||||
// } else if (!self && n == 3) {
|
||||
// updated.updateField(i, j, true);
|
||||
// } else if (self && n > 3) {
|
||||
// updated.updateField(i, j, false);
|
||||
// } else {
|
||||
// updated.updateField(i, j, self);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// board = updated;
|
||||
//}
|
||||
};
|
||||
|
||||
// Ein zellulaerer Automat, der Regeln und Datenstrukturen von aussen bekommt
|
||||
class Automat
|
||||
{
|
||||
public :
|
||||
// der Datentyp fuer das 2D Bool Array
|
||||
Automat(Board& board, Regel& regel)
|
||||
: _board(board)
|
||||
, _regel(regel)
|
||||
{}
|
||||
|
||||
// mache n Schritte
|
||||
void doSteps(int n=1)
|
||||
{
|
||||
for (int i=0; i<n; ++i)
|
||||
{
|
||||
// Linux-spezifische Art und Weise den Inhalt der Konsole zu loeschen
|
||||
// und den Cursor nach oben links zu setzen.
|
||||
//std::cout << "\x1B[2J\x1B[H" << "Step " << i << std::endl << _board;
|
||||
// Das Wiedergeben der Loesung soll immer 10 Sekunden (=1e7 Mikrosekunden)
|
||||
// dauern. Sie koennen diesen Wert auch aendern.
|
||||
usleep(1.e7/n);
|
||||
//_regel.anwenden(_board);
|
||||
}
|
||||
}
|
||||
|
||||
private :
|
||||
Board& _board;
|
||||
Regel& _regel;
|
||||
};
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
std::cout << "Usage: ./<progname> <txt-file>" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
Board board = Board(2, 2, AliveCondition);
|
||||
board.updateField(1,1, true);
|
||||
board.livingCells(1,1);
|
||||
|
||||
// Initialisiere Datenstruktur des 2D Bool Array
|
||||
// TODO
|
||||
// Ueberlegen Sie sich wie Sie einen Startzustand in das 2D Bool Array bekommen
|
||||
// Lesen Sie ggf.
|
||||
// (1) eine solche Textdatei mittels Filestream ein
|
||||
// (2) ueberladen Sie Operatoren operator<< oder operator>>
|
||||
|
||||
// TODO
|
||||
// - legen Sie eine Instanz der Randbedingung an
|
||||
// - legen Sie eine Instanz des Regelsystems an
|
||||
// - Initialisieren Sie den zellulaeren Automaten
|
||||
|
||||
// Experimentieren Sie hier mit Ihrem Automaten
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user