Problem mit Brettspiel
-
Hallo,
ich programmiere gerade ein Schachspiel, hab schon das Brett als 8x8 array.
die Ausgabe des Brettes läuft auch super, Problem welches ich nun habe, ist wenn ich eine Figur die ich im Konstruktur der Klasse Brett alle erstelle und anzeigen lasse, bewegen möchte, sagt er mir Fehler beim Schreiben.
Ich hab eine Klasse Brett mit Funktionen setFigur und getFigur und moveFigur welche auf virtuelle Funktionen in der Klasse Figur greift
in der Figur.cpp habe ich dann die jeweiligen move funktionen für die Figuren.
void CLaeufer::move(int x, int y) { this->posx=x; this->posy=y; board->setFigur(this); }this->posx und y speichert die neuen Koordinaten auf dem Feld
die board->setFigur(this) übergibt die Figur mit den neuen Koordinaten die im array dann neu gespeichert werden sollen und da tritt dann der Fehler auf, das ich einen Fehler beim SChreiben habe ... obwohl ich nicht aus dem Array komme.Vielleicht kann ja jemand helfen.
-
im ctor von CLaeufer kannste noch keine v-funktionen von CLaeufer aufrufen, weil dein objekt noch kein CLaeufer IST. das ist es erst am ende des ctors.
abhilfe schafft eine basisklasse CFigur mit den attributen posx und posy.
nebenbeibemerkt: CFigur ist kein guter name, weil nach schachterminologie Bauern keine Figuren sind. CStein ist wohl weittragend.
-
das ist schon klar, ich hab eine basisklase CFigur von der leite ich alle anderen Figuren ab, die CFigur hat eine virtual move ...
problem ist hald nur das ich nicht in das array schreiben kann. Die Figuren aus dem CFigur *board[8][8] kann ich lesen und erstellen ... aber nicht dann wieder verschieben
-
seoman schrieb:
das ist schon klar, ich hab eine basisklase CFigur von der leite ich alle anderen Figuren ab, die CFigur hat eine virtual move ...
problem ist hald nur das ich nicht in das array schreiben kann. Die Figuren aus dem CFigur *board[8][8] kann ich lesen und erstellen ... aber nicht dann wieder verschieben
komisch. aber ich kenne das CBoard nicht.
ich denke an sowas. und kann mich nicht erinndern, dass sowas nicht klappt.
void CFigur::appear(int x, int y) { posx=x; posy=y; board->data[posy][posx]=this; } void CFigur::disappear() { board->data[posy][posx]=0; } void CFigur::move(int x, int y) { disappear(); appear(x,y); }ja, board->data[posy][posx]=this; wird zu board.setFigur(posy,posx,this). und ja, weiler kann die doofe überladung mit 0 weg mit board.delFigur(posy,posx) geschehen. zum beispiel.
-
genau hier: board->Board[posx][posy]=0;
gibt er eine Fehlermeldung Zugriffsverletzung beim Schreiben
Natürlich habe ich mir die Überlegung gemacht was passiert wenn ich die Figur verschiebe, aber es kommt immer diese Zugriffsverletzung
paar funktionen aus der CBoard.cpp
void CBoard::setFigur(CFigur* figur) { Board[figur->posx][figur->posy]=figur; } CFigur * CBoard::getFigur(int x, int y){ return this->Board[x][y]; } void CBoard::setHolder(int x, int y) { this->Board[x][y]=0; } void CBoard::moveFigur(CFigur *figur, int x, int y) { figur->move(x,y); }und aus der CFigur.cpp
CFigur::CFigur(string _farbe,int _posx,int _posy,string _bez) { farbe = _farbe; posx=_posx; posy=_posy; bez=_bez; } void CFigur::move(int x, int y) { this->posx=x; this->posy=y; } CTurm::CTurm(string farbe,int x,int y, string bez): CFigur(farbe,x,y,bez) { } void CTurm::move(int x, int y) { board->setHolder(x, y); this->posx=x; this->posy=y; board->setFigur(this); }und aus der CFigur.h
class CBoard; class CFigur { public: CFigur(string farbe, int posx, int posy,string bez); CBoard* board; string farbe; string bez; int posx; int posy; /*void appear(int x, int y); void disappear(); */ virtual void move(int posx, int posy); }; class CTurm : public CFigur { public: CTurm(string farbe, int posx, int posy,string bez); virtual void move(int posx, int posy); };vielleicht erkennt man den Fehler jetzt besser
-
seoman schrieb:
vielleicht erkennt man den Fehler jetzt besser
nee. aber was sagt denn der call-stack?
also starte mit f5 dann sollte der dich auf den fehlker werfen. Dann alt+7. In der Aufrufliste (call-stack) dann eins oder mehr höherklicken (tiefer).
-
seoman schrieb:
genau hier: board->Board[posx][posy]=0;
gibt er eine Fehlermeldung Zugriffsverletzung beim Schreibenalso ist board==0
warumauchimmer.
normalerweise passier das, wenn noch ne globale var dieses namens aus versehen rumgammelt. hier ist wohl die EINE globale besser als dass jeder stein sein brett kennen muss.edit:
oder oh Schreck du hast gleich alles global gemacht und verreckst ob der konstruktuionsreihenfolge globaler objekte. nur ne vermutung am rande.