in Klassen auf eine Reihe von Objekten zugreifen (Schiffe versenken)



  • Hi,

    ich programmiere Schiffe-Versenken in C++ (später grafisch mit OpenGl).
    Leider bin ich in der Objektorientierung neu und weiß nicht weiter.

    Wie kann ich in der Klasse Shot überprüfen ob eines der erzeugten Schiffe der Klasse Ship getroffen wurde?

    Ich hatte die Idee die Schiffe als Objekt-Stack an Shot zu übergeben aber er sagt man kann kein unbegrenztes Array übergeben.

    Ich muss ja irgendwie SCHON auf die ganzen erzeugten Objekte zugreifen?

    shot.c

    #include "shot.h"
        #include "ship.h"
    
        Shot::Shot(){
    
        }
    
        // Wurde ein Schiff getroffen?
        // gehe alle Schiffe durch und überprüfe ob getroffen
        // Parameter Ship stack[] geht so nicht ?!?!?!
        void Shot::calcIsShipHit(int x, int y, Ship allShips[]){
        }
    

    ship.h

    #ifndef SHIP_H
        #define SHIP_H
    
        class Ship {
    
        private:
        // POSITION BEGINNT AN DER LINKEN OBEREN ECKE
        int positionX;
        int positionY;
    
        int canonPower;
    
        bool isEnemy;
        // 0 = Schiff liegt horizontal
        // 1 = Schiff liegt vertikal
        bool parking;
    
        // An welcher Stelle wurde das Schiff getroffen ?
        bool whereHit[];
    
        public:
        // Konstruktor
        Ship(int length);
        void draw();
        void destroy();
        void shoot(int x, int y);
    
        void setPositionX(int x);
        int getPositionX();
    
        void setPositionY(int y);
        int getPositionY();
    
        void setIsEnemy(bool side);
        bool getIsEnemy();
    
        void setParking (bool parking);
        bool getParking();
    
        void setWhereHit (int position);
        bool getWhereHit (int position);
        };
    


  • Hab ich schon in deinem letzten Thread gesagt, dass die Schiffe Observer auf Spielfelder sein können, damit man nicht alle durchgehen muss.
    http://www.c-plusplus.net/forum/p2152234#2152234

    http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)

    // 0 = Schiff liegt horizontal
    // 1 = Schiff liegt vertikal
    bool parking;

    Nein, dafür gibt es Enums. Und nenn es bitte orientation und nicht parking.

    Außerdem hast du viel zu viele Setter oder können sich deine Schiffe noch bewegen, wenn sie platziert wurden?



  • Furtano schrieb:

    Ich hatte die Idee die Schiffe als Objekt-Stack an Shot zu übergeben aber er sagt man kann kein unbegrenztes Array übergeben.

    Die Idee ist nichts. Du machst OOP, da versucht man so viel wie möglich wegzukapseln. Du gibst hier das Innerste deines Spiels weiter: Das Array mit den Schiffen, das deren Positionen, Größen, Orientierung hält! Desweiteren würde ich für Shot keine eigene Klasse aufmachen. "Schießen" ist eine einmalige Aktion, die dem Spielfeld die Kordinaten liefert (wohin wird geschossen) und als return ein "Wasser/getroffen/versenkt" (o.Ä.) zurück liefert. MMn. ist es etwas übertrieben, für diese eine Funktion eine eigene Klasse zu basteln.

    Und Arrays übergibt man nicht als Arrays sondern als Pointer (mit Größenangabe) - oder man verwendet besser gleich keine rohen Array, sondern gekapselte (entweder in std::array, wenn sich deine Spielfeldgröße nie ändert, oder eben std::vector).



  • Wie kann ich es stattdessen machen ?
    Observer Pattern ist mir jetzt zu kompliziert, vielleicht später ich möchte relativ einfache objektorientierte Programmierung machen.


Anmelden zum Antworten