Frage zu OOP



  • Okay danke erstmal für die Antwort.Dann werde ich das mal umsetzten.
    Bzgl dem Konstruktor/Destruktor der wurde von dem VS Klassen Assistenten gesetzt und ich bin ja noch nicht fertig mit der Klasse und habe dann eben zwischen gefragt.Deswegen sind da eben noch Kon und Destruktor.


  • Mod

    Ryko schrieb:

    Grid::Grid(void)
    {
    }
    
    Grid::~Grid(void)
    {
    }
    

    Kommt dir das nicht irgendwie ein bisschen komisch vor?

    Jetzt habe ich mir die Frage gestellt ob ich nun einfach für ein Schiff eine struct anlegen soll oder vllt doch eher eine Base Klasse und dann Vererbung benutzte,denn es gibt ja Schiffe die belegen 4,3,2,1 Felder.Daher könnte man ja einfach eine Basis Klasse Schiff anlegen und dann Vererbung benutzten für eine Klasse Schlachtschiff.Ist mein Ansatz so richtig oder würdet ihr es anders lösen?
    Mfg Ryko.

    Deine Beschreibung offenbart übrigens die unter Anfängern sehr verbreitete Einstellung, alles mit Vererbung machen zu müssen, weil es sie gibt. Vererbung braucht man in C++ eher selten. Wieso sollten Schlachtschiff und Flugzeugträger von Schiff abgeleitet sein. Sicher, von der Bedeutung her ist ein Schlachtschiff ein Schiff und ein Flugzeugträger ist ein Schiff und du hast daher die "ist ein"-Beziehung, für die public-Vererbung steht. Aber für dein Spiel? Da sind "Schlachtschiff" und "Flugzeugträger" doch bloß willkürliche Namen für Objekte, die sich ansonsten exakt gleich verhalten. Das heißt, verpass der Klasse "Schiff" (sofern du sie überhaupt brauchst, siehe oben) ein Attribut für den Namen und du bist fertig. Diese Attribut muss nicht unbedingt ein string sein, ebenso könnte auch z.B. ein enum-Typ (0=Speedboot, 1=Uboot, usw.) geeignet sein.

    Weiterhin: Welche Attribute braucht dein Schiff überhaupt? Du hast ja schon die Gitterpunkte:

    bool field[10][10];
    

    Hier würde ich ganz dringend einen anderen Datentyp als bool nehmen. In Schiffe versenken gibt es schließlich viel mehr Zustände als 2. Ein Feld kann leer sein, es kann ein Schiff drauf sein (welches?), es kann beschossen worden sein (daneben) und es kann beschossen worden sein (Treffer. welches Schiff?).
    Dann ist dein Schiff nur noch ein Objekt auf das verwiesen wird, das mitzählt, ob das Schiff schon versenkt wurde oder nicht. Vielleicht weiß das Objekt auch noch, wie es dargestellt wird (das könnte mit dem Namen (Schlachtschiff/Flugzeugträger) zusammenhängen, so dass diese Information ein und die selbe ist.)



  • Guten Tag Seppj,
    Ersteinmal danke für den Aufschlussreichen Beitrag.Ich komm von ner anderen Sprache und dort wird immer von Vererbung gepredigt(wie auch immer).Auch richtig erkannt hast du dass ich Anfänger in C++ bin.

    Welche Attribute braucht dein Schiff überhaupt?

    Gut das wären Größe,Name,Koordinaten,vielleicht auch welche Teile schon zerstört wurden/noch aktiv sind.


  • Mod

    Ryko schrieb:

    Ich komm von ner anderen Sprache und dort wird immer von Vererbung gepredigt(wie auch immer).

    Java, oder? Ja, in Java denkt man anders als in C++. Da muss man das Umdenken lernen, wenn man wechselt. Ist oft schwer, weil das, was in Java gut und üblich ist, geht auch irgendwie in C++ hinzufrickeln, aber es ist im Ergebnis nicht das, was in C++ gut und üblich ist 🙂

    Welche Attribute braucht dein Schiff überhaupt?

    Gut das wären Größe,Name,Koordinaten,vielleicht auch welche Teile schon zerstört wurden/noch aktiv sind.

    Klingt gut.



  • Die Koordinaten im Schiff mit zu speichern hat zwar Vorteile aber auch einen großen Nachteil. Du musst bei jedem Schuss im Grid überprüfen, ob dort ein Schiff liegt und du musst in Deinen Schiffen überprüfen, ob eines der Schiffe auf der beschossenen Koordinate liegt, das kann schnell zu Inkonsistenz führen.

    Eine andere Möglichkeit ist, einen

    std::vector<Ship>
    

    anzulegen und ein Schiff aus dem Array löschen, sobald es zerstört ist und überhaupt kein Grid verwenden. Bei einem Schuss gehst du deinen Vektor durch und überprüfst, ob ein Schiff getroffen wurde.

    Eine andere Möglichkeit wäre, im Grid einen Verweiß auf dein Schiff anzulegen und darüber zu überprüfen.



  • Die Frage ist, ob es Player vs CPU gibt, denn die KI wird dann wahrscheinlich ein Grid (oder eine map o.ä.) benötigen, um die bereits befeuerten Stellen zu speichern.

    Die Klasse Ship kann ja eine Methode isOn anbieten, die prüft, ob es auf einer Koordinate ist.


  • Mod

    Sone schrieb:

    Die Frage ist, ob es Player vs CPU gibt, denn die KI wird dann wahrscheinlich ein Grid (oder eine map o.ä.) benötigen, um die bereits befeuerten Stellen zu speichern.

    Außerdem kommt es auch gut, wenn der Spieler selbst sehen kann, ob ein Feld schon beschossen wurde. Auf das Grid würde ich nicht verzichten. Wenn überhaupt, dann eventuelle auf die Schiffsklasse.

    Die Klasse Ship kann ja eine Methode isOn anbieten, die prüft, ob es auf einer Koordinate ist.

    Das ist doch sehr umständlich. Ein besetztes Feld soll einen Verweis auf das Schiff haben, das auf dem Feld sitzt.



  • SeppJ schrieb:

    Die Klasse Ship kann ja eine Methode isOn anbieten, die prüft, ob es auf einer Koordinate ist.

    Das ist doch sehr umständlich. Ein besetztes Feld soll einen Verweis auf das Schiff haben, das auf dem Feld sitzt.

    Nein, nein! Das war für den Fall, dass es kein Grid gibt.



  • Guten Tag,
    Entschuldigung das ich mich erst so spät wieder melde,habe zur Zeit en bisschen was um die Ohren.

    Ich hab mich jetzt gegen die Ship Klasse entschieden,da diese imo nicht nötig ist.
    Für den Vektor der das Spielfeld darstellen soll,habe ich nun ein enum erstellt.

    enum cell
    {
    	nothing,
    	ship,
    	destroyed
    };
    

    Um mir das mit den Koordinaten zu vereinfachen hab ich ne structure erstellt, die die x und y Koordinate beinhaltet.Diese habe ich ausserhalb der Klasse in der Header Datei definiert.
    In der Klasse habe ich momentan eine Funktion mit folgender Defintion:

    void SetHorizontalShip(int size,coordinates startPos,coordinates endPos);
    

    Im cpp File meldet die IntelliSense von Vs nun folgenden Fehler:

    1 IntelliSense: Die Deklaration ist nicht mit ""void Grid::SetHorizontalShip(int size, <error-type> startPos, <error-type> endPos)" (deklariert in Zeile 10 von "*\Grid.h")" kompatibel.

    Ich versteh nicht wieso die structure nicht als Typ erkannt wird.Könnt ihr mir sagen wo mein Fehler liegt?
    Schönen Tag noch und genießt das schöne Wetter solange es noch da ist 🙂
    Mfg Ryko



  • Hast du "coordinates.h" in "Grid.h" eingebunden? Wenn du auf die Schiffsklasse verzichtest, dann hast du das Problem, dass der Spieler ohne Weiteres nicht wissen kann, ob er das Schiff nur teilweise zerstört oder schon versenkt hat.



  • Richtig vllt wäre die Schiffklasse dann ja doch sinvoll.Ich muss da nochmal genauer drüberdenken. Die Coordinates structure habe ich einfach nur in der Grid.h Deklariert,da sie nur 2 Member hat.



  • Weiß die Funktion denn auch von ccordinates?


Anmelden zum Antworten