Zum Inhalt springen

Problem mit einer Abfrage


fr33g

Empfohlene Beiträge

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;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...