schifferl versenken in c++ programmieren, hilfe! :b

  • hallo.. ich habe erst dieses semester begonnen programmieren zu lernen und ich arbeite auch mit und kenne die grundlegendenden dinge die man dazu braucht aber ich tu mir schwer mit dem ansatz bzw. umsetzen..
    jetzt haben wir die hü schifferl versenken zu programmieren und ich hab mich schon überall in unseren skripten durchgesucht..hab aber keinen plan wie ich das angehn soll..
    könnte mir jmd helfen bzw tipps o iwas geben?

    liegrü.

  • Aufgabe lautet: Schreiben Sie ein Programm, mit dem man "Schiffe versenken" spielen kann. Es soll möglich sein, die Position der Schiffe manuell festzulegen (besonders Eifrige können auch versuchen, die Positionierung automatisch durchzuführen, etwa unter Verwendung von Zufallszahlen; dazu können Sie nach den Funktionen rand und randomize googeln). Anschließend kann durch Angabe der Koordinaten auf ein Feld geschossen werden. Der Computer soll die üblichen Meldungen ("Wasser", "Treffer", "Versenkt") liefern und erkennen, wenn das Spiel beendet (die gesamte Flotte vernichtet) ist.

  • Du kannst dir mal überlegen, welche Datenstruktur du haben möchtest.
    Die Frage ist auch, ob es Schiffe in verschiedenen Größen etc. geben soll.

    Zwei relativ simple Vorgehensweisen wären:

    a)
    Leg dir ein 2-dimensionales Array an (zb. char[sizex][sizey]) und setz alles auf 0.
    Dann such dir mit rand zufällige x und y koordination von 0 bis sizex bzw. sizey.
    Dort mach dann array[x][y] = 1 für ein Schiff. Das halt in einer Schleife mit sovielen Schiffen wie du möchtest (musst nur schauen, dass du nicht zweimal die selbe Koordinate bekommst).

    Dann lass dir (wohl auch in einer Schleife) vom Benutzer die Koordinaten inx, iny eingeben.
    Dann sowas wie

    if( array[inx][iny] == 1 ) { <Treffer>; --ships; } else { <daneben> }
    if( ships < 1 ) { <geschafft> }

    Bissl Rundherumwerk und fertig ist die minimalistische Variante :).
    Allerdings ist das natürlich ziemlich.. saumäßig, aber üblicherweise gehts bei Programmierübungen ja nicht darum, ein Wunderwerk des Software Engineerings zu entwerfen ;). Das kannst sogar theoretisch alles direkt ins main klatschen.

    b)
    Wenns objektorientierter sein soll kannst natürlich an eine Klasse für das Spielfeld denken und eine für ein Schiff.
    Dann könntest z.B. das Spielfeld aufbauen aus einer Datenstruktur mit Pointern auf die Schiffobjekte (oder auf NULL oder auf sonst was).
    Du könntest auch nur Schiffobjekte anlegen, in jedem Objekt dessen Koordinaten speichern und dann beim Schießen alle Schiffe durchgehen und die Koordinaten vergleichen.
    Du kannst auch Variante a) in eine Klasse einpacken ala
    class Ocean {
    // array

    public:

    Ocean( int sizex, int sizey );
    void generateShips( int num );
    bool shipAt( int x, int y );
    //- was weiß ich was man sich alles einfallen lassen könnte..
    };

    etc...
    im Prinzip kann man das ja wie immer endlos abstrahieren, verfeinern, verbessern etc.
    Vermutlich reicht aber die simple Array-Variante (ausser es geht darum, ein ausgefeiltes objektorientiertes Design hinzuklatschen)

  • Ein 2D Spielfeld lässt sich am besten mit einem zweidimensionalen Array darstellen. Einzelne Felder enthalten die Zahlen 0 (Wasser), 1 (Schiff) oder 2 (Schiff und getroffen). Die Anweisungen des Spielers liest du von der Standardeingabe ein. Sinnvollerweise sollte es drei Kommandos geben:

    set x y
    - erstellt ein neues Schiff auf den Koordinaten x y
    - Fehlermeldung, falls dort schon eines ist

    hit x y
    - bam oida
    - Meldung, falls alle Schiffe versenkt wurden (keine 1 mehr im Array)

    exit
    - beendet das Programm
    - Meldung an den Spieler, wie viele Schiffe er verpasst hat

    Viel Erfolg

  • hejj.danke..ich werds mal versuchen..
    und werd ma allergrößte mühe geben..aber erst am we..
    ich frag einfach nochmal falls ich auf was stoß dass mich ausn konzept wirft.. :)

    und danke für die tolle antwort! :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!