Advertisement
Akuba

Schiffe Versenken

Oct 19th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.97 KB | None | 0 0
  1. /*
  2.                 "Schiffe" versenken
  3.     (Wären das dann nicht eigendlich U-Boote wenn man sie nur sieht wenn sie getroffen wurden?)
  4.          Code geschrieben von Tobias Schmidt
  5.  
  6.          Legende:
  7.             ~ - Wasser
  8.             S - Schiff
  9.             o - Getroffenes "Schiff"
  10.             x - Fehlgeschlagener Schuss
  11.  
  12. */
  13. #include <stdio.h>
  14. #include <stdbool.h>
  15. #include <time.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18.  
  19. #define sizeX 8
  20. #define sizeY 8
  21. #define maxCachedGegnerZuege 4
  22. #define maxShips 16
  23.  
  24. // Interne Variablen
  25. #define wasser 0
  26. #define daneben 1
  27. #define treffer 2
  28. #define schiff 3
  29. #define bereits_Daneben 11
  30. #define bereits_Getroffen 22
  31.  
  32. // Das sieht man später anstatt der Variablen
  33. #define wasser_Icon "~ "
  34. #define daneben_Icon "x "
  35. #define treffer_Icon "O "
  36. #define schiff_Icon "S "
  37. #define bereits_Daneben_Icon "D "
  38. #define bereits_Getroffen_Icon "G "
  39.  
  40. // Headerkrams
  41.  
  42. void generiereSpielFeld(int spielFeld[sizeX][sizeY]);
  43. void zeigeSpielFeld(int spielFeld[sizeX][sizeY], bool nurGetroffen);
  44. int macheSpielZug (int spielFeld[sizeX][sizeY], int zugX, int zugY);
  45. bool menschlicherSpielZug(int spielFeld[sizeX][sizeY], bool istSpieler1, int mode, int debugx, int debugy);
  46.  
  47. bool menschlicherSpielZug(int spielFeld[sizeX][sizeY], bool istSpieler1, int mode, int debugx, int debugy) {
  48.     if (istSpieler1 && mode == 1) printf("\n\t\tDu bist am zug!\n");
  49.     else if (istSpieler1 && mode == 2) printf("\n\t\tSpieler 1 ist am zug!\n");
  50.     else if (!istSpieler1 && mode == 2) printf("\n\t\tSpieler 2 ist am zug!\n");
  51.     else if (istSpieler1 && mode == 3) printf("\n\t\tTestmodus\n");
  52.     if (mode == 3) zeigeSpielFeld(spielFeld, false);
  53.     else zeigeSpielFeld(spielFeld, true);
  54.     int nextx;
  55.     if (debugx == -1){
  56.         do {    // Nested Loop, hurray!
  57.             printf("\n\t Naechster Zug: X Koordinate: ");
  58.             scanf("%d", &nextx);
  59.             nextx--;
  60.             if (nextx > sizeX)
  61.             {
  62.                 printf("\tDie X Koordinate ist zu gross!\n");
  63.             } else if (nextx < 0) {
  64.                 printf("\tDie X Koordinate ist zu klein!\n");
  65.             } else {
  66.                 break;
  67.             }
  68.         } while (1);
  69.     } else nextx = debugx;
  70.     int nexty;
  71.     if (debugy == -1) {
  72.         do {    // Nested Loop again, hurray!
  73.             printf("\n\t Naechster Zug: Y Koordinate: ");
  74.             scanf("%d", &nexty);
  75.             nexty--;
  76.             if (nexty > sizeY)
  77.             {
  78.                 printf("\tDie Y Koordinate ist zu gross!");
  79.             } else if (nexty < 0) {
  80.                 printf("\tDie Y Koordinate ist zu klein!");
  81.             } else {
  82.                 break;
  83.             }
  84.  
  85.         } while (1);
  86.     } else nexty = debugy;
  87.     if (mode == 3) printf("X: %d - Y: %d", nextx, nexty);
  88.     int state = macheSpielZug(spielFeld, nextx, nexty);
  89.     spielFeld[nextx][nexty] = state;
  90.     if (state == treffer) {
  91.         //spielFeld[nextx][nexty] = treffer;
  92.         printf("\n\t TREFFER! - Gegnerisches Schiff versenkt!\n");
  93.     } else if (state == daneben) {
  94.         //spielFeld[nextx][nexty] = daneben;
  95.         printf("\n\t Daneben! - Leider nur Wasseratome getroffen.!\n");
  96.     } else if (state == bereits_Daneben) {
  97.         printf("\n\t Immernoch Daneben! - Hier ist nach wie vor kein Schiff!\n");
  98.     }
  99.     else if ( state == bereits_Getroffen) {
  100.         printf("\n\t Schiff bereits getroffen! - Die sind doch bereits alle tot!...\n");
  101.     }
  102.     else {
  103.         printf("\n\t Unbekannter Zustand... Der Entwickler ist Doof!\n");
  104.     }
  105.     return 1;
  106. }
  107.  
  108. int macheSpielZug (int spielFeld[sizeX][sizeY], int zugX, int zugY) {
  109.     int status = spielFeld[zugX][zugX];
  110.     if (status == schiff) {
  111.         return treffer;
  112.     } else if (status == daneben) return bereits_Daneben;
  113.     else if (status == wasser) {       
  114.         return daneben;
  115.     } else if (status == treffer) return bereits_Getroffen;
  116. }
  117.  
  118. void generiereSpielFeld(int spielFeld[sizeX][sizeY]) {
  119.     int totalShipps = 0;
  120.     for (int e = 0; e<maxShips; e++) {
  121.         int x = rand() % sizeX;
  122.         int y = rand() % sizeY;
  123.         if (spielFeld[x][y] != schiff) spielFeld[x][y] = schiff;
  124.         else x--;
  125.     }
  126. }
  127.  
  128. void zeigeSpielFeld(int spielFeld[sizeX][sizeY], bool nurGetroffen)
  129. {
  130.     for (int x = 0; x < sizeX; x++)
  131.     {  
  132.         for (int y = 0; y < sizeY; y++)
  133.         {
  134.             // AußenBorder Start
  135.             if (x == 0 && y == 0){
  136.                 printf("# X ");
  137.                 for (int k = 0; k < sizeX; k++)
  138.                 {
  139.                     printf("%d ", k+1);
  140.                 }
  141.                 printf("\nY\n1   ");
  142.             }
  143.             if (x != 0 && y == 0)
  144.             {
  145.                 printf("%d   ", x + 1);
  146.             }
  147.             // AußenBorder Ende
  148.             // Spielfeld Zeichnen Start
  149.             int toPrint = spielFeld[y][x];
  150.             if (nurGetroffen){
  151.                 if(toPrint == schiff) toPrint = 0;
  152.             }
  153.  
  154.             switch (toPrint)
  155.             {
  156.                 case wasser:    printf(wasser_Icon); break;
  157.                 case daneben:   printf(daneben_Icon); break;
  158.                 case treffer:   printf(treffer_Icon); break;
  159.                 case schiff:    printf(schiff_Icon); break;
  160.             }
  161.             //printf("%d|%d ", x, y);
  162.             // Spielfeld Zeichnen Ende
  163.  
  164.         }
  165.         printf("\n");
  166.     }
  167. }
  168.  
  169. int main() {
  170.     // Variablen Initialisieren
  171.     int spielFeldPlayer[sizeX][sizeY] = { 0 };
  172.     int spielFeldGegner[sizeX][sizeY] = { 0 };
  173.     int letzteGegnerZuege[maxCachedGegnerZuege][2];
  174.     int mode = 0; // Modi: 0 - Ungenutzt, 1 - gegen KI, 2 - 2 Spieler, 3 - test modus (versteckt)
  175.     bool spieler1AmZug = true;
  176.     bool spielVerlassen = false;
  177.     int debugx = 0;
  178.     int debugy = 0;
  179.     srand(time(NULL)); // Wir setzten einen Seed für den Zufallsgenerator.
  180.  
  181.     printf("**********************************\n");
  182.     printf("* \"Schiffe\" versenken! Oder so...*\n");
  183.     printf("**********************************\n\n");
  184.     printf("\t\t Hauptmenue:\n");
  185.     printf("\t1) Neues Spiel (gegen KI)\n");
  186.     printf("\t2) Neues Spiel (2 Spieler Modus)\n");
  187.     printf("\t3) Testmodus\n");
  188.     printf("\t4) Autofill\n");
  189.     printf("\n\t0) Spiel Beenden\n");
  190.     printf("\n\tAuswaehlen: ");
  191.     int hauptMenue = 1;
  192.     scanf("%d", &hauptMenue);
  193.  
  194.     switch (hauptMenue)
  195.     {
  196.         case 1: mode = 1; break;
  197.         case 2: mode = 2; break;
  198.         case 3: mode = 3; break;
  199.         case 4: mode = 4; break;
  200.         case 0: return 0; break; // break ist echt voll super sinnvoll hier. Echt jetzt... nicht ...
  201.     }
  202.     generiereSpielFeld(spielFeldGegner);
  203.     if(mode != 3 && mode != 4){
  204.         printf("Generiere Spielfelder:");
  205.         printf("\n\t- Spieler 1 Komplett -");
  206.         generiereSpielFeld(spielFeldPlayer); // Wir generieren für den Spieler das Spielfeld
  207.         if (mode == 1) printf("\n\t- KI-Gegner Komplett - \n");
  208.         else printf("\n\t- Spieler 2 Komplett - \n");
  209.         generiereSpielFeld(spielFeldGegner); // Wir generieren für den (KI-)Gegner das Spielfeld
  210.     } else printf("\n");
  211.     do {
  212.         if (spieler1AmZug)
  213.         {
  214.             if (mode == 4) {
  215.                 menschlicherSpielZug(spielFeldGegner, spieler1AmZug, mode, debugx, debugy);
  216.                 if (debugx < 8) debugx++;
  217.                 else {
  218.                     debugx = 0;
  219.                     debugy++;
  220.                 }
  221.                 if (debugy == 8)  {
  222.                     spielVerlassen = !spielVerlassen;
  223.                     break;
  224.                 }
  225.                 sleep(1);
  226.  
  227.             } else {
  228.                 menschlicherSpielZug(spielFeldGegner, spieler1AmZug, mode, -1, -1); // Wir laden das gegnerische Spielfeld. Wir wollen ja nicht unsere eigenen Schiffe wegmachen   
  229.                 if (mode != 3) spieler1AmZug = !spieler1AmZug;
  230.             }
  231.         } else {
  232.             if (mode == 1) {
  233.                 // KI Spielzug
  234.             } else {
  235.                 menschlicherSpielZug(spielFeldPlayer, spieler1AmZug, mode, -1, -1); // Mode ist total sinnlos hier... | Wir das das Spielfeld von Spieler 1.
  236.                 spieler1AmZug = !spieler1AmZug;
  237.             }
  238.         }
  239.     } while(!spielVerlassen);
  240.     return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement