Hilfe bei CONWAYS GAME OF LIFE

Neue Frage »

Auf diesen Beitrag antworten »
kleinerstrolch Hilfe bei CONWAYS GAME OF LIFE

Meine Frage:
aufgabe

http://fs1.directupload.net/images/150108/3qo86d3j.png das ist die Aufgabe

http://pastebin.com/mBXCJNWE
http://pastebin.com/vKFEgqQg

das sind die 2 anhänge mit denen gearbeitet werden soll

Meine Ideen:
#include<fstream>
#include<iostream>
#include<unistd.h>

#include"twodboolarray.hh"

// Basisklassen
class Regel
{
public:
typedef TwoDBoolArray Daten;
virtual void anwenden(Daten& daten) = 0;
};

class BoundaryCondition
{
public:
typedef TwoDBoolArray Daten;
virtual bool boundary(Daten& daten, int i, int j) = 0;
};

class TorusCondition : public BoundaryCondition
{
// Implementieren Sie hier eine Randbedingung, welche das
// Gebiet als doppelt periodisch annimmt.
};

class AliveCondition : public BoundaryCondition
{
// Implementieren Sie hier eine Randbedingung welche annimmt,
// dass rund um das Rechengebiet lebende Zellen sitzen.
};

class DeadCondition : public BoundaryCondition
{
// Implementieren Sie hier eine Randbedingung welche annimmt,
// dass rund um das Rechengebiet tote Zellen sitzen.
};

class GameOfLifeRules : public Regel
{
public:
typedef TwoDBoolArray Daten;

GameOfLifeRules(BoundaryCondition& _bc) : bc(_bc) {}

// Implementieren Sie hier die Regeln des Game of Life

private:
BoundaryCondition& bc;
};

// Ein zellulärer Automat, der Regeln und Datenstrukturen von au�en bekommt
class Automat
{
public:
typedef TwoDBoolArray Daten;
Automat(Daten& daten, Regel& regel) : _daten(daten), _regel(regel)
{}

// mache n Schritte
void step(int n=1)
{
for (int i=0; i<n; ++i)
{
// Linux-spezifische Art und Weise den Inhalt der Konsole zu löschen
// und den Cursor nach oben links zu setzen.
std::cout << "\x1B[2J\x1B[H" << "Step " << i << std::endl << _daten;
// Das Wiedergeben der Lösung soll immer 10 Sekunden (=1e7 Mikrosekunden)
// dauern. Sie können diesen Wert auch ändern.
usleep(1.e7/n);
_regel.anwenden(_daten);
}
}

private:
Daten& _daten;
Regel& _regel;
};

int main(int argc, char** argv)
{
if (argc != 2)
{
std::cout << "Usage: ./<progname> <txt-file>" << std::endl;
return 1;
}

// Initialisiere die Datenstruktur
TwoDBoolArray a;
std::ifstream file;
file.open(argv[1]);
if (file.good())
file >> a;
else
{
std::cout << "Cannot read file" << std::endl;
return 1;
}

// Wähle Randbedingung
TorusCondition bc;

// Wähle ein Regelsystem
GameOfLifeRules rules(bc);

// Initialisiere den zellulären Automaten
Automat automat(a,rules);

// Experimentieren Sie hier mit Ihrem Automaten.


return 0;
}
 
Auf diesen Beitrag antworten »
kleinerstrolch

keiner? unglücklich wäre wirklich extrem wichtig
Auf diesen Beitrag antworten »
eulerscheZahl

Es macht eben keine guten Eindruck, wenn du schreibst, dass du es bis heute brauchst und dann auch noch an anderer Stelle fragst, Herr Heisenberg.

Aber ich spiele mal mit: versuchen wir, das Programm zu kompilieren:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
g++ *.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:102:18: error: cannot declare variable ‘bc’ to be of abstract type ‘TorusCondition’
   TorusCondition bc;
                  ^
main.cpp:22:7: note:   because the following virtual functions are pure within ‘TorusCondition’:
 class TorusCondition : public BoundaryCondition
       ^
main.cpp:19:16: note: 	virtual bool BoundaryCondition::boundary(BoundaryCondition::Daten&, int, int)
   virtual bool boundary(Daten& daten, int i, int j) = 0;
                ^
main.cpp:105:19: error: cannot declare variable ‘rules’ to be of abstract type ‘GameOfLifeRules’
   GameOfLifeRules rules(bc);
                   ^
