fr33g Geschrieben 22. Januar 2010 Geschrieben 22. Januar 2010 Hey Leute, hab mir ein Spiel programmiert, nämlich Schiffe versenken, nach einigen Stunden Fehlersuche lief es endlich=) Jetzt habe ich noch eine Funtkion eingebaut damit das Spiel den Sieg meldet und sich beendet. Jedoch funktioniert es einfach nicht und ich weiß nicht warum=( Das Spiel macht einfach weiter. Hoffe ihr könnt mir helfen: main.cpp #include "classBretter.h" #include <iostream> #include <iomanip> #include <string> using namespace std; void anzahlZweierSchiffe(Bretter&, const int&, const int&, int&); void anzahlDreierSchiffe(Bretter&, const int&, const int&, int&); void anzahlViererSchiffe(Bretter&, const int&, const int&, int&); const int size1 = 10; const int size2 = 10; const int size3 = 4; bool stop = false; int choiceGes; int choiceGes1; int choiceGes2; int choiceGes3; int main() { srand((unsigned)time(NULL)); cout << setw(60) << "Herzlich Willkommen bei Schiffeversenken\n"; cout << "\n"; cout << "\n"; cout << setw(61) << "Ein '.' bedeutet noch nicht hingeschossen\n"; cout << setw(56) << "Ein 'X' bedeutet das war nur Wasser\n"; cout << setw(79) << "Ein 'S' bedeutet da ist ein Schiff, die Klammer sagt wie lang das Schiff ist\n"; cout << "\n\n"; Bretter Brett1(size1,size2,size3); anzahlZweierSchiffe(Brett1, size1, size2, choiceGes1); anzahlDreierSchiffe(Brett1, size1, size2, choiceGes2); anzahlViererSchiffe(Brett1, size1, size2, choiceGes3); Brett1.brettAusgeben(size1, size2); choiceGes = (choiceGes1 * 2) + (choiceGes2 * 3) + (choiceGes3 * 4); int x; int y; while(stop == false) { cout << "\n"; cout << "Wo moechtest du hinschiessen: x= "; cin >> x; cout << "\n"; cout << "Wo moechtest du hinschiessen: y= "; cin >> y; cout << "\n"; Brett1.check(x,y); Brett1.brettAusgeben(size1, size2); if(Brett1.endGame(Brett1, choiceGes)) { stop = true; } } cout.width(47); cout << "Herzlichen Glückwunsch, sie haben das Spiel erfolgreich beendet!"; } classBretter.h #include <string> #ifndef CLASSBRETTER_H_INCLUDED #define CLASSBRETTER_H_INCLUDED class Bretter { public: Bretter(const int, const int, const int); ~Bretter(){}; void brettAusgeben(const int&, const int&)const; void zweierSchiffeSetzen(Bretter&, const int, const int); void dreierSchiffeSetzen(Bretter&, const int, const int); void viererSchiffeSetzen(Bretter&, const int, const int); void check(int&, int&); bool endGame(Bretter&, int&); private: std::string Brett[10][10][4]; }; #endif // CLASSBRETTER_H_INCLUDED classBretter.cpp #include "classBretter.h" #include <iostream> #include <iomanip> #include <string> using namespace std; Bretter::Bretter(const int size1, const int size2, const int size3) { for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { Brett[i][j][0] = ". "; } } for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { Brett[i][j][1] = "0"; } } for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { Brett[i][j][2] = "0"; } } for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { Brett[i][j][3] = "0"; } } } void Bretter::brettAusgeben(const int& size1, const int& size2)const { cout << setw(67) << " 0 1 2 3 4 5 6 7 8 9\n"; for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { if(j == 0) { cout << setw(19) << i << " "; } cout << Brett[i][j][0]; } cout<<"\n"; } } bool Bretter::endGame(Bretter& Brett1, int& choiceGes) { int tempCheck = 0; for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if((Brett[i][j][3] == ("2") || ("3") || ("4")) && (Brett[i][j][0] == ("S(2) ") || ("S(3) ") || ("S(4) "))) { tempCheck += 1; } } } if(tempCheck == choiceGes) { return true; } else { return false; } } void Bretter::zweierSchiffeSetzen(Bretter& Brett1, const int size1, const int size2) { unsigned int x = rand() % (size1 - 2 + 1); unsigned int y = rand() % size2; int tempx = x; int tempy = y; if ((Brett[tempy][tempx][2] == "0") && (Brett[tempy][tempx+1][2] == "0")) { for (int i = 0; i < 2; i++) { Brett[tempy][tempx][2] = "1"; tempx++; } tempx = x; for (int i = 0;i < 2; i++) { Brett[tempy][tempx][3] = "2"; tempx++; } } else { Brett1.zweierSchiffeSetzen(Brett1,size1,size2); } } void Bretter::dreierSchiffeSetzen(Bretter& Brett1, const int size1, const int size2) { unsigned int x = rand() % size1; unsigned int y = rand() % (size2 - 3 + 1); int tempx = x; int tempy = y; if ((Brett[tempy][tempx][2] == "0") && (Brett[tempy+1][tempx][2] == "0") && (Brett[tempy+2][tempx][2] == "0")) { for (int i = 0; i < 3; i++) { Brett[tempy][tempx][2] = "1"; tempy++; } tempy = y; for (int i = 0;i < 3; i++) { Brett[tempy][tempx][3] = "3"; tempy++; } } else { Brett1.dreierSchiffeSetzen(Brett1,size1,size2); } } void Bretter::viererSchiffeSetzen(Bretter& Brett1, const int size1, const int size2) { unsigned int x = rand() % size1; unsigned int y = rand() % (size2 - 4 + 1); int tempx = x; int tempy = y; if((Brett[tempy][tempx][2] == "0") && (Brett[tempy+1][tempx][2] == "0") && (Brett[tempy+2][tempx][2] == "0") && (Brett[tempy+3][tempx][2] == "0")) { for (int i = 0; i < 4; i++) { Brett[tempy][tempx][2] = "1"; tempy++; } tempy = y; for (int i = 0;i < 4; i++) { Brett[tempy][tempx][3] = "4"; tempy++; } } else { Brett1.viererSchiffeSetzen(Brett1,size1,size2); } } void Bretter::check(int& x, int& y) { if(Brett[y][x][1] == "0") { if(Brett[y][x][2] == "1") { if(Brett[y][x][3] == "2") { cout << "Treffer\n"; Brett[y][x][0] = "S(2) "; Brett[y][x][1] = "1"; } if(Brett[y][x][3] == "3") { cout << "Treffer\n"; Brett[y][x][0] = "S(3) "; Brett[y][x][1] = "1"; } if(Brett[y][x][3] == "4") { cout << "Treffer\n"; Brett[y][x][0] = "S(4) "; Brett[y][x][1] = "1"; } } else { Brett[y][x][0] = "X "; Brett[y][x][1] = "1"; cout << "Leider nur Wasser\n"; } } else { cout << "Dort hast du schonmal hingeschossen\n"; } } funktionen.cpp #include <iomanip> using namespace std; void anzahlZweierSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes1) { marke:; cout << "Wie viel zweier Schiffe moechtest du(mindestens 1, maximal 3)"; int choice; cin >> choice; choiceGes1 = choice; if ((choice < 4) && (choice > 0)) { for(int i = 0; i < choice; i++) { Brett1.zweierSchiffeSetzen(Brett1, size1, size2); } } else { cout << "Falsche Eingabe!\n"; goto marke; } } void anzahlDreierSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes2) { marke:; cout << "Wie viel dreier Schiffe moechtest du(mindestens 1, maximal 3)"; int choice; cin >> choice; choiceGes2 = choice; if ((choice < 4) && (choice > 0)) { for(int i = 0; i < choice; i++) { Brett1.dreierSchiffeSetzen(Brett1, size1, size2); } } else { cout << "Falsche Eingabe!\n"; goto marke; } } void anzahlViererSchiffe(Bretter& Brett1, const int& size1, const int& size2, int& choiceGes3) { marke:; cout << "Wie viel vierer Schiffe moechtest du(maximal 3)"; int choice; cin >> choice; cout << "\n\n"; choiceGes3 = choice; if ((choice < 4) && (choice > 0)) { for(int i = 0; i < choice; i++) { Brett1.viererSchiffeSetzen(Brett1, size1, size2); } cout << setw(58) << "Dann kann es ja losgehen!\n"; } else if (choice == 0) { cout << setw(58) << "Dann kann es ja losgehen!\n"; } else { cout << "Falsche Eingabe!\n"; goto marke; } } Ich weiß is n langer Code, aber wär echt lieb wenn ihr mir trotzdem helfen könntet:) Zitieren
Sturm Geschrieben 22. Januar 2010 Geschrieben 22. Januar 2010 Bemühe doch bitte erst einmal einen Debugger, bevor wir hier 500 Zeilen Code durchschauen... Wo tritt der Fehler auf, was passiert? Fehlermeldung? Endlosschleife? Zitieren
fr33g Geschrieben 22. Januar 2010 Autor Geschrieben 22. Januar 2010 Ja würd ich gern wenn ich das mit dem debuggen checken wird aber der läuft bei ihr immer nur einfach komplett durch trotz den einstellungen für den debugger. es kommt ja kein fehler, das programm läuft blos endlos. weil ich wohl in der funktion bool Bretter::endGame vermutlich einen Logikfehler hab. denn sie soll true senden wenn der spieler alle schiffe getroffen hat und die while schleife aus dem main programm beenden. den rest müsst ihr euch vermut ich mal eg auch nicht anschauen;-) wär auf jeden fall cool wenn mir jemand helfen kann=) Zitieren
Klotzkopp Geschrieben 22. Januar 2010 Geschrieben 22. Januar 2010 Ja würd ich gern wenn ich das mit dem debuggen checken wird aber der läuft bei ihr immer nur einfach komplett durch trotz den einstellungen für den debugger.Hast du denn Haltepunkte gesetzt? Wie hast du den Debugger gestartet? if((Brett[j][3] == ("2") || ("3") || ("4")) && (Brett[j][0] == ("S(2) ") || ("S(3) ") || ("S(4) ")))Das funktioniert nicht. Wenn du mehrere Bedingungen verknüpfen willst, musst du sie alle komplett ausschreiben: if((Brett[i][j][3] == ("2") || Brett[i][j][3] == ("3") usw. Übrigens: Dir wurde schon vorher geraten, auf goto zu verzichten. Gewöhn dir das bitte schnellstens ab. Goto ist kein Ersatz für Schleifenkonstrukte! Und das hier if(tempCheck == choiceGes) { return true; } else { return false; }[/code] ist eine unnötig ausschweifende Schreibweise für [code]return tempCheck == choiceGes; Zitieren
fr33g Geschrieben 22. Januar 2010 Autor Geschrieben 22. Januar 2010 (bearbeitet) Ok Danke schön, werd ich ändern. Zum Debuggen: Also ich klick z.b. irgendwo in meinem quellcode hin und drück dann toogle breakpoint. vorne ist dann auch der rote punkt. so dann start ich den debugger in dem ich auf debug gehe und dann auf start. doch er ignoriert die haltepunkte völlig. habs auch mit nem ganz kleinen programm versucht. #include <iostream> using namespace std; int main() { int a=66; int b=88; cout << a << b << endl; return 0; } Setzt ich jetzt in die zeile int b=88 ein haltepunkt, durchläuft er einfach alles=( EDIT: Danke hab den Quellcode geändert hat jetzt alles geklappt=) Blos das Debuggen net vll kanst du mir ja sagen was ich falsche mache=( Bearbeitet 22. Januar 2010 von fr33g Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.