C++ Schiffeversenken

moinsen allerseit,

der thread sagt es eigendlich schon. ich möchte schiffeversenken in c++ schreiben und das dann mit der eingabeaufforderung spielen. ich habe auch schon einen code ( auf den ich total stolz bin ) aber bei meinem algorithmus für die platzierung für das schiff klemmt es i-wie. zu meiner vorgehensweise: ich habe nen 3d array. die erste dimension ist für die spalte (sprich 0-9), die zweite dimension ist für die zeile (also auch 0-9) und die dritte dimension ist für die anzeige oder nicht (also 0-1). in 0 wollte ich hinterlegen ob ein feld belegt ist oder nicht. das was in 1 steht soll dauerhaft angezeigt werden. so nun zur platzierung. eine zufallszahl zwischen 0 und 9 bestimmt zunächst in welcher spalte sich das erste feld des 5er-Schiffes befindet. danach wird auf gleiche weise die zeile generiert. sind spalte und zeile bekannt wird mit einer zufallszahl zwischen 0 und 3 die richtung ermittel (0=oben, 1=links, 2=unten, 3=rechts) in die sich das schiff dann vom startpunkt aus "fortpflanzt". sollte es mit startpostion und richtung problemegeben (z. B. sind links oben in der ecke die richtung 0 und 1 nicht möglich) soll einfach noch mal eine zahl zwischen 0 und 3 generiert werden (so lange bis es keinen konflikt mehr gibt). das klappt leider noch nicht (das ist im code zeile 65 - 66), da ich nicht weiss wie das case abgebrochen wird, anschließend die zahl neu generiert wird und wieder bei "case 3" eingestiegen wird. was noch gar nicht so klappt ist die belegung der felder nach eben erwähntem prinzip. liegen schiffe an den ränder stehen plötzlich 1en wo eigendlich gar keine seien können. beginnen schiffe an den rändern in die spielfeldmitte hinein geschieht das auch. das ist meine eigendlcihe frage, warum ist das so? ich verstehe es nicht....

danke schon mal im forab, hier der codeschiffeversenken.jpg

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main ( );
int initialisierung ( );
int platzierung ( );

int grenze [ 1 ];
int zufallszahl;
int koordinate [ 2 ];
char feldbelegung_spieler [ 9 ] [ 9 ] [ 1 ];
char feldbelegung_gegner [ 9 ] [ 9 ] [ 1 ];

int main ( )
{
initialisierung ( );
}
int initialisierung ( )
{
for ( unsigned i = 0; i < 2; i ++ )
{
grenze [ i ] = 0;
}
srand ( static_cast < int > ( time ( NULL ) ) );
zufallszahl = 0;
for ( unsigned i = 0; i < 3; i ++ )
{
koordinate [ i ] = 0;
}
for ( unsigned i = 0; i < 10; i ++ )
{
for ( unsigned j = 0; j < 10; j ++ )
{
for ( unsigned k = 0; k < 2; k ++ )
{
feldbelegung_spieler [ i ] [ j ] [ k ] = 'O';
feldbelegung_gegner [ i ] [ j ] [ k ] = 'O';
}
}
}
platzierung ( );
}
int platzierung ( )
{
for ( unsigned i = 0; i < 4; i ++ )
{
switch ( i )
{
case 0 :
grenze [ 1 ] = 9;
break;
case 1 :
koordinate [ 0 ] = zufallszahl;
grenze [ 1 ] = 9;
break;
case 2 :
koordinate [ 1 ] = zufallszahl;
grenze [ 1 ] = 3;
break;
case 3 :
if ( koordinate [ 0 ] < 4 && zufallszahl == 1 || koordinate [ 0 ] > 5 && zufallszahl == 3 || koordinate [ 1 ] < 4 && zufallszahl == 0 || koordinate [ 1 ] > 5 && zufallszahl == 2 )
{
}
else
{
if ( zufallszahl == 0 )
{
for ( unsigned j = 0; j < 5; j ++ )
{
feldbelegung_gegner [ koordinate [ 0 ] ] [ koordinate [ 1 ] - j ] [ koordinate [ 2 ] ] = '1';
}
}
if ( zufallszahl == 1 )
{
for ( unsigned j = 0; j < 5; j ++ )
{
feldbelegung_gegner [ koordinate [ 0 ] - j ] [ koordinate [ 1 ] ] [ koordinate [ 2 ] ] = '1';
}
}
if ( zufallszahl == 2 )
{
for ( unsigned j = 0; j < 5; j ++ )
{
feldbelegung_gegner [ koordinate [ 0 ] ] [ koordinate [ 1 ] + j ] [ koordinate [ 2 ] ] = '1';
}
}
if ( zufallszahl == 3 )
{
for ( unsigned j = 0; j < 5; j ++ )
{
feldbelegung_gegner [ koordinate [ 0 ] + j ] [ koordinate [ 1 ] ] [ koordinate [ 2 ] ] = '1';
}
}
}
break;

}
zufallszahl = grenze [ 0 ] + rand ( ) % ( grenze [ 1 ] - grenze [ 0 ] + 1 );
}
for ( unsigned i = 0; i < 10; i ++ )
{
for ( unsigned j = 0; j < 10 ; j ++ )
{
cout << feldbelegung_gegner [ j ] [ i ] [ koordinate [ 2 ] ];
}
cout << endl;
}
system ( "PAUSE" );
}
 
AW: C++ Schiffeversenken

so, nun das ganze ein wenig übersichtlicher :-)

Code:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main ( );
int initialisierung ( );
int platzierung ( );

int grenze [ 1 ];
int zufallszahl;
int koordinate [ 2 ];
char feldbelegung_spieler [ 9 ] [ 9 ] [ 1 ];
char feldbelegung_gegner [ 9 ] [ 9 ] [ 1 ];

int main ( )
{
    initialisierung ( );
}
int initialisierung ( )
{
    for ( unsigned i = 0; i < 2; i ++ )
    {
        grenze [ i ] = 0;
    }
    srand ( static_cast < int > ( time ( NULL ) ) );
    zufallszahl = 0;
    for ( unsigned i = 0; i < 3; i ++ )
    {
        koordinate [ i ] = 0;
    }
    for ( unsigned i = 0; i < 10; i ++ )
    {
        for ( unsigned j = 0; j < 10; j ++ )
        {
            for ( unsigned k = 0; k < 2; k ++ )
            {
                feldbelegung_spieler [ i ] [ j ] [ k ] = 'O';
                feldbelegung_gegner [ i ] [ j ] [ k ] = 'O';
            }
        }
    }
    platzierung ( );
}
int platzierung ( )
{
    for ( unsigned i = 0; i < 4; i ++ )
    {
        switch ( i )
        {
            case 0 :
                grenze [ 1 ] = 9;
                break;
            case 1 :
                koordinate [ 0 ] = zufallszahl;
                grenze [ 1 ] = 9;
                break;
            case 2 :
                koordinate [ 1 ] = zufallszahl;
                grenze [ 1 ] = 3;
                break;
            case 3 :
                if ( koordinate [ 0 ] < 4 && zufallszahl == 1 || koordinate [ 0 ] > 5 && zufallszahl == 3 || koordinate [ 1 ] < 4 && zufallszahl == 0 || koordinate [ 1 ] > 5 && zufallszahl == 2 )
                {
                }
                else
                {
                    if ( zufallszahl == 0 )
                    {
                        for ( unsigned j = 0; j < 5; j ++ )
                        {
                            feldbelegung_gegner [ koordinate [ 0 ] ] [ koordinate [ 1 ] - j ] [ koordinate [ 2 ] ] = '1';
                        }
                    }
                    if ( zufallszahl == 1 )
                    {
                        for ( unsigned j = 0; j < 5; j ++ )
                        {
                            feldbelegung_gegner [ koordinate [ 0 ] - j ] [ koordinate [ 1 ] ] [ koordinate [ 2 ] ] = '1';
                        }
                    }
                    if ( zufallszahl == 2 )
                    {
                        for ( unsigned j = 0; j < 5; j ++ )
                        {
                            feldbelegung_gegner [ koordinate [ 0 ] ] [ koordinate [ 1 ] + j ] [ koordinate [ 2 ] ] = '1';
                        }
                    }
                    if ( zufallszahl == 3 )
                    {
                        for ( unsigned j = 0; j < 5; j ++ )
                        {
                            feldbelegung_gegner [ koordinate [ 0 ] + j ] [ koordinate [ 1 ] ] [ koordinate [ 2 ] ] = '1';
                        }
                    }
                }
                break;
            
        }
        zufallszahl = grenze [ 0 ] + rand ( ) % ( grenze [ 1 ] - grenze [ 0 ] + 1 );
    }
    for ( unsigned i = 0; i < 10; i ++ )
    {
        for ( unsigned j = 0; j < 10 ; j ++ )
        {
            cout << feldbelegung_gegner [ j ] [ i ] [ koordinate [ 2 ] ];
        }
        cout << endl;
    }
    system ( "PAUSE" );
}
 