main.cpp:40:7: note:   because the following virtual functions are pure within ‘GameOfLifeRules’:
 class GameOfLifeRules : public Regel
       ^
main.cpp:12:16: note: 	virtual void Regel::anwenden(Regel::Daten&)
   virtual void anwenden(Daten& daten) = 0;

offensichtlich muss die abstrakte Methode virtual bool boundary(Daten& daten, int i, int j) = 0; implementiert werden. Ich verstehe aber nicht, was hier getan werden soll. Wenn ich erkennen soll, ob Felder benachbart sind, brauche ich auch 2 Felder und nicht zur eines verwirrt

edit: sind ja zwei, das Feld wird ja in einem eindimensionalen Array gespeichert.

sollte dann in etwa so gehen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
class TorusCondition : public BoundaryCondition
{
  public:
  bool boundary(Daten& daten, int i, int j) { //true, wenn zwei Felder benachbart sind
      int x1 = i / daten.cols();
      int y1 = i % daten.cols();
      int x2 = j / daten.cols();
      int y2 = j % daten.cols();
      int deltaX = abs(x1 - x2);
      if (deltaX = daten.rows() - 1) deltaX = 1; //an beiden Rändern
      int deltaY = abs(y1 - y2);
      if (deltaY = daten.cols() - 1) deltaY = 1;
      return deltaX < 2 && deltaY < 2;
  }
};
Auf diesen Beitrag antworten »
kleinerstrolch

nice immerhin ein teilabschnitt

das mit doppelpost ist eben weil es unendlich wichtig ist unglücklich
 
Auf diesen Beitrag antworten »
Karlito

Meine bescheidene Meinung: kurz vor dem Abgabetermin mit soetwas zu kommen und dann noch eine fertige Lösung zu verlangen finde ich unterirdisch. Jeder Student ist dafür verantwortlich, dass er sein Zeug geregelt bekommt (eigenständig). Andere Leute für seine Leistungen zu bezahlen kann ich nicht unterstützen. An meiner Fakultät gibt es ab und zu 50€ Deals für Abgaben. Ich lehne diese strikt ab. Und wenn es so wichtig ist, hättest du es einfach mal nicht so schleifen lassen sollen... Und sollte es andere gewichtige Gründe geben, warum Du nicht in der Lage warst abzugeben, dann ist der Maßstab, ob sie gültig sind, die Beurteilung dieser von deinem Dozenten.

böse
Auf diesen Beitrag antworten »
kleinerstrolch

würde die aufgabe mich nicht überfordern und wäre diese woche nicht einiges richtig mieß gelaufen würde ich nicht fragen - danke für die moralpredigt aber es ist nunmal eben so gekommen wie es jetzt ist


edit: jetz hat er nurnoch ein problem mit dem "abs" not declared in this scope
ebenso wie main.cpp:115:19: error: cannot declare variable 'rules' to be of abstract type 'GameOfLifeRules'
GameOfLifeRules rules(bc);
Auf diesen Beitrag antworten »
eulerscheZahl

Ich werde dir auch nicht alles vorbeten.
Habe nochmal nachgedacht, mein Ansatz macht so wenig Sinn im Hinblick auf das Gesamtproblem.

Ich würde so vorgehen:
virtual bool boundary(Daten& daten, int i, int j) gibt an, ob in einem Feld Leben ist. Wenn die Karte verlassen wird, muss entsprechend abgesichert werden, was passiert (Torus, Leben, ..) i und j sind die x,-y Position des Feldes.
code:
1:
2:
3:
4:
5:
6:
  public:
  bool boundary(Daten& daten, int i, int j) { //true, wenn Feld[i][j] Leben ist
      i %= daten.cols(); if (i < 0) i += daten.cols(); //komme am Rand auf anderer Seite wieder rein
      j %= daten.rows(); if (j < 0) j += daten.rows();
      return daten[i][j];
  }

die anderer Regeln überlasse ich dir.

PS: abs ist eine Funktion in cmath - hat sich mit meiner Korrektur aber sowieso erledigt.
Auf diesen Beitrag antworten »
eulerscheZahl

Mein Automat läuft mitlerweile, viel war es nicht mehr.
Aber wenn du ihn haben willst, musst du schon mitarbeiten, ein Anfang wären die beiden fehlenden Grenzregeln.
Auf diesen Beitrag antworten »
kleinerstrolch

schaffe das heut nichtmehr, zu wenig schlaf und ständig komm ich beim einlesen durcheinander

trotzdem danke für deine mühe und dein hilfsangebot
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »