Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Bitte um eine große Hilfe!!! Schiffe Versenken in einem simplen Turbo C++ code!

Leute Hilfe,
ich muss bis von den Pfingsferien ein Spiel programmieren und zwar "Schiffe Versenken" mit Turbo C++ Compiler! Meine Gruppe bestand aus 3 Mitgliedern, die sich dann langsam abgemeldet haben... Jetzt muss ich das ganze alleine machen! Ich bitte alle, die das Spiel schon haben, es mir zu senden bzw. nur den Code! Selber bin ich nicht so gut im Programmieren.
Ich danke allen für ihre Hilfe!!!

Wenn ich das verhaue bin ich am ..,....
Leute, wenn es euch nichts ausmacht, bitte senden...


Antworten zu Bitte um eine große Hilfe!!! Schiffe Versenken in einem simplen Turbo C++ code!:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
2 Leser haben sich bedankt

Ich bin ja eigentlich nicht so der Freund von "anderer Hausaufgaben machen", zumal mir aber gerade langweilig war, habe ich mich mal rangesetzt. Ist fast fertig, schau  heut abend oder morgen nochmal vorbei.

Aber schonmal vorweg: Wenn Du keine richtige Ahnung von Programmieren hast und den Code erklären musst, bist Du wahrscheinlich aufgeschmissen. Sind bis jetzt 175 Zeilen Code und zumal ich keine Lust auf globale Variablen hatte werden einige Zeiger zu den Funktionen geschubst...

Schau Dir das also vielleicht doch noch mal selber an.

Bis bald dann also

Spawn

Da Spawn ja hierfuer so lange braucht... ::)

#include <iostream>
#include <strings.h>
#include <stdlib.h>

#define FSX 10
#define FSY 10

const int Shps[]={
   5,4,3,3,2,2
};

const char fc[]={
   '~','x','*','o'
};

const char *sc[]={
   "MISS","HIT","SUNK","WRONG"
};

using namespace std;

class ShpF
{
   private:
      typedef enum {
         FIELD_EMPTY = 0,
         FIELD_SHIP,
         FIELD_HIT=100,
         FIELD_MISS,
      }tFieldEnum;
      tFieldEnum fld[FSX][FSY];
      tFieldEnum fle[FSX][FSY];
   public:
      ShpF(){
         bzero( fld, sizeof( fld ) );
         bzero( fle, sizeof( fle ) );
         srand((unsigned)time(0));
      }
      typedef enum{
         SHOT_MISS=0,
         SHOT_HIT,
         SHOT_SUNK,
         SHOT_FALSE
      }tShotEnum;
      void DumpFld(){
         cout << "  ";
         for(int i=0;i<FSX;++i ){
            char c = 'A'+i;
            cout << c;
         }
         cout << " |   ";
         for(int i=0;i<FSX;++i ){
            char c = 'A'+i;
            cout << c;
         }
         cout << "\n";
         for( int y=0; y<FSY;y++ )
         {
            cout << y << " ";
            for( int x=0; x<FSX;x++ )
            {
               char c = (fld[x][y]==FIELD_EMPTY)?fc[0]:(fld[x][y]<FIELD_HIT?fc[1]:fld[x][y]<FIELD_MISS?fc[2]:fc[3]);
               cout << c;
            }
            cout << " | " << y << " ";
            for( int x=0; x<FSX;x++ )
            {
               char c = (fle[x][y]==FIELD_EMPTY)?fc[0]:(fle[x][y]<FIELD_HIT?fc[1]:fle[x][y]<FIELD_MISS?fc[2]:fc[3]);
               cout << c;
            }            
            cout << "\n";
         }
      }
   private:
      void AutoPlace(int s,int t){
         bool z;
         do{
            z = false;
            int o = (int)(0.5+rand()/(RAND_MAX+1.0));
            int x = (int)((FSX-(o?s:0))*(rand()/(RAND_MAX+1.0)));
            int y = (int)((FSY-((!o)?s:0))*(rand()/(RAND_MAX+1.0)));
            for(int i=0;(!z)&&i<s;++i)
               z=fld[x+(o?i:0)][y+((!o)?i:0)]!=FIELD_EMPTY;
            for(int i=0;(!z)&&i<s;++i)
               fld[x+(o?i:0)][y+((!o)?i:0)]=(tFieldEnum)t;
         }while(z);
      }
      bool IsShipPresent(int s){
         bool z=false;
         for(int x=0;!z&&x<FSX;x++)
            for(int y=0;!z&&y<FSX;y++)
               z=fld[x][y]==s;
         return z;
      }
   public:
      void AutoPlace(){
         for(int i=0;i<(sizeof(Shps)/sizeof(int));++i)
            AutoPlace(Shps[i],i+1);
      }
      bool IsLost(){
         bool z = false;
         for(int x=0;!z&&x<FSX;++x)
            for(int y=0;!z&&y<FSY;++y)
               z=(fld[x][y]>FIELD_EMPTY)&&(fld[x][y]<FIELD_HIT);
         return !z;
      }
      tShotEnum Shoot(int x, int y){
         if((x<0)||(x>=FSX)||(y<0)||(y>=FSY))
            return SHOT_FALSE;
         int s=fld[x][y];
         int a = ((s>FIELD_EMPTY)&&(s<=FIELD_HIT));
         fld[x][y]=a?FIELD_HIT:FIELD_MISS;
         int b = (s!=FIELD_HIT);
         int c = IsShipPresent(s);
         return a?b?c?SHOT_HIT:SHOT_SUNK:SHOT_FALSE:SHOT_MISS;      
      }
      void SetEShot( int x, int y, tShotEnum s ){
         if(!((x<0)||(x>=FSX)||(y<0)||(y>=FSY)))
            fle[x][y]=s==SHOT_MISS?FIELD_MISS:FIELD_HIT;
      }
      void AutoShoot( ShpF &shpf ){
         bool z=false;
         int x,y;
         do{
            x = (int)((FSX)*(rand()/(RAND_MAX+1.0)));
            y = (int)((FSY)*(rand()/(RAND_MAX+1.0)));
            z=fle[x][y]==FIELD_EMPTY;
         }while(!z);
         printf( "My shot: %c %d yields a %s!\n", ('A'+x), y, sc[shpf.Shoot(x,y)] );
      }
            
};         

int main(void)
{
   ShpF f1;
   ShpF f2;
   f1.AutoPlace();
   f1.DumpFld();
   f2.AutoPlace();
   while( !f1.IsLost()&&!f2.IsLost() )
   {
      cout << "Shoot:";
      char c;
      int y;
      cin >> c;
      cin >> y;
      int x = c - 'a';
      ShpF::tShotEnum s = f2.Shoot(x,y);
      cout << sc[(int)s] << "\n";
      f1.SetEShot(x,y,s);
      if( !f2.IsLost() )
         f2.AutoShoot( f1 );
      f1.DumpFld();
   }
   cout << f1.IsLost()?"You loose!\n":"Computer looses\n";
   return 0;
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
2 Leser haben sich bedankt

Oh menno....meins ist halt pures C, das hat das ganze Hin-und-Her-Geschiebe vom Feld bissel schwer gemacht.
*ningel*
Trotzdem tolles Ding, deins. C++ ist halt doch oftmals eleganter..... :-[

Na und, Spawn, poste es doch trotzdem! Ich nehme mal an, DarkSide kann mit beiden Lösungen eh nicht viel anfangen, es sei denn, der Lehrer fragt wirklich nicht nach, wie er das programmiert hat...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Juhu, ich darf mitspielen  ;)

Da isses. Wie gesagt: Wahrscheinlich recht umständlich, pures rustikales C ohne großen Schnickschnack.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int showMainmenue()
{
    int wahl = 0;
    printf("\n*** Hauptmenue ***\n\n");
    printf("1..Neues Spiel starten\n");
    printf("2..Spiel beenden\n\n");
    do
    {
        printf("Ihre Wahl: "); scanf("%d", &wahl);
    }
    while((wahl != 1)&&(wahl != 2));
    return wahl;        
}

void initGame(int* xmax, int* ymax)
{
    printf("\nGeben Sie nun die Spielfeldgroesse ein.\n");
    do
    {
        printf("Anzahl der Spalten (5-10):"); scanf("%d", xmax);
    }
    while(((*xmax) < 5)||((*xmax) > 10));
    do
    {
        printf("Anzahl der Zeilen (5-10):"); scanf("%d", ymax);
    }
    while(((*ymax) < 5)||((*ymax) > 10));
}

void showField(int player, int xmax, int ymax, int* feld, bool stealth)
{
    int i, j;
    printf("O ");
    for( i=0; i<xmax; i++)
        printf("%d ", i);
    printf("\n");
    for(j=0; j<ymax; j++)
    {
        printf("%d ", j);
        for(i=0; i<xmax; i++)
        {
            switch (feld[xmax*j + i + xmax*ymax*(player-1)])
            {
                case 0:
                    //Wasser
                    printf("~ ");
                    break;
                case 1:
                    //Schiff
                    if(stealth) printf("~ ");
                    else printf("S ");
                    break;
                case 2:
                    //Treffer
                    printf("* ");
                    break;
                case 3:
                    //Schuss ins Leere
                    printf("x ");
                    break;              
                default:
                    //ERROR
                    printf("ER");
                    break;
            }
        }
        printf("\n");
    }
}

bool gameLost(int player, int xmax, int ymax, int* feld)
{
    for(int i=0; i<xmax*ymax; i++)
        if(feld[i + xmax*ymax*(player-1)] == 1) return false;
    return true;
}

void setShips( int player, int anzZw, int anzDr, int anzVi, int xmax, int ymax, int* feld)
{
    int i, j, art, x = 0, y = 0, r = 0, dx, dy;
    bool flag = false;
    printf("\n*** Spieler %d ***\n", player);
    for( i=0; i<(anzZw+anzDr+anzVi); i++)
    {
        if(i<anzZw) art=2;
        else
        {
            if(i<anzZw+anzDr) art=3;
            else art=4;
        }
        j++;
        do
        {
            printf("\nPlatzierung eines Schiffes der Laenge: %d\n", art);
            flag = false;
            showField(player, xmax, ymax, feld, false);
            printf("Geben Sie den Startpunkt ein:\n");
            printf("x: "); scanf("%d", &x);
            printf("y: "); scanf("%d", &y);
            printf("Soll das Schiff horizontal oder vertikal platziert werden?\n");
            do
            {
                printf("1.. |\n");
                printf("2.. -\n");
                scanf("%d", &r);
            }
            while((r<1)||(r>2));
            if(r == 1) { dx=0; dy=1; }
            else { dx=1; dy=0; }
            for(j=0; j<art; j++)
                if((x+j*dx<0)||(x+j*dx>=xmax)||(y+j*dy<0)||(y+j*dy>=ymax)) flag=true;
            if( !flag )
                for(j=0; j<art; j++)
                    if(feld[xmax*(y+j*dy) + x+j*dx + xmax*ymax*(player-1)] != 0) flag = true;
            if( flag ) printf("\n*** Die Eingabe ist fehlerhaft ***\n\n");
        }
        while(flag);
        for(j=0; j<art; j++)
            feld[xmax*(y+j*dy) + x+j*dx + xmax*ymax*(player-1)] = 1;
    }
}

bool zufall(int player, int anzZw, int anzDr, int anzVi, int xmax, int ymax, int* feld)
{
    unsigned seed = time(NULL);
    srand(seed);
    bool flag;
    int x, y, r, versuche, dx, dy, i, j, art;
    for( i=0; i<(anzZw+anzDr+anzVi); i++)
    {
        if(i<anzZw) art=2;
        else
        {
            if(i<anzZw+anzDr) art=3;
            else art=4;
        }
        versuche = 0;
        do
        {
            flag = false;
            x = rand()%xmax;
            y = rand()%ymax;
            r = rand()%2 + 1;
//            printf("Hallo, ich bin der Zufall.\nx: %d\ny: %d\nr: %d\n", x, y, r);
            if(r==1) { dx = 0; dy = 1; }
            else { dx = 1; dy = 0; }
            for(j=0; j<art; j++)
                if((x+j*dx<0)||(x+j*dx>=xmax)||(y+j*dy<0)||(y+j*dy>=ymax)) flag=true;
            if( !flag )
                for(j=0; j<art; j++)
                    if(feld[xmax*(y+j*dy) + x+j*dx + xmax*ymax*(player-1)] != 0) flag = true;
            versuche++;
        }
        while((flag)&&(versuche<100));
        if(flag) return false;
        for(j=0; j<art; j++)
            feld[xmax*(y+j*dy) + x+j*dx + xmax*ymax*(player-1)] = 1;
    }
    return true;        
}

void showShipsetmenue(int player, int anzZw, int anzDr, int anzVi, int xmax, int ymax, int* feld)
{
    int wahl;
    bool flag;
    do
    {
        flag = true;
        printf("\n*** Spieler %d ***\n", player);
        printf("\nWie wollen Sie Ihre Schiffe setzen?\n");
        do
        {
            printf("1..selbst setzen\n");
            printf("2..zufaellig setzen\n");
            scanf("%d", &wahl);
        }
        while((wahl<1)||(wahl>2));
        if(wahl == 1) setShips(player, anzZw, anzDr, anzVi, xmax, ymax, feld);
        else flag = zufall(player, anzZw, anzDr, anzVi, xmax, ymax, feld);
        if( !flag ) printf("\n *** Nach 100 Versuchen ist es leider nicht gelungen ein Schiff zu platzieren. ***\n");
    }
    while( !flag );
    showField(player, xmax, ymax, feld, false);        
}

void shoot(int player, int xmax, int ymax, int* feld)
{
    int x = 0, y = 0;
    printf("\n*** Schuss durch Spieler %d ***\n", player);
    if(player==1) player=2;
    else player=1;
    showField(player, xmax, ymax, feld, true);
    printf("\nSchusskoordinaten:\n");
    do
    {
        printf("x: "); scanf("%d", &x);
        printf("y: "); scanf("%d", &y);
    }
    while((x<0)||(x>=xmax)||(y<0)||(y>=ymax));
    if(feld[xmax*y + x + xmax*ymax*(player-1)] == 1)
    {
        printf("\n*** TREFFER ***\n");
        feld[xmax*y + x + xmax*ymax*(player-1)] = 2;
    }
    else
    {
        printf("\n*** Leider daneben ***\n");
        feld[xmax*y + x + xmax*ymax*(player-1)] = 3;
    }
    showField(player, xmax, ymax, feld, true);
}

int main()
{
    //Platz für eigene Anpassung (Anzahl der Schiffe)
    int anzZweier = 1;
    int anzDreier = 2;
    int anzVierer = 1;    
    //Platz zuende
    int xmax = 0, ymax = 0, i, player;
    int* feld;
    printf("*********************\n");
    printf("* Schiffe versenken *\n");
    printf("*********************\n");
    do
    {
        if (showMainmenue() == 2) break; //raus aus Schleife -> Ende
        initGame(&xmax, &ymax); // Zeiger uebergeben, damit initGame() die Werte aendert
        feld = (int *)malloc(xmax*ymax*2*sizeof(int));
        for(i=0; i<(xmax*ymax*2); i++)
            feld[i] = 0;
        showShipsetmenue(1, anzZweier, anzDreier, anzVierer, xmax, ymax, feld);
        showShipsetmenue(2, anzZweier, anzDreier, anzVierer, xmax, ymax, feld);
        player = 1;
        do
        {
            shoot(player, xmax, ymax, feld);
            player++;
            if(player==3) player=1;
        }
        while( !gameLost(player, xmax, ymax, feld) );
        player++;
        if(player == 3) player = 1;
        printf("\n******************************");
        printf("\n*** Spieler %d hat gewonnen ***", player);
        printf("\n******************************\n");
        free(feld);
    }
    while( true );
    printf("\nSpiel-Ende.");
    return 0;    
}

Hey, SPAWN und GAST!!!! VIELEN DANK!!!!!
Wie kann ich Euch danken?
Ich hoffe, dass ich mal eine Chance, mich bei Euch zu bedanken!
Leute vielen Dank!!!
Das werde ich Euch nie vergessen...
Schade, dass ich Eure Mail-Adressen nicht habe, sonst würde ich mich bei Euch einzeln bedanken!!!

Mit einem erleichterten Herz,

DarkSide

Hey, SPAWN und GAST!!!! VIELEN DANK!!!!!
Wie kann ich Euch danken?
Ich hoffe, dass ich mal eine Chance habe!, mich bei Euch zu bedanken!
Leute vielen Dank!!!
Das werde ich Euch nie vergessen...
Schade, dass ich Eure Mail-Adressen nicht habe, sonst würde ich mich bei Euch einzeln bedanken!!!

Mit einem erleichterten Herz,

DarkSide

Ach ja, ich werde den Code schon verstehen, keine Sorge... Ich lerne das erst... Die anderen hatten das schon vorher gehabt. Ich bin neu gekommen!!! Da die Gruppe sich aufgelöst hat und ich alleine blieb, dachte ich mir, ich versuche es so... DankE!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Naja, man hilft ja gern.... ;)

Hab meins noch nicht ausgiebig getestet, musste vielleicht mal noch machen und wie ",,,,," und ich schon sagten: Schau's Dir in Ruhe durch, überleg Dir welche Variable was speichert, welche Funktion was bekommt und was liefert und warum dann alles zusammen funktioniert. Denn ohne eine "Verteidigung" wirst Du das wohl nicht abgeben dürfen (vermute ich mal).

Gruß Spawn

Jo, mach ich, Danke Bros!

Wie sagte der Lenin:"Lernen, lernen und noch mal lernen!" ;D - Ich hasse den Typen!!!

Also, danke noch mals

und ich hoffe wir hören 'was von uns, wenn Ihr Hilfe braucht!!! Schreibt einfach auf meine Mail...

DarkSide


« Eigenes System programmierenToupper in C »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Compiler
Als Compiler bezeichnet man ein Programm zum Übersetzen der Quellprogramme einer bestimmten Programmiersprache in ausführbare Dateien, also in die Maschinenspra...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...