feld mit klassen, geht das? Habe einen Knoten im Hirn.
-
Ich hoffe die Überschrift implementiert es schon:
Ich habe ein übel großes Verständnisproblem und brauche eventuell Hilfe/Denkanstöße.Ich code gerade schmutzig vor mich hin. Ein kleines Game Of Life soll entstehen.
(das ganze mit Hilfe der libSDL auf Linux(zuHause) -> um es später einfach nach Windoof(Schule) portieren zu können).Themengebiet ist OOP, also sollen das hübsch' Klassen eingebaut werden.
Nun habe ich schon das Ausgabefeld mit Hilfe von struct als Feld(auf dynamische Größe ausgelegt) so quasi mit pointern auf das NachfolgeStruct aufgebaut - so viel zur grafischen Ausgabe.
Aber die klasse, die später das eigentliche Spielfeld für die Berechnung aufnimmt bekomme ich auf diese Weise nicht hin.
...bin einfach noch zu dumm.Nun ist die Frage, wie arbeite ich mit pointern in Klassen?
Und können überhaupt mir klassen (sinnvoll) Felder angelegt werden?
Oder gibt es noch viele andere tipps, eventuell eine andere Lösung?hier meine ersten versuche:
golclass.h#ifndef golclass_h #define golclass_h class Lebensform { private: class Lebensform *next; short x; short y; short life; short tmp; protected: public: //Konstruktor //Lebensform(class *Lebensform); Lebensform(); //Destruktor ~Lebensform(); //Methoden void AddLebensform(class Lebensform); int WertAusgabe(int, int); }; #endif
#include "golclass.h" //Lebensform::Lebensform(class Lebensform *lifestart) //{ // class Lebensform *lifestart=0; //} Lebensform::Lebensform() { x=1; y=1; life=0; tmp=0; } Lebensform::~Lebensform() { } void Lebensform::AddLebensform(class Lebensform *lifestart) { life->next = lifestart; lifestart = life; } int Lebensform::WertAusgabe(int X, int Y) { return 0; }
Auszug aus main.cc
[...] class Lebensform *lifestart = 0; for(short i=1; i <= (gamesizeX*gamesizeY); i++) { class Lebensform *life(); //*life = (class Lebensform *)malloc( sizeof( class Lebensform)); *life.AddLebensform(&lifestart); } [...]
DANKE für eure Mühe.
sollte ich noch wesentliche Infos vergessen haben, einfach annörgeln.PS: Natürlich hab ich vorher viel gegooglet, gesucht und selber ausprobiert.
-
Naja will ja nicht rumnörgeln
aber deine klasse und somit das programm ist nicht der hit
In deiner Klasse Lebensform kommt das rein, was eine "lebensform" ist.
sprich
life
x
y ( koordinaten )
energy
was weiss ich
dasBildderLebensformdann machst du eine 2te klasse "FELD" z.b. die im konstruktor die grösse hat ( z.b. 20*50 feld )
und dann setzt du in feld eine lebensform oder wenn es die klasse FELD zulässt mehrere lebensformen
in deiner "klasse"
in main() da erzeugst du zuerst ein objekt FELD und dann setzt du die lebensformen rein und kannst das feld ausgeben
die ausgabe des feldes erfolgt in der klasse FELD
z.b.
Feld meinfeld(20,50); meinfeld.addlebensform(2,5);// hier überprüfen ob die parameter stimmen können oder auch meinfeld.add_in_jedes_feld(); meinfeld.ausgeben(); // hier wird z.b. in der konsole oder grafisch unter SDL das feld gezeichnet mit den lebensformen
-
hm.
ich glaube ich verstehe dich nicht ganz.
... und du mich glaube ich auch nicht^^ich habe aber einfach noch bissel weitergewerkelt.
Ich denke so ähnlich müsste ich eine Feld erzeugen können.ich poste einfach nochmal meinen Fehlerhaften Code.
Hab bischen verfeinert und bekomme jetzt nur noch wenige Fehler.[...] class Lebensform *lifestart = 0;//Startmarke des class-Feldes for(short i=1; i <= gamesizeX; i++) { for(short j=1; j <= gamesizeY; j++) { class Lebensform life(i, j); //*life = (class Lebensform *)malloc( sizeof( class Lebensform));//entfällt? *life.AddLebensform(*lifestart, *life);//einfuegen von life in das Feld } } [...]
golclass.h
#ifndef golclass_h #define golclass_h class Lebensform { private: class Lebensform *next; short x; short y; short life; short tmp; protected: public: //Konstruktor //Lebensform(class *Lebensform); Lebensform(short, short); //Destruktor ~Lebensform(); //Methoden void AddLebensform(class Lebensform *lifestart, class Lebensform *life); int WertAusgabe(int, int); }; #endif
#include "golclass.h" //Lebensform::Lebensform(class Lebensform *lifestart) //{ // class Lebensform *lifestart=0; //} Lebensform::Lebensform(short X, short Y) { x=X; y=Y; life=0; tmp=0; } Lebensform::~Lebensform() { } void Lebensform::AddLebensform(class Lebensform *lifestart, class Lebensform *life) { life->next = lifestart; //erschaffene Klasse *life, soll lifestart = life; //in das Feld eingefuegt werden } int Lebensform::WertAusgabe(int X, int Y) { return 0; //Dummy-Wert }
Die Fehler liegen in der main.cc im Aufruf von AddLebensform().
Vermutlich übergebe ich die pointeradressen falsch. Ich denke doch, dass ich die übergeben muss und nichts anderes?!?
Vermutlich sind aber auch die Zeigerdeklarationen im AddLebensform-Kopf falsch(class Lebensform *lifestart, class Lebensform *life -> Augenmerk auf die Sternchen, gehören die dahin?).
Oder auch etwas gaaanz anderes.
-
ok, ich hab es jetzt hinbekommen.
Allerdings ist die Aufbauzeit derart gruselig, dass ich noch nach einer besseren Lösung suchen werde.golclass.h
/*************************************************************************** * golclass.h * * Sun Mar 13 13:39:02 2005 * Copyright 2005 User * Email ****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdlib.h> #include <iostream> #ifndef golclass_h #define golclass_h class Lebensform { private: Lebensform *next; short x; short y; short alive; short tmp; protected: public: //Konstruktor //Lebensform(class *Lebensform); Lebensform(short, short); //Destruktor ~Lebensform(); //Methoden void AddLebensform(Lebensform*); short WertHolen(Lebensform*, short, short); short Lebensform::WertSetzen(Lebensform*, short, short, short, short, short); void Lebensform::NGeneration(Lebensform*, short, short); }; #endif
/*************************************************************************** * golclass.cc * * Sun Mar 13 13:41:22 2005 * Copyright 2005 User * Email ****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdlib.h> #include <iostream> #include "SDL.h" #include "golclass.h" //Lebensform::Lebensform(class Lebensform *lifestart) //{ // class Lebensform *lifestart=0; //} Lebensform::Lebensform(short X, short Y) { x=X; y=Y; alive=0; tmp=0; } Lebensform::~Lebensform() { } void Lebensform::AddLebensform(Lebensform *lifestart) { next = lifestart; //erschaffene Klasse *life soll an life start angehängt werden } short Lebensform::WertHolen(Lebensform *lifestart, short X, short Y) { //std::cout << lifestart << std::endl; for(Lebensform *p_life=lifestart; p_life ; p_life = p_life->next) { if((p_life->x==X) && (p_life->y==Y)) { return p_life->alive; break; } } return 0; } short Lebensform::WertSetzen(Lebensform *lifestart, short X, short Y, short A, short procedure, short alive_or_tmp) { int ret = 0; for(Lebensform *p_life=lifestart; p_life ; p_life = p_life->next) { if((p_life->x==X) && (p_life->y==Y)) { switch(procedure) { case 1: if(p_life->alive==1){A = 1;} //leben erhalten break; default: //brutal ueberschreiben break; } switch(alive_or_tmp) { case 0: p_life->alive = A; break; case 1: p_life->tmp = A; break; case 2: p_life->alive = A; p_life->tmp = A; break; default: break; } ret = A; break; } } return A; } void Lebensform::NGeneration(Lebensform *lifestart, short X, short Y) { short nearbes; short nearbe[8]={0, 0, 0, 0, 0, 0, 0, 0}; for(short i=X+1; i>=2; i--) { for(short j=Y+1; j>=2; j--) { Lebensform *Wechselbalg; for(Lebensform *p_life=lifestart; p_life; p_life = p_life->next) { if((p_life->x==i) && (p_life->y==j)) { if(p_life->alive>0) {nearbe[0]=1;} if((p_life->next->x==i) && (p_life->next->y=j-1)) {if(p_life->next->alive>0) {nearbe[1]=1;}} else {if(p_life->WertHolen(lifestart, i, j-1)>0) {nearbe[1]=1;}} if((p_life->next->next->x==i) && (p_life->next->next->y=j-2)) {if(p_life->next->next->alive>0) {nearbe[2]=1;}} else {if(p_life->WertHolen(lifestart, i, j-2)>0) {nearbe[2]=1;}} continue; } if((p_life->x==i-1) && (p_life->y==j)) { if(p_life->alive>0) {nearbe[3]=1;} if((p_life->next->x==i-1) && (p_life->next->y=j-1)) {Wechselbalg = p_life->next;} else { for(Lebensform *e_life=lifestart; e_life ; e_life = e_life->next) {if((e_life->x==i-1) && (e_life->y==j-1)) {Wechselbalg = e_life; Wechselbalg->tmp = 1;}} } if((p_life->next->next->x==i-1) && (p_life->next->next->y=j-2)) {if(p_life->next->next->alive>0) {nearbe[4]=1;}} else {if(p_life->WertHolen(lifestart, i-1, j-2)>0) {nearbe[4]=1;}} continue; } if((p_life->x==i-2) && (p_life->y==j)) { if(p_life->alive>0) {nearbe[5]=1;} if((p_life->next->x==i-2) && (p_life->next->y=j-1)) {if(p_life->next->alive>0) {nearbe[6]=1;}} else {if(p_life->WertHolen(lifestart, i-2, j-1)>0) {nearbe[6]=1;}} if((p_life->next->next->x==i-2) && (p_life->next->next->y=j-2)) {if(p_life->next->next->alive>0) {nearbe[7]=1;}} else {if(p_life->WertHolen(lifestart, i-2, j-2)>0) {nearbe[7]=1;}} break; } } for(short i=0; i<=7; i++) { nearbes = nearbes + nearbe[i]; nearbe[i]=0; } if(nearbes==3) {Wechselbalg->tmp = 1;} if((nearbes<2) || (nearbes>3)) {Wechselbalg->tmp = 0;} nearbes=0; } } //uebertragen (von tmp nach alive) for(Lebensform *p_life=lifestart; p_life; p_life = p_life->next) { p_life->alive = p_life->tmp; } }
//SPIELFELD ERZEUGEN Lebensform *lifestart = 0;//Startmarke des class-Feldes for(short i=0; i <= gamesizeX+1; i++) { for(short j=0; j <= gamesizeY+1; j++) { Lebensform *life; life = new Lebensform(i, j); life->AddLebensform(lifestart);//einfuegen von life in das Feld lifestart = life; //lifestart bekommt neue Adresse } } std::cout << "Set Lebensform" << std::endl; std::cout << lifestart << std::endl; [...] // +RANDOM & RESET ANFANG if(((random) || (reset)) && (stop)) { srand(endzeit); for(short i=1; i <= gamesizeX; i++) { for(short j=1; j <= gamesizeY; j++) { short alive; short leben_erhalten; if(random) { if((rand() %50+1)<15) { alive=1; leben_erhalten=1; } else { alive=0; leben_erhalten=1; } } if(reset) { alive=0; leben_erhalten=0; Lebensform *life; life->WertSetzen(lifestart, i, j, alive, leben_erhalten, 2); } Lebensform *life; life->WertSetzen(lifestart, i, j, alive, leben_erhalten, 2); } } random = 0; reset = 0; } // +RANDOM & RESET ENDE // AUFBAU ANFANG switch(zoom) { //case 0: felderzahlx=(ex-sx)/2; felderzahly=(ey-sy)/2; zoomi=2; break; case 1: felderzahlx=(field_endx-field_startx)/4; felderzahly=(field_endy-field_starty)/4; zoomi=4; break; case 2: felderzahlx=(field_endx-field_startx)/8; felderzahly=(field_endy-field_starty)/8; zoomi=8; break; case 3: felderzahlx=(field_endx-field_startx)/12; felderzahly=(field_endy-field_starty)/12; zoomi=12; break; case 4: felderzahlx=(field_endx-field_startx)/16; felderzahly=(field_endy-field_starty)/16; zoomi=16; break; default: felderzahlx=(field_endx-field_startx)/8; felderzahly=(field_endy-field_starty)/8; zoomi=8; break; } int anzahl = 1; for(short i=1; ((i <= felderzahlx) && (anzahl <= (felderzahlx*felderzahly))); i++) { for(short j=1; ((j <= felderzahly) && (anzahl <= (felderzahlx*felderzahly))); j++, anzahl++) { struct golo *g; Lebensform *life; if (first_call==0) { for(g = start; g; g = g->next) { if((g->x==i) && (g->y==j)) { short lifewert = life->WertHolen(lifestart, i+move_leftright, j+move_updown); if(g->t != lifewert) { g->t = lifewert; if (g->t==0) { g->image = IMG_Load("gold.bmp"); } else { g->image = IMG_Load("goll.bmp"); } TestImage(g->image); //Move_Field_Image(SCREEN, g->image, 0, 0, ((i*zoomi)-zoomi)+133, ((j*zoomi)-zoomi)+33, zoomi, zoomi, field_startx, field_endx, field_starty, field_endy, move_updown, move_leftright); MoveImage(SCREEN, g->image, 0, 0, ((i*zoomi)-zoomi)+133, ((j*zoomi)-zoomi)+33, zoomi, zoomi); } } } } else { g = (struct golo *)malloc( sizeof( struct golo)); g->x = i; g->y = j; g->t = life->WertHolen(lifestart, i+move_leftright, j+move_updown); if (g->t==0) {g->image = IMG_Load("gold.bmp");} else {g->image = IMG_Load("goll.bmp");} TestImage(g->image); //Move_Field_Image(SCREEN, g->image, 0, 0, ((i*zoomi)-zoomi)+133, ((j*zoomi)-zoomi)+33, zoomi, zoomi, field_startx, field_endx, field_starty, field_endy, move_updown, move_leftright); MoveImage(SCREEN, g->image, 0, 0, ((i*zoomi)-zoomi)+133, ((j*zoomi)-zoomi)+33, zoomi, zoomi); g->next = start; start = g; } } } first_call = 0; // AUFBAU ENDE // LET'S GO if(!stop) { Lebensform *life; life->NGeneration(lifestart, gamesizeX, gamesizeY); } // ENDE }
-
mit OOP hat das aber nicht viel zu tun. ist auch noch eine menge gruseliges C drin.