Nach Koordinaten fragen, bis ALLE Schiffe versenkt sind!



  • Hallo,
    ich, Programmieranfänger, bin gerade dabei Schiffe versenken zu programmieren.
    Mir wurde empfohlen "goto" zu vermeiden und dem bin ich auch nachgegangen indem ich do-while-Schleifen verwendet habe, aber nun habe ich ein Problem.
    Und zwar möchte ich, dass mein Programm so lange nach Koordinaten fragt, bis ALLE Schiffe versenkt sind.
    Genau das gelingt mir leider nicht. Weiß nicht, welche Bedingung ich in die Klammern nach while schreiben soll. (ZEILE 207)
    Hier der Code:

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include "ctime"
    
    using namespace std;
    
    int breite,hoehe,i,x,y,level; //global
    int feld [100][100];
    
    void gotoxy(int x,int y)
    {
    	HANDLE hConsole;
    	COORD cursorLoc;
    	std::cout.flush();
    	cursorLoc.X = x;
    	cursorLoc.Y = y;
    	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hConsole, cursorLoc);
    }
    
    void allesloeschen()
    {
    	int i = 0;
    
    	gotoxy(0,0);
    
    	do
    	{
    	cout << "                                                                               \n";
    	i++;
    	}
    	while(i<13);
    
    	gotoxy(0,0);
    }
    
    void eingabeloeschen()
    {
    	int i = 0;
    
    	gotoxy(0,hoehe+3);
    
    	do
    	{
    	cout << "                                                                               \n";
    	i++;
    	}
    	while(i<13);
    
    	gotoxy(0,hoehe+3);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SetConsoleTitleA("Schiffeversenken");
    	do
    {
    	cout << "Waehlen Sie eine Schwierigkeitsstufe aus:\n";
    	cout << "Einfach (1)\nMittel (2)\nSchwer (3)\n";
    	cin >> level;
    	allesloeschen(); // löscht (0,0) bis (80,0) und (0,12) bis (80,12) und kehrt auf (0,0) zurueck
    	if(!(level == 1 || level == 2 || level == 3))
    	{
    		cout << "Ihre Eingabe ist ungueltig!\n";
    		_getch();
    		allesloeschen();
    		cin.clear(); 
        cin.ignore(1000, '\n');
    		continue; // An den Anfang der Schleife springen
    	}
    } 
    while (!(level == 1 || level == 2 || level == 3));
    
    	if(level==1) // breite und hoehe für Einfach
    	{
    		breite = 5;
    		hoehe = 5;
    	}
    	else if(level==2) // " Mittel
    	{
    		breite = 8;
    		hoehe = 8;
    	}
    	else if(level==3) // " Schwer
    	{
    		breite = 12;
    		hoehe = 12;
    	}
    	// Feldgenerieren Anfang
    		for(y=0; y<breite+2; y++)
    	{
    			gotoxy(0,y);
    			cout<<"#";
    			gotoxy(breite+1,y);
    			cout<<"#";
    	}
    
    	for(x=0; x<hoehe+2; x++)
    	{
    			gotoxy(x,0);
    			cout<<"#";
    			gotoxy(x,hoehe+1);
    			cout<<"#";
    	}
    
    			for (x=1; x<breite+1; x++) 
      { 
    		for (y=1; y<hoehe+1; y++) 
        {
    			feld[x][y] = 0;  // Spielfeld = 0 -> Wasser
    			gotoxy(x,y);
    		  cout << "~"; // Wasser -> ~
    	}
      } 
    	// Feld generieren Ende
    	srand((unsigned) time(NULL)); // Initialisieren des Zufallszahlengenerators
    	// Schiffe generieren Anfang
    	for(i=1; i<6; i++)
    		{
    		x = rand() %breite-1 + 1;
    		y = rand() %hoehe-1 + 1;
    
    		if(x>0 && x<breite+2 && y>0 && y<hoehe+2)
    		{
    			 if (feld[x][y]==1)
    			 {
    			i--;
    			continue; // An den Anfang der Schleife springen
    			 }
    			feld [x][y] = 1;
    			gotoxy(x,y);
    			if (feld[x][y]==1)
    				{
    				cout << "S"; // im Testmodus anzeigen
    			}
    			else
    			{
    				cout << "~";
    			}
    		}
    		else
    		{
    			i--;
    		}
    		}
    	// Schiffe generieren Ende
    
    	int xcoord, ycoord; // Eingabe des Spielers - lokal
    
    	gotoxy(0,hoehe+3);
    	cout << "Das Kampffeld ist " << breite << "x" << hoehe << " gross!\n" << "Versuchen Sie die 5 gegnerischen Schiffe"
    		 << " innerhalb des Feldes zu treffen!\n";
    	// Koordinateneingabe Anfang
    	do
    	{
    	cout << "Geben Sie eine x-Koordinate ein: ";
    	cin >> xcoord;
    	if (cin.fail() || xcoord > breite || xcoord < 1) // Eingabe darf nur zwischen 1-10 
    	{
    		cout << "Eingabe liegt nicht im zulaessigen Bereich!\n";
    		_getch();
    		cin.clear();
    		cin.ignore(INT_MAX,'\n');
    		eingabeloeschen();
    		continue;
    	}
    	cout << "Geben Sie eine y-Koordinate ein: ";
    	cin >> ycoord;
    	// Koordinateneingabe Ende
    	if (cin.fail() || ycoord > hoehe || ycoord < 1) // Eingabe überprüfen 
    	{
    		cout << "Eingabe liegt nicht im zulaessigen Bereich!\n";
    		_getch();
    		cin.clear();
    		cin.ignore(INT_MAX,'\n');
    		eingabeloeschen();
    		continue;
    	}
    	// Koordinateneingabe verarbeiten Anfang
    		if (feld[xcoord][ycoord] == 0)
    	{
    		gotoxy(xcoord, ycoord);
    		cout << "-";
    		feld[xcoord][ycoord] = 3;
    		eingabeloeschen();
    		cout << "Ziel verfehlt!";
    		_getch();
    		eingabeloeschen();
    		continue;
    	}
    		else if (feld [xcoord][ycoord] == 1)
    	{
    		gotoxy(xcoord, ycoord);
    		cout << "X";
    		feld[xcoord][ycoord] = 2;
    		eingabeloeschen();
    		cout << "Sie haben ein gegnerisches Schiff versenkt!";
    		_getch();
    		eingabeloeschen();
    		continue;
    	}
    
    	}
    	while (feld[x][y] != 1); // oder (feld[100][100] !=1)
    
    	cout << "Sie haben alle gegnerischen Schiffe versenkt!\nDruecken Sie eine beliebige Taste, um das Spiel zu beenden!";
    
    	_getch();
    	return 0;
    }
    

    (siehe ZEILE 207)
    Bei "feld[x][y] != 1" fragt er nach Versenken des ersten Schiffes nicht mehr weiter nach Koordinaten. Ist ja auch logisch, weil er nach dem x und y-Koodinate geht, das zuletzt "verwendet" wurde.

    Bei "feld[100][100] !=1" fragt er auch nach Versenken des letzten Schiffes weiter nach Koordinaten, auch wenn ich zu Anfang des Programms ALLE Felder gleich 0 setze, gleiches Ergebnis.

    Ich habe leider keine Idee mehr, wie die Bedingung sonst lauten könnte.
    Könnt Ihr mir da auf die Sprünge helfen?

    lg fener000



  • Dein Einrückungsstil ist schlecht, man kann nicht sehen wie die Blöcke zusammen gehören.

    feld[100][100] existiert bei dir nicht! Also ist der Zugriff darauf auch nicht erlaubt.

    Der Index bei Arrays fängt bei 0 an. Immer.

    Lass einen Zähler mitlaufen. Z.B. AnzahlSchiffe.
    Zähl den hoch beim generieren der Schiffe und runter, wenn ein Treffer gelandet wurde.
    Schluß ist, wenn AnzahlSchiffe == 0.



  • DirkB schrieb:

    Dein Einrückungsstil ist schlecht, man kann nicht sehen wie die Blöcke zusammen gehören.

    feld[100][100] existiert bei dir nicht! Also ist der Zugriff darauf auch nicht erlaubt.

    Der Index bei Arrays fängt bei 0 an. Immer.

    Lass einen Zähler mitlaufen. Z.B. AnzahlSchiffe.
    Zähl den hoch beim generieren der Schiffe und runter, wenn ein Treffer gelandet wurde.
    Schluß ist, wenn AnzahlSchiffe == 0.

    Dankeschön für die schnelle Antwort!
    Auf die Einrückung werde ich in der Zukunft achten.
    Hat funktioniert. Super!

    Gibt's sonst noch (wahrscheinlich Vieles) Suboptimales im Code?

    lg fener000



  • fener000 schrieb:

    Gibt's sonst noch (wahrscheinlich Vieles) Suboptimales im Code?

    Ich habe mir den Code so genau nicht angesehen. Auch wegen der Einrückung.

    Lagere mehr in Funktionen aus. Feld löschen, Schiffe gnerieren/setzen

    Trenne Eingabe von Verarbeitung von Ausgabe.

    Verzichte auf globale Variablen.


Anmelden zum Antworten