Schiffe Versenken - Wie setze ich die Schiffe???



  • Nicht genauso.
    Bei einem Array schreibt man bei Bereichsüberschreitung wild im Speicher rum.
    Bei einem std::vector wird bei Bereichsüberschreitung eine Exception geworfen, so dass man zumindest nicht irgendeinen undefinierten Fehler hat.



  • Der Knirps schrieb:

    Bei einem std::vector wird bei Bereichsüberschreitung eine Exception geworfen, so dass man zumindest nicht irgendeinen undefinierten Fehler hat.

    Aber eben NUR, wenn du über .at() auf den Vektor zugreifst; beim Zugriff über [] findet keine Überprüfung des Index statt!

    Aus der std::vector-Implementation der STLport:

    reference operator[](size_type __n) { return *(begin() + __n); }
      reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
    

    Moritz



  • Also, das mit dem Array ist auf jeden Fall schonmal wichtig, danach kannst du das so machen, dass der Benutzer zuerst die Startkoordinate des Schiffs (also eine Ecke) angibt und dann die richtung, in welche das Schiff zeigen soll. Das ist ziemlich einfach zu Programmieren und der User muss nicht darauf aufpassen, dass er die richtige Länge und Anzahl der Schiffe hat, weil das ja automatisch geht.



  • k1ro schrieb:

    also würdest du statt für jede zeile+spalte eine eigene variable zu machen lieber ein 2dimensionales array (char fields[][]) verwenden hättest dus schonmal um einiges leichter...

    dann könntest du den benutzer zeile und spalte angeben lassen und fields[row][column] auf 'x' oder sowas setzen, sowie die ausgaben auf eine einfache for-schleife begrenzen...

    hoffe das hilft dir weiter, ich werd jetz erstmal schlafen gehn 😉

    Das geht so auch? Ich musste bisher immer eine Matrix mit Pointer erstellen, da ich immer Fehler meldungen erhielt, wenn ich versuchte, eine MAtrix direkt zu erzeugen...



  • Das geht, allerdings nicht dynamisch.



  • Wie setzt man jetzt die Schiffe?

    mfg



  • Mit

    cMap[x][y] = 'X'
    

    😃

    (Bin gespannt wie oft die Frage noch wiederholt aber nicht präzisiert wird)



  • Ok stimmt zu allgemein die Frage 🙂

    Also mein Feld besteht nur aus Zahlen.

    Nehmen wir an der User muss ein Schiff setzen mit der Länge 5. Wie setzte ich dies um?

    mfg



  • Du lässt ihn die Koordinaten des Bugs angeben und die Richtung, in die das Schiff schauen soll und läufst in einer Schleife 5 Schritte in die richtige Richtung (achte darauf, daß du dabei nicht über den Feldrand hinausläufst).



  • Ja so habe ich mir das auch gedacht.

    also mein Spielfeld:

    1 2 3 4 5
    6 7 8 9 10
    11 12 13 14 15
    usw.

    Aber ebben das Probelm ist mit dem Feldrand. Von wo weiss das Programm jetzt ob es über dem Spielfeldrand ist. Also wenn der User das Schiffe(länge 5) auf die Zahl 8 setzt und Richtung Norden macht. Wie weiss das Programm dass das Schiff zu gross ist?



  • Schritt 1: Du berechnest den Korrekturwert entsprechend der Richtung:

    int dx=0;dy=0;
    switch(dir)
    {
    case 'N':dx=-1;break;
    case 'E':dy= 1;break;
    case 'S':dx= 1;break;
    case 'W':dy=-1;break;
    }
    

    Schritt 2: du überprüfst, ob die Koordinaten des Hecks (x+(len-1)*dx,y+(len-1)*dy) innerhalb des Spielfeldes liegen - wenn nein, meldest du einen Fehler.

    Schritt 3: du setzt das Schiff:

    for(int i=0;i<len;++i)
    {
      if(cMap[x+i*dx][y+i*dy]!=' ') Fehler("Hier liegt schon ein Schiff");
      cMap[x+i*dx][y+i*dy] = 'x';
    }
    

Anmelden zum Antworten