AW: C++ Schiffeversenken

Hi frequency,

-ich hab dir mal hier einen "Pseudocode" hingeschrieben
(ohne Test :D aber so in der Art sollte es gehen

Code:
// Spielfeldbegrenzung

#define maxx=9
#define maxy=9



void platzierung(void ) {

  // ein 5er Schiff platzieren
  set_Schiff(5);

}


void set_Schiff(int laenge) {
  int ok=0;
  int xpos,ypos,richtung;
  int n;

  // solange probieren, bis schiff komplett gesetzt ist
  while(ok==0) {
    // erst mal auf OK setzen
    ok=1;

    // zufallszahlen fuer den start und die richtung erzeugen
    xpos=zufall(0 bis maxx); // xpos
    ypos=zufall(0 bis maxy); // ypos
    richtung=zufall(0 bis 3); // richtung

    // test ob Spielfeldgrenzverletzung
    if((richtung==0) && (ypos<laenge)) ok=0; ypos zu klein
    if((richtung==2) && (ypos>(maxy-laenge))) ok=0; ypos zu gross
    if((richtung==1) && (xpos<laenge)) ok=0; xpos zu klein
    if((richtung==3) && (xpos>(maxx-laenge))) ok=0; xpos zu gross

    // test ob alle felder fuer das schiff noch frei
    if(ok==1) {
      for(n=0;n<laenge;n++) {
        switch(richtung) {
          case 0 :
            if(feld[xpos][ypos-n][0]<>'0') ok=0; // feld nicht frei
          break;
          case 2 :
            if(feld[xpos][ypos+n][0]<>'0') ok=0; // feld nicht frei
          break;
          case 1 :
            if(feld[xpos-n][ypos][0]<>'0') ok=0; // feld nicht frei
          break;
          case 3 :
            if(feld[xpos+n][ypos][0]<>'0') ok=0; // feld nicht frei
          break;
        }
      }
    }

    // alle felder fuer das schiff belegen
    if(ok==1) {
      for(n=0;n<laenge;n++) {
        switch(richtung) {
          case 0 :
            feld[xpos][ypos-n][0]='1'); // feld belegen
          break;
          case 2 :
            feld[xpos][ypos+n][0]='1'); // feld belegen
          break;
          case 1 :
            feld[xpos-n][ypos][0]='1'); // feld belegen
          break;
          case 3 :
            feld[xpos+n][ypos][0]='1'); // feld belegen
          break;
        }
      }
    }
  }
}


die Funktion "platzierung" setzt im Moment nur ein 5er Schiff
(musst du halt noch erweitern)

die Funktion "set_Schiff" probiert in einer while
die startparameter (x,y,richtung) bis diese Bedingungen erfüllt sind :

1. Startfeld und muss weit genug vom Spielfeldrand weg sein
2. Alle Felder fuer das Schiff muessen noch frei sein

wenn alles erfuellt wird das Schiff platziert und die While verlassen

VORSICHT !! ich hab den Code nicht getestet und die Zufallszahlgenerierung musst du noch ausprogrammieren

ich hoffe das hilft dir weiter

Gruss Uwe
 
Zuletzt bearbeitet:
AW: C++ Schiffeversenken

Ich danke dir für deine Hilfestellung. Das mit der while-anweisung finden ich gut. Ich werde das in das Programm mit einbinden. Danke für den Denkanstoß!
 
AW: C++ Schiffeversenken

n'abend,

alsoooo...
ich habe den code nun einmal ausformuliert, so dass ich ihn kompilieren kann und er als exe ausführbar ist und es passiert das gleiche wie bei meinem alten code. WARUM?

hier der code:
Code:
 #include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main ( );
int initialisierung ( );
int platzierung ( );
int schiff ( int );
int zufall ( int, int );

char feldbelegung_gegner [ 9 ] [ 9 ] [ 1 ];

