Schiffe versenken Bitte helfen :(
-
Hallo ihr lieben,
Ich habe ein Riesen Problem an dem ich mir schon seit Stunden die Zähne ausbeiße und ich weiß nicht mehr wie ich noch weiter kommen soll. Seit 4 Monaten programmieren wir in der Schule mit C++ und es macht wirklich Spaß aber uns wurden noch keine wirklichen Grundlagen vermittelt (haben gerade erst mit arrays angefangen) und jetzt meint der Lehrer wir sollen bis Montag ein Schiffe versenken programmiert haben..
Seine Forderungen waren, das es gegen einen Computergegner gehen soll und das die Schiffe automatisch zufällig gesetzt werden müssen. Außerdem soll es ein 2er, 3er, 4er und 5er Schiff geben.
Und da liegt mein Problem.. Ich habe mich etwas in 2 dimensionale Arrays eingelesen und angefangen. Wollte erst mit einer Schleife die Schiff platzieren aber habe dann gemerkt das mein Programm sie immer übereinander legt.
Habe jetzt angefangen mit if Bedingungen jeden Fehler abzufangen allerdings werden diese immer mehr und unübersichtlicher. Und ich kann mir nicht vorstellen das es da nichts einfacheres gibt aber ich komme mit meinem Grundwissen nicht weiter leiderHier mein Code:
// Schiffe versenken.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <conio.h> #include <iostream> #include <string> #include <ctime> #include <windows.h> using namespace std; #define r_max 10 #define a_max 10 int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP(437); SetConsoleOutputCP(437); char spielfeldspieler1[r_max+1][a_max+1], spielfeldspieler2[r_max+1][a_max+1], spielfeldcomputer[r_max+1][a_max+1]; int reihe, auswahl, auswahl1, auswahl2, ki, zufall = 0; int x2 = 0, y2 = 0; char row[r_max] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }, treffer = (char)156, schiff = (char)174, wasser = (char)178, zerstört = (char)168, daneben = (char)157; srand(time(0)); void schiffesetzen(); void kiangriff(); //kiangriff() //{ // int r, a, z = 0; // while (z == 0) // { // r = 1 + rand() % r_max; // a = 1 + rand() % a_max; // if (spielfeldspieler1[r][a] == wasser) // { // spielfeldspieler1[r][a] = daneben; // z = 1; // } // else if (spielfeldspieler1[r][a] == daneben) // { // z = 0; // } // else if (spielfeldspieler1[r][a] == treffer) // { // z = 0; // } // else if (spielfeldspieler1[r][a] == schiff) // { // spielfeldspieler1[r][a] = treffer; // //ki++; // z = 1; //} for (int i = 1; i <= r_max; i++) { for (int j = 1; j <= r_max; j++) { spielfeldspieler1[i][j] = wasser; spielfeldspieler2[i][j] = wasser; spielfeldspieler2[i][j] = wasser; } } do { printf("Was wollen sie tun?\n"); printf("1. Neues Spiel gegen Mensch starten\n"); printf("2. Neues Spiel gegen Computer starten\n"); printf("3. Spiel beenden\n"); printf("Auswahl:"); cin >> auswahl; system("cls"); switch (auswahl) { case 1: do { system("cls"); printf("1. Schiffe setzen Spieler 1\n"); printf("2. Schiffe setzen Spieler 2\n"); printf("3. Spiel starten\n"); printf("4. Zurueck zum Hauptmenue\n"); printf("Auswahl:"); cin >> auswahl1; system("cls"); switch (auswahl1) { case 1: //Spieler 1 Schiffe setzen printf("1. Schiffe automatisch setzen \n"); printf("2. Schiffe manuell setzen\n"); printf("Auswahl:"); cin >> auswahl2; system("cls"); switch (auswahl2) { case 1: //Schiffe automatisch setzen // Zweier Schiff setzen //zufall = rand() % 10; start2: x2 = rand() % r_max; y2 = rand() % a_max; cout << x2 << " " << y2 << "\n"; if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2]) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2+1][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 - 1][y2]) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2 + 1]) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2+1] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2 - 1]) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2 - 1] = schiff; } else { goto start2; } //3er Schiff setzen start3: x2 = rand() % r_max; y2 = rand() % a_max; cout << x2 << " " << y2 << "\n"; if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2] == wasser && spielfeldspieler1[x2 + 2][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 + 1][y2] = schiff; spielfeldspieler1[x2 + 2][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 - 1][y2] == wasser && spielfeldspieler1[x2-2][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; spielfeldspieler1[x2 - 2][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2+1][y2] == wasser && spielfeldspieler1[x2-1][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2+1][y2] = schiff; spielfeldspieler1[x2-1][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2 + 1] == wasser && spielfeldspieler1[x2][y2 - 1] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2 + 1] = schiff; spielfeldspieler1[x2][y2 - 1] = schiff; } else { goto start3; } //4er Schiff setzen start4: x2 = rand() % r_max; y2 = rand() % a_max; cout << x2 << " " << y2 << "\n"; //x Koordinate if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2] == wasser && spielfeldspieler1[x2 + 2][y2] == wasser && spielfeldspieler1[x2 + 3][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 + 1][y2] = schiff; spielfeldspieler1[x2 + 2][y2] = schiff; spielfeldspieler1[x2 + 3][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 - 1][y2] == wasser && spielfeldspieler1[x2-2][y2] == wasser && spielfeldspieler1[x2 - 3][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; spielfeldspieler1[x2 - 2][y2] = schiff; spielfeldspieler1[x2 - 3][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2] == wasser && spielfeldspieler1[x2 - 1][y2] == wasser && spielfeldspieler1[x2 - 2][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 + 1][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; spielfeldspieler1[x2 - 2][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2] == wasser && spielfeldspieler1[x2 + 2][y2] == wasser && spielfeldspieler1[x2 - 1][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 + 1][y2] = schiff; spielfeldspieler1[x2 + 2][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2] == wasser && spielfeldspieler1[x2 - 1][y2] == wasser && spielfeldspieler1[x2 - 2][y2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2 + 1][y2] = schiff; spielfeldspieler1[x2 - 1][y2] = schiff; spielfeldspieler1[x2 - 2][y2] = schiff; } //y Koordinate else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2-1] == wasser && spielfeldspieler1[x2][y2-2] == wasser && spielfeldspieler1[x2][y2-3] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2-1] = schiff; spielfeldspieler1[x2][y2-2] = schiff; spielfeldspieler1[x2][y2-3] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2+1] == wasser && spielfeldspieler1[x2][y2-1] == wasser && spielfeldspieler1[x2][y2-2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2+1] = schiff; spielfeldspieler1[x2][y2+2] = schiff; spielfeldspieler1[x2][y2+3] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2+1] == wasser && spielfeldspieler1[x2][y2+2] == wasser && spielfeldspieler1[x2][y2-1] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2+1] = schiff; spielfeldspieler1[x2][y2+2] = schiff; spielfeldspieler1[x2][y2-1] = schiff; } else if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2][y2+1] == wasser && spielfeldspieler1[x2][y2-1] == wasser && spielfeldspieler1[x2][y2-2] == wasser) { spielfeldspieler1[x2][y2] = schiff; spielfeldspieler1[x2][y2+1] = schiff; spielfeldspieler1[x2][y2-1] = schiff; spielfeldspieler1[x2][y2-2] = schiff; } else { goto start4; } _getch(); break; case 2: //Schiffe manuell setzen system("cls"); printf(" | A B C D E F G E F H\n"); printf("------------------------------------------\n"); for (int r = 1; r <= r_max; r++) { if (r < 10) { printf("%i | ", r); } else { printf("%i | ", r); } for (int p = 1; p <= a_max; p++) { printf("%c ", spielfeldspieler1[r][p]); } printf("\n"); printf(" | "); printf("\n"); } _getch(); break; } break; case 2: //Spieler 2 Schiffe setzen printf("1. Schiffe automatisch setzen \n"); printf("2. Schiffe manuell setzen\n"); printf("Auswahl:"); cin >> auswahl2; system("cls"); switch (auswahl2) { case 1: //Schiffe automatisch setzen break; case 2: //Schiffe manuell setzen break; } break; case 3: //Spiel mit 2 Spielern Hauptprogramm break; } }while (auswahl1 != 4); break; case 2: //Programm gegen PC //Spieler 1 Schiffe setzen //PC Schiffe automatisch setzen //Feuern break; } } while (auswahl != 3); return 0; }
-
Shazy schrieb:
Bitte helfen
da:
SchiffeVersenken.cpp
// headers: // todo: write code. // function prototypes: // todo: write code. // entry point: int main() { // todo: write code. } // function definitions: // todo: write code.
Wie ist denn die genaue Aufgabenstellung?
-
Seine Forderungen waren, das es gegen einen Computergegner gehen soll und das die Schiffe automatisch zufällig gesetzt werden müssen. Außerdem soll es ein 2er, 3er, 4er und 5er Schiff geben.
Mehr hat er nicht gesagt
-
Funktionen! Ihr müsst doch schon Funktionen gehabt haben, oder? Ohne Funktionen werden das zehntausende von Zeilen, mit Funktionen vielleicht gerade mal 100.
Schreib eine Funktion, die ein Spielfeld und ein Schiff nimmt und prüft, ob das Schiff zu einer Überschneidung¹ führt. Jedes neue Schiff wird so lange zufällig neu platziert, bis es nicht mehr zu einer Überschneidung kommt.
Ihr seid übrigens mit einem Lehrer gesegnet, der C++ für C mit cout hält - und nicht einmal das konsequent oder kompetent. Mein Beileid. Du wirst später alles wieder vergessen müssen, was du gerade "lernst".
¹: Die Klugscheißerregeln für Schiffeversenken sagen, dass sich Schiffe auch nicht berühren dürfen. Das ändert aber nicht wirklich etwas an der allgemeinen Vorgehensweise, deine Bedingung muss bloß ein bisschen anders aussehen.
-
SeppJ schrieb:
Ohne Funktionen werden das zehntausende von Zeilen, mit Funktionen vielleicht gerade mal 100.
Naja.
goto
tuts auch.
-
if (spielfeldspieler1[x2][y2] == wasser && spielfeldspieler1[x2 + 1][y2])
Was willst du zum Beispiel mit obiger Zeile aussagen. Also insbesondere mit dem zweiten Teil
spielfeldspieler1[x2 + 1][y2]
Und noch was, warum initialisierst du deine Felder in 11x11, iterierst aber nicht durch die erste Spalte/Zeile?
-
Kleine Anmerkung am Rande (obwohl es sehr viele gäbe):
potenzieller Bug?for (int i = 1; i <= r_max; i++) { for (int j = 1; j <= r_max; j++) { spielfeldspieler1[i][j] = wasser; spielfeldspieler2[i][j] = wasser; spielfeldspieler2[i][j] = wasser; // doppel gemoppelt } }