C++ Problem mit Schiffe versenken [gelöst]



  • Hallo,
    ich versuche gerade ein ganz primitives Schiffe versenken Spiel zu erstellen. Dazu habe ich erstmal ein "Spielfeld" erstellt und versuche die Schiffe dort zufällig zu verteilen. Dazu lasse ich mir die Schiffe gleich auf anzeigen (ohne schießen), um zu testen, ob sie richtig verteilt wurden.
    Leider zerreißt es ein paar Schiffe immer wieder, oder zeigt Teile der Schiffe gar nicht an.
    Ich bin noch totaler Anfänger und finde leider meinen Fehler nicht.
    Vielleicht könnt ihr mir helfen.
    Vielen Dank schon einmal im Voraus!

    #include<iostream>
    using namespace std;
    #include<time.h>
    
    const int X = 10;
    const int Y = 10;
    
    int main()
    {
    
    	char x=0;
    	char y=0;
    	char c=0;
    
    	char spielfeld[X][Y];
    	char Buchstaben[10];
    //Zahlen Buchstaben zuweisen
    	Buchstaben[0]='A';
    	Buchstaben[1]='B';
    	Buchstaben[2]='C';
    	Buchstaben[3]='D';
    	Buchstaben[4]='E';
    	Buchstaben[5]='F';
    	Buchstaben[6]='G';
    	Buchstaben[7]='H';
    	Buchstaben[8]='I';
    	Buchstaben[9]='J';
    
    //Alle Felder leeren setzen
    	while (x < X) {
    		while (y < Y) {
    			spielfeld[x][y]='.';
    			y++;
    		}
    		y=0;
    		x++;
    	}
    
    //Schiffe verstecken
    	int d=0;
    	char n;
    	char spielfeld2[X][Y];
    
    	time_t Zeitstempel;
    	tm *nun;
    	Zeitstempel = time(0);
    	nun = localtime(&Zeitstempel);
    	int zeit1 = nun->tm_sec;
    	int zeit2 = nun->tm_min;
    
    	int start=zeit1*zeit2;
    	srand(start);
    //Schiffe erstellen
    	char Schiff[5];
    	Schiff[0]=2;
    	Schiff[1]=3;
    	Schiff[2]=3;
    	Schiff[3]=4;
    	Schiff[4]=5;
    
    //Schiffe benennen
    	while (Schiff[4] != 0) {
    		if (d==0) {
    			n='2';
    		}
    		else if (d==1) {
    			n='A';
    		}
    		else if (d==2) {
    			n='B';
    		}
    		else if (d==3) {
    			n='4';
    		}
    		else if (d==4) {
    			n='5';
    		}
    		else {
    			return 1;
    		}
    
    		int StartX = rand() % 10;
    		int StartY = rand() % 10;
    		int ObenUnten = rand() %4;
    		spielfeld[StartX][StartY]=n;
    		Schiff[d]--;
    
    		int kStartX, kStartY, gStartX, gStartY;
    
    		while (Schiff[d] != 0) {
    
    			ObenUnten = rand() %4;
    
    			kStartX=StartX--;
    			kStartY=StartY--;
    			gStartX=StartX++;
    			gStartY=StartY++;
    
    //Richtung des nächsten Schiffteils bestimmen
    			if (ObenUnten == 0 && gStartX < 10 && spielfeld[gStartX][StartY]!='.') {
    				StartX++;
    				spielfeld[StartX][StartY]=n;
    				Schiff[d]--;
    			}
    			else if (ObenUnten == 1 && kStartX > -1 && spielfeld[kStartX][StartY]!='.') {
    				StartX--;
    				spielfeld[StartX][StartY]=n;
    				Schiff[d]--;
    			}
    			else if (ObenUnten == 2 && gStartY < 10 && spielfeld[StartX][gStartY]!='.') {
    				StartY++;
    				spielfeld[StartX][StartY]=n;
    				Schiff[d]--;
    			}
    			else if (ObenUnten == 3 && kStartY > -1 && spielfeld[StartX][kStartY]!='.') {
    				StartY--;
    				spielfeld[StartX][StartY]=n;
    				Schiff[d]--;
    			}
    			else {
    
    			}
    
    		}
    		d++;
    
    	}
    
    //Siegbedingung
    	char sieg=0;
    	while (sieg!=1) {
    //Spielfeld erstellen
    		x=0;
    		y=0;
    		c=0;
    
    		cout << " 1 2 3 4 5 6 7 8 9 10" << endl;
    		while (x < X) {
    			cout << Buchstaben[c] <<" ";
    			while (y < Y) {
    				cout << spielfeld[x][y] << " " ;
    				y++;
    			}
    			cout << endl;
    			y=0;
    			x++;
    			c++;
    		}
    
    		system("PAUSE");
    
    	}
    
    	return 0;
    }
    

    edit: Eingerückt.


  • Mod

    In Zeile 94 veränderst du nach jedem Feld dir Richtung.

    Zeilen 97-100 verändern lustig die Werte von StartX und StartY. -- und ++ machen etwas ganz anderes als du anscheinend denkst.

    spielfeld2 wird nirgends benutzt

    Der Header cstdlib fehlt.

    time.h heißt ctime.

    Es wäre viel übersichtlicher, wären Variablen lokaler und mit längeren Namen definiert.

    system("PAUSE") verursacht auf meinem System einen Fehler. Siehe FAQ für etwas portables.

    Die ersten beiden Sachen die ich angemerkt habe sind die Fehler in deinem Algorithmus, das andere sind eher Schönheitsfehler.



  • - fuer Zaehlvariablen wuerde ich nicht den Typ char nehmen, auch wenns kompiliert, sind die Warnungen recht nervig.
    - Variablen sind teilweisse nichtssagend und auch laesst es sich da schwer durchsehen.
    (z.B. Zeile 86 > das Rand ist sinnlos, weil es in Zeile 94 wiederholt wird.)
    - Die Eigentliche Loesung fuer dein Problem kann ich dir nicht sagen 😃 es macht keinen Spass den Code zu analysieren. Dem Debugger faellts da leichter



  • Z. 94 ist so beabsichtigt!
    Z. 97-100 wären so besser? :

    kStartX=StartX;
    kStartY=StartY;
    gStartX=StartX;
    gStartY=StartY;
    kStartX--;
    kStartY--;
    gStartX++;
    gStartY++;

    Und obwohl ich von den Schönheitsfehlern absehe funktioniert es immer noch nicht. 😞


  • Mod

    php.freak schrieb:

    Z. 94 ist so beabsichtigt!
    Z. 97-100 wären so besser? :

    kStartX=StartX;
    kStartY=StartY;
    gStartX=StartX;
    gStartY=StartY;
    kStartX--;
    kStartY--;
    gStartX++;
    gStartY++;

    Und obwohl ich von den Schönheitsfehlern absehe funktioniert es immer noch nicht. 😞

    Dann war das so beabsichtigt? Dies macht nämlich genau das gleiche. Dann habe ich offenbar deinen Algorithmus falsch verstanden - kein Wunder, denn er ist extrem kryptisch implementiert. Dann bleibt mir nichts übrig als dich um Kommentierung deines Algorithmus zu fragen, denn ich steige da nicht durch und kann deswegen nicht sagen, was falsch ist.



  • Also ich habe das Problem jetzt selbst lösen können.
    Hier die Änderungen:

    php.freak schrieb:

    int StartX = rand() % 10;
    		int StartY = rand() % 10;
    		int ObenUnten = rand() %4;
    		spielfeld[StartX][StartY]=n;
    		Schiff[d]--;
    

    habe ich in Folgendes abgeändert, damit auch beim Setzen des ersten Schiffteils, überprüft wird, ob dort schon ein Schiff liegt.

    bool test=0;
    	int StartX;
    	int StartY;
    
    	while(test!=1) {
              StartX = rand() % 10;
              StartY = rand() % 10;
    
    	  if(spielfeld[StartX][StartY]=='.') {
    	    spielfeld[StartX][StartY]=n;
    	    Schiff[d]--;
    	    test=1;
    	  }
    	}
    

    Außerdem habe ich hier

    if(ObenUnten == 0 && gStartX < 10 && spielfeld[gStartX][StartY]!='.') {
    

    genau das Gegenteil erreicht, was ich wollte, da das Schiff nur gesetzt wurde, wenn das Feld schon besetzt war, denn richtig muss es so heißen:

    if(ObenUnten == 0 && gStartX < 10 && spielfeld[gStartX][StartY]=='.') {
    

    So, jetzt mach ich das Spiel fertig und verbessere dann noch die Schönheitsfehler. 😃
    Vielen Dank für die guten Tipps!


Anmelden zum Antworten