fr33g Geschrieben 30. Januar 2010 Geschrieben 30. Januar 2010 Hey Leute, ich habe ein Problem. Ich hatte mir vor kurzem Schiffe versenken programmiert. Jedoch gefiel mir der Code am Ende nicht so wirklich und war auch schwer zu erweitern. Daher bin ich jetzt dabei das ganze nochmal neu zu programmieren, zuerst einfach nur mit nem cpu gegner um das dann später zu erweiter auf alleine und 2 spieler und so. naja bin eg au schon fast fertig=) blos bekomme ich nicht hin dass der pc das spiel beendet wenn es fertig ist. hier mal meine funktion dafür: bool checkEnd(Feld** pFeld, int felder) { int check = 0; for (int i = 0; i < felder; i++) { if (pFeld[i]->getGetroffen() == true) { check++; } i++; } if (check == 15) { cout << endl; cout << "Herzlichen Glückwunsch sie haben gewonnen!\n"; return true; } else { return false; } } Also wird ein Schiff getroffen wird itsGetroffen auf true geändert. jetzt will ich einfach nach jedem durchgang abfragen ob itsGetroffen 15 mal vorkommt, falls ja soll das spiel beendet werden. denn es werden immer nur 5 3er schiffe erzeugt. daher die 15. hoffe ihr könnt mir weiterhelfen;-) Zitieren
flashpixx Geschrieben 30. Januar 2010 Geschrieben 30. Januar 2010 Du brauchst nicht mit "== true" zu prüfen. Dein "check" Variable wird maximal so felder-1 groß. Mehr ist so direkt aus Deinem Code nicht ersichtlich. Da felder wohl ein Array (ich tippe mal auf eine quadratische Anordnung) ist wird also check max Größe^2 Zitieren
fr33g Geschrieben 30. Januar 2010 Autor Geschrieben 30. Januar 2010 also ich hab mal dazu noch die main #include <iostream> #include <iomanip> #include <string> #include "classFeld.h" using namespace std; void setzenSchiffe(Feld**, int, int); void setzenSchiffeCPU(Feld**, int, int); void ausgebenFelder(Feld**, int, int); void ausgebenFelderCPU(Feld**, int, int); void eingabe(Feld**, int, int); void eingabeCPU(Feld**, int, int); bool checkEnd(Feld**, int); bool checkEndCPU(Feld**, int); int angabeX; int main() { srand(time(0)); cout << setw(63) << "Herzlich Willkommen zu Schiffe versenken=)" << endl; marke:; cout << "\nWie gross soll das Spielfeld sein,(min.8) (x-Angabe)?"; cin >> angabeX; if (angabeX < 8) { cout << "Falsche Eingabe!\n"; goto marke; } cout << "Es gibt nur 3er Schiffe, X bedeutet Treffer, O bedeutet leider nur Wasser!\n\n"; int felder = angabeX * angabeX; Feld* pFeld[felder]; Feld* pFeld2[felder]; string z = ". "; int j = 1; int k = 1; for(int i = 0; i < felder; i++) { pFeld[i] = new Feld(j, k, z); j++; if(j > angabeX) { j = 1; k++; } } j = 1; k = 1; for(int i = 0; i < felder; i++) { pFeld2[i] = new Feld(j, k, z); j++; if(j > angabeX) { j = 1; k++; } } setzenSchiffe(pFeld2, angabeX, felder); setzenSchiffeCPU(pFeld, angabeX, felder); cout << endl; ausgebenFelder(pFeld, felder, angabeX); cout << endl; ausgebenFelderCPU(pFeld, felder, angabeX); while(true) { eingabe(pFeld, felder, angabeX); ausgebenFelder(pFeld, felder, angabeX); if (checkEnd(pFeld, felder)) { break; } eingabeCPU(pFeld2, felder, angabeX); ausgebenFelderCPU(pFeld2, felder, angabeX); if (checkEndCPU(pFeld2, felder)) { break; } } return 0; } also felder ist einfach angabeX², also wie viel felder es geben soll, denn der benutzer gibt ja am anfang an wie lang die x-Achse sein soll. und wenn eben ein schiff getroffen wird wird itsGetroffen auf true gesetzt. da es 5 schiffe gibt die sich ja auf 15 felder verteilen müssen will ich prüfen ob alle 15 getroffen sind. jedoch passiert einfach nichts wenn ich alle 15 hab. Zitieren
flashpixx Geschrieben 30. Januar 2010 Geschrieben 30. Januar 2010 Goto solltest Du ganz vermeiden, die main Funktion hat auch Übergabeparameter. Wenn Du schon Klassen benutzt, was nach C++ aussieht, solltest Du dann auch genau diese Struktur durchgängig verwenden. Warum Du zwei gleiche Arrays jeweils mit zwei mit der For-Schleife durchläuft ist irgendwie nicht nötig, da sie gleich sind, reicht eine. Wofür Du auch zwei Arrays brauchst, ist auch nicht klar; ich würde zwei Objekten vom gleichen Typ / gleiche interne Datenstruktur verwenden und wenn eben ein schiff getroffen wird wird itsGetroffen auf true gesetzt. da es 5 schiffe gibt die sich ja auf 15 felder verteilen müssen will ich prüfen ob alle 15 getroffen sind. jedoch passiert einfach nichts wenn ich alle 15 hab. Bitte überlege einfach mal, ob man diese Fragen aufgrund Deines Post und der dazu hier eingestellten Informationen überhaupt beantwortet werden können. Meine Glaskugel ist im Moment kaputt Zitieren
fr33g Geschrieben 30. Januar 2010 Autor Geschrieben 30. Januar 2010 Jap ist C++. Also das mit dem goto wurd mir auch schon gesagt, muss ich mir abgewöhnen:-P das sind 2 arrays mit zeigern auf die objekte. für jedes spielfeld ein array, also für den cpu und für den spieler. daher sind sie nicht ganz gleich, die schiffe sitzen ja unterschiedlich. naja weiß ja net ob jetzt den ganzen quellcode posten soll, hätt ja sein können dass ihr da schon was seht was ich übersah;-) Zitieren
flashpixx Geschrieben 30. Januar 2010 Geschrieben 30. Januar 2010 Jap ist C++. Also das mit dem goto wurd mir auch schon gesagt, muss ich mir abgewöhnen:-P bitte dann auch so umsetzen das sind 2 arrays mit zeigern auf die objekte. für jedes spielfeld ein array, also für den cpu und für den spieler. daher sind sie nicht ganz gleich, die schiffe sitzen ja unterschiedlich. Das ist doch egal bzw der Sinn von Klassen / Objekten. Die Datenstruktur des Feldes ist identisch, die Struktur der Schiffe auch, das was unterschiedlich ist, ist die Position der Schiffe innerhalb des Feldes bzw. die Markierung welcher Teil des Schiffes zerstört ist. => also bitte wenn C++ noch einmal vollständig überdenken @Problem: Deine Klasse "Feld" muss dann eine Methode implementieren "alle Schiffe zerstört", d.h. sie muss alle Schiffsobjekte Abfragen, ob sie zerstört sind. naja weiß ja net ob jetzt den ganzen quellcode posten soll, hätt ja sein können dass ihr da schon was seht was ich übersah;-) Wie schon gesagt, Du durchläufst n^2 Datenstrukturen, d.h. Deine Checkroutine liefert nicht korrekte Ergebnisse. Dein Code ist eben nicht passend für ein OOP Modell. Ich würde Dir empfehlen, dass Du einfach, wie oben geschrieben, das ganze für ein (1) Feld implementierst, dann kannst Du das dann auf n-Spielfelder auch erweitern. Die Boost Boost C++ Libraries bietet schon Datenstrukturen für Matrizen, da Dein Feld ja eine Matrix ist, bietet sich das an. Alternativ geht natürlich auch die std-Lib Zitieren
fr33g Geschrieben 31. Januar 2010 Autor Geschrieben 31. Januar 2010 Hey, also danke nochmal, habs jetzt hinbekommen. Hab einfach die Methode der Klasse benutzt die abfragt ob ein Schiff getroffen wurde. Stand wohl ein bisschen auf dem Schlauch;-) Danke nochmal 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.