Schiffe Versenken - Wie setze ich die Schiffe???



  • Ich bin gerade dabei ein schiffe Versenken Spiel zu programmieren. Bin noch am Anfang und komme nicht weiter, wie man die Schiffe setzt... wär nett wenn mir da jemand helfen kann.
    Hier der Code:

    #include <iostream>
    using namespace std;
    
    char einer;
    
    	//variablen Seite A
    	char a1='.', a2='.', a3='.', a4='.', a5='.', a6='.', a7='.', a8='.', a9='.', a0='.';
    	char b1='.', b2='.', b3='.', b4='.', b5='.', b6='.', b7='.', b8='.', b9='.', b0='.';
    	char c1='.', c2='.', c3='.', c4='.', c5='.', c6='.', c7='.', c8='.', c9='.', c0='.';
    	char d1='.', d2='.', d3='.', d4='.', d5='.', d6='.', d7='.', d8='.', d9='.', d0='.';
    	char e1='.', e2='.', e3='.', e4='.', e5='.', e6='.', e7='.', e8='.', e9='.', e0='.';
    	char f1='.', f2='.', f3='.', f4='.', f5='.', f6='.', f7='.', f8='.', f9='.', f0='.';
    	char g1='.', g2='.', g3='.', g4='.', g5='.', g6='.', g7='.', g8='.', g9='.', g0='.';
    	char h1='.', h2='.', h3='.', h4='.', h5='.', h6='.', h7='.', h8='.', h9='.', h0='.';
    	char i1='.', i2='.', i3='.', i4='.', i5='.', i6='.', i7='.', i8='.', i9='.', i0='.';
    	char j1='.', j2='.', j3='.', j4='.', j5='.', j6='.', j7='.', j8='.', j9='.', j0='.';
    
    	//Variablen Seite B
    	char a1b='.', a2b='.', a3b='.', a4b='.', a5b='.', a6b='.', a7b='.', a8b='.', a9b='.', a0b='.';
    	char b1b='.', b2b='.', b3b='.', b4b='.', b5b='.', b6b='.', b7b='.', b8b='.', b9b='.', b0b='.';
    	char c1b='.', c2b='.', c3b='.', c4b='.', c5b='.', c6b='.', c7b='.', c8b='.', c9b='.', c0b='.';
    	char d1b='.', d2b='.', d3b='.', d4b='.', d5b='.', d6b='.', d7b='.', d8b='.', d9b='.', d0b='.';
    	char e1b='.', e2b='.', e3b='.', e4b='.', e5b='.', e6b='.', e7b='.', e8b='.', e9b='.', e0b='.';
    	char f1b='.', f2b='.', f3b='.', f4b='.', f5b='.', f6b='.', f7b='.', f8b='.', f9b='.', f0b='.';
    	char g1b='.', g2b='.', g3b='.', g4b='.', g5b='.', g6b='.', g7b='.', g8b='.', g9b='.', g0b='.';
    	char h1b='.', h2b='.', h3b='.', h4b='.', h5b='.', h6b='.', h7b='.', h8b='.', h9b='.', h0b='.';
    	char i1b='.', i2b='.', i3b='.', i4b='.', i5b='.', i6b='.', i7b='.', i8b='.', i9b='.', i0b='.';
    	char j1b='.', j2b='.', j3b='.', j4b='.', j5b='.', j6b='.', j7b='.', j8b='.', j9b='.', j0b='.';
    
    void map()
    {
    		cout << endl;
    	cout << " |  A B C D E F G H I J || A B C D E F G H I J | " << endl;
    	cout << " _______________________________________________ " << endl;
    	cout << "0|  " << a0 << " " << b0 << " " << c0 << " " << d0 << " " << e0 << " " << f0 << " " << g0 << " " << h0 << " " << i0 << " " << j0 <<
    	 	   " || "  << a0b << " " << b0b << " " << c0b << " " << d0b << " " << e0b << " " << f0b << " " << g0b << " " << h0b << " " << i0b << " " << j0b << " | " << endl;
    
    	cout << "1|  " << a1 << " " << b1 << " " << c1 << " " << d1 << " " << e1 << " " << f1 << " " << g1 << " " << h1 << " " << i1 << " " << j1 <<
    		   " || "  << a1b << " " << b1b << " " << c1b << " " << d1b << " " << e1b << " " << f1b << " " << g1b << " " << h1b << " " << i1b << " " << j1b << " | " << endl;
    
    	cout << "2|  " << a2 << " " << b2 << " " << c2 << " " << d2 << " " << e2 << " " << f2 << " " << g2 << " " << h2 << " " << i2 << " " << j2 <<
    	  	   " || "  << a2b << " " << b2b << " " << c2b << " " << d2b << " " << e2b << " " << f2b << " " << g2b << " " << h2b << " " << i2b << " " << j2b << " | " << endl;
    
    	cout << "3|  " << a3 << " " << b3 << " " << c3 << " " << d3 << " " << e3 << " " << f3 << " " << g3 << " " << h3 << " " << i3 << " " << j3 <<
    		   " || "  << a3b << " " << b3b << " " << c3b << " " << d3b << " " << e3b << " " << f3b << " " << g3b << " " << h3b << " " << i3b << " " << j3b << " | " << endl;
    
    	cout << "4|  " << a4 << " " << b4 << " " << c4 << " " << d4 << " " << e4 << " " << f4 << " " << g4 << " " << h4 << " " << i4 << " " << j4 <<
    	       " || "  << a4b << " " << b4b << " " << c4b << " " << d4b << " " << e4b << " " << f4b << " " << g4b << " " << h4b << " " << i4b << " " << j4b << " | " << endl;
    
    	cout << "5|  " << a5 << " " << b5 << " " << c5 << " " << d5 << " " << e5 << " " << f5 << " " << g5 << " " << h5 << " " << i5 << " " << j5 <<
    		   " || "  << a5b << " " << b5b << " " << c5b << " " << d5b << " " << e5b << " " << f5b << " " << g5b << " " << h5b << " " << i5b << " " << j5b << " | " << endl;
    
    	cout << "6|  " << a6 << " " << b6 << " " << c6 << " " << d6 << " " << e6 << " " << f6 << " " << g6 << " " << h6 << " " << i6 << " " << j6 <<
    		   " || "  << a6b << " " << b6b << " " << c6b << " " << d6b << " " << e6b << " " << f6b << " " << g6b << " " << h6b << " " << i6b << " " << j6b << " | " << endl;
    
    	cout << "7|  " << a7 << " " << b7 << " " << c7 << " " << d7 << " " << e7 << " " << f7 << " " << g7 << " " << h7 << " " << i7 << " " << j7 <<
    		   " || "  << a7b << " " << b7b << " " << c7b << " " << d7b << " " << e7b << " " << f7b << " " << g7b << " " << h7b << " " << i7b << " " << j7b << " | " << endl;
    
    	cout << "8|  " << a8 << " " << b8 << " " << c8 << " " << d8 << " " << e8 << " " << f8 << " " << g8 << " " << h8 << " " << i8 << " " << j8 <<
    		   " || "  << a8b << " " << b8b << " " << c8b << " " << d8b << " " << e8b << " " << f8b << " " << g8b << " " << h8b << " " << i8b << " " << j8b << " | " << endl;
    
    	cout << "9|  " << a9 << " " << b9 << " " << c9 << " " << d9 << " " << e9 << " " << f9 << " " << g9 << " " << h9 << " " << i9 << " " << j9 <<
    		   " || "  << a9b << " " << b9b << " " << c9b << " " << d9b << " " << e9b << " " << f9b << " " << g9b << " " << h9b << " " << i9b << " " << j9b << " | " << endl;
    
    	cout << " ----------------------------------------------- " << endl;
    }
    
    void main()
    {
    
    	map();
    
    	cout << "Geben sie bitte die Koordinaten fuer den Einer ein: ";
    	cin >> einer;
    
    	map();
    }
    


  • 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 😉



  • oh mein Gott.... 😮

    bitte schau dir an, was arrays sind...



  • Wie meine Vorredner bereits folgerichtig anmerkten solltest du hier auf Arrays (auch Vektoren genannt) zurückgreifen. Hier reicht ein einfaches 2-dimensionales char-Array:

    char cMap[10][10];
    

    Und um ein Feld zu setzen:

    cMap[x][y] = 'X';
    

    Um deine Darstellung der Map zu vereinfachen kannst du dann wie oben bereits gesagt einfach eine bzw. zwei Schleifen benutzen:

    for(int row=0;row<10;row++)
    {
     printf("%d| ",row);
     for(int col=0;col<10;col++)
     {
      printf("%d ",cMap[row][col]);
     }
     // ...
    }
    


  • Danke danke
    hab aber weiter das Problem das der Benutzer die Schiffe setzen soll.
    Z.B. ein Schiff auf A1 oder...



  • MAG schrieb:

    Und um ein Feld zu setzen:

    cMap[x][y] = 'X';
    

    MAG schrieb:

    Arrays (auch Vektoren genannt)

    arrays != vektoren...
    bei vektoren findet noch eine bereichsüberprüfung statt...
    bei arrays muss man also aufpassen, dass man nicht über die dimensionen hinaus schreibt...



  • leech schrieb:

    arrays != vektoren...
    bei vektoren findet noch eine bereichsüberprüfung statt...
    bei arrays muss man also aufpassen, dass man nicht über die dimensionen hinaus schreibt...

    Bei std::vector wird der Index nur überprüft, wenn du über .at() darauf zugreifst; beim []-Operator muß man genauso aufpassen wie bei normalen Arrays.



  • 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';
    }
    

Log in to reply