int main ( )
{
    initialisierung ( );
}
int initialisierung ( )
{
    srand ( static_cast < int > ( time ( NULL ) ) );
    for ( unsigned i = 0; i < 10; i ++ )
    {
        for ( unsigned j = 0; j < 10; j ++ )
        {
            for ( unsigned k = 0; k < 2; k ++ )
            {
                feldbelegung_gegner [ i ] [ j ] [ k ] = '0';
            }
        }
    }
    platzierung ( );
}
int platzierung ( )
{
    schiff ( 5 );
    for ( unsigned i = 0; i < 10; i ++ )
    {
        for ( unsigned j = 0; j < 10; j ++ )
        {
            cout << feldbelegung_gegner [ j ] [ i ] [ 0 ];
        }
        cout << endl;
    }
    cout << endl;
    system ( "PAUSE" );
}
int schiff ( int laenge )
{
    bool abgeschlossen = false;
    int x, y, richtung = -1;
    while ( abgeschlossen == false )
    {
        abgeschlossen = true;
        x = zufall ( 0, 9 );
        y = zufall ( 0, 9 );
        richtung = zufall ( 0, 3 );
        if ( ( richtung == 0 ) && ( y < 4 ) )
        {
            abgeschlossen = false;
        }
        else if ( ( richtung == 1 ) && ( x < 4 ) )
        {
            abgeschlossen = false;
        }
        else if ( ( richtung == 2 ) && ( y > 5 ) )
        {
            abgeschlossen = false;
        }
        else if ( ( richtung == 3 ) && ( x > 5 ) )
        {
            abgeschlossen = false;
        }
        if ( abgeschlossen == true )
        {
            for ( unsigned i = 0; i < laenge; i ++ )
            {
                switch ( richtung )
                {
                    case 0 :
                        if ( feldbelegung_gegner [ x ] [ y - i ] [ 0 ] != '0' )
                        {
                            abgeschlossen = false;
                        }
                        break;
                    case 1 :
                        if ( feldbelegung_gegner [ x - i ] [ y ] [ 0 ] != '0' )
                        {
                            abgeschlossen = false;
                        }
                        break;
                    case 2 :
                        if ( feldbelegung_gegner [ x ] [ y + i ] [ 0 ] != '0' )
                        {
                            abgeschlossen = false;
                        }
                        break;
                    case 3 :
                        if ( feldbelegung_gegner [ x + i ] [ y ] [ 0 ] != '0' )
                        {
                            abgeschlossen = false;
                        }
                        break;
                }
            }
        }
        if ( abgeschlossen == true )
        {
            for ( unsigned i = 0; i < laenge; i ++ )
            {
                switch ( richtung )
                {
                    case 0 :
                        feldbelegung_gegner [ x ] [ y - i ] [ 0 ] = '1';
                        break;
                    case 1 :
                        feldbelegung_gegner [ x - i ] [ y ] [ 0 ] = '1';
                        break;
                    case 2 :
                        feldbelegung_gegner [ x ] [ y + i ] [ 0 ] = '1';
                        break;
                    case 3 :
                        feldbelegung_gegner [ x + i ] [ y ] [ 0 ] = '1';
                        break;
                }
            }
        }
    }
    cout << x << y << richtung << endl;
    cout << endl;
}
int zufall ( int minimum, int maximum )
{
    int zufallszahl;
    zufallszahl = minimum + rand ( ) % ( maximum - minimum + 1 );
}

und hier meine notizen bezüglich des fehlers.

fehler

x=7, y=0, richtung=1, j3 bis j7 zusätzlich belegt
x=6, y=0, richtung=1, j2 bis j6 zusätzlich belegt
x=1, y=0, richtung=3, j1 bis y5 zusätzlich belegt
x=9, y=9, richtung=1, a7 bis a10 zusätzlich belegt
wenn es in der zeile a horizontal liegt, dann ist der fehler, dass es auch in der zeile j ist und zwar um einen nach links verschoben
wenn es in der zeile j horizontal liegt, dann ist der fehler, dass es auch in der zeile a ist und zwar um einen nach rechts verschoben


x=6, y=4, richtung=0, j6 zusätzlich belegt
x=4, y=5, richtung=2, a6 zusätzlich belegt
x=5, y=0, richtung=2, j5 zusätzlich belegt
x=7, y=0, richtung=2, j7 zusätzlich belegt
ist hier ein feld des schiffes in zeile a, so ist der fehler, dass dieses feld um einen nach links verschoben auch in der zeile j belegt ist
ist ein feld des schiffes in der zeile j, so ist der fehler, dass dieses feld um einen nach rechts verschoben auch in der zeile a belegt ist


es kommt also immer vor wenn ein oder mehrere felder eines schiffes in der zeile a (zeile 0) oder der zeile j (zeile 9) liegen.
jedes (belegte) feld der zeile a taucht um einen nach links (-x) verschoben in der zeile j auf
jedes (belegte) feld der zeile j taucht um einen nach rechts (+x) verschoben in der zeile a auf

liegen belegte felder in der spalte 1 (spalte 0) oder der spalte 10 (spalte 9) tauch das problem nicht auf
keine richtungsabhängigkeit

WARUM?!?!?!?!
 

Jobs

Jobmail abonieren - keine Jobs mehr verpassen:

Top