2D array abscannen



  • Hei,

    ich hab folgendes Problem. Ich muss ein 2D Array sozusagen als Spielfeld von einem Schiffe versenken Spiel betrachten und mithilfe einer Funktion, Kontrollieren ob die Boote richtig platziert worden sind, sprich bestimmte Anzahl an Booten mit bestimmten Längen die sich nicht berühren. Meine Idee war es Mit Hilfe von 5 Pointern das Spielfeld einmal Horizontal und einmal Vertikal zu scannen und wenn bestimmte fälle eintreten, eine Meldung rauszugeben.
    Der eine Pointer ist sozusagen der Center, ein weiter Rechts neben den Center (Center+AnzahlanReihen), die anderen Link, Vorne und Hinten.

    BSP:
    Start
    +++++++++++++
    ++++oooo#++++
    ++++++++oo+++
    +++++++++++++ Ende

    Befindet sich der Center [Hier ein #] Vor dem ersten Boot und dem Pointer der Nach Rechts oder Links schaut, sieht ein o. Dann wäre das eine falsche Platzierung und somit ungültig.

    Allerdings Bekomm ich das ums verrecken nicht umgesetzt. Bin noch ein Anfänger und keine Ahnung wie ich mit Pointern in 2D Arrays umgehen soll.

    Hier mein Code bisher:

    #include "stdafx.h"
    #include "Field.h"
    
    const int zeile = 12; //Y-Größe
    const int spalte = 12; //X-Größe
    const int fieldsize = zeile * spalte;
    char field[zeile][spalte];
    
    Field::Field()
    {
    	for (int y = 0; y < zeile; y++) //Zeile für Zeile, ...
    	{
    		for (int x = 0; x < spalte; x++) //Spalte für Spalte, ...
    		{
    			field[y][x] = '+'; //Das 2D-Array mit + füllen.
    		}
    	}
    }
    
    
    Field::~Field()
    {
    }
    
    
    void Field::displayField() //Spielfeld anzeigen lassen
    {
    	cout << setw(5) << right << "A";
    	for (int i = 0; i <= 'L' - 'B'; i++) //Schleife um die erste Zeile mit den Alphabet_koordinaten anzuzeigen
    	{
    		cout << setw(3) << char('B' + i);
    	}
    	cout << endl << endl;
    
    	for (int y = 0; y < zeile; y++) //Schleifen um das Array, Spalte für Spalte, ...
    	{
    		cout << setw(4) << left << y + 1;
    		for (int x = 0; x < spalte; x++) //Zeile für Zeile, ...
    		{
    			cout << setw(3) << left << field[y][x]; //auszugeben.
    		}
    		cout << endl;
    	}
    }
    
    
    void Field::scanData()
    {
    	char meinfeld[zeile][spalte];
    	string Datei;
    	vector<vector<char>> raster;
    	vector<char> row;
    
    	//Name der Datei angeben, die eingelesen werden soll
    	cout << "Dateiname eingeben mit .csv am Ende: ";
    	cin >> Datei;
    	system("cls");
    
    	// ifstream zum einlesen der Datei
    	ifstream Daten;
    	//Einlesen der zuvor eingegebenen Datei
    	Daten.open(Datei, ios::in);
    
    
    	if (!Daten) //Kontrolle ob die Datei geöffnet werden konnte
    	{
    		cout << "Datei konnte nicht geoeffnet werden!" << endl << endl;
    		system("PAUSE");
    	}
    	else
    	{
    		/*
    		for( Definition von Variablen; Abbruchbedingung; Irgendwas das nach jedem Schleifendurchgang passiert)
    		Hier ist die Abbruchbedingung file. Einfach nur file ist praktisch das gleiche wie !file.fail()
    		Es wird abgebrochen, wenn über das Ende der Datei hinausgelesen wird.
    		*/
    		for (ifstream file(Datei); file; )
    		{
    			vector<char> row;
    			for (char c, skip;; )
    			{
    				/*
    				Da wir keine Zeilengröße wissen, müssen wir auf Zeilenumbruch testen.
    				Standardmäßig überließt aber der operator>> Whitespaces (Leerzeichen, Zeilenumbrüche, Tabs...).
    				noskipws sagt, er soll keine Whitespaces überlesen, damit wir auf Zeilenumbruch testen können.
    				Nun wird also zuerst ein Zeichen gelesen (o oder s) und dann das nachfolgende Zeichen (; oder \n).
    				Die Schleife soll abbrechen, wenn beim Einlesen ein Fehler auftrat oder wenn das Zeilenende erreicht ist.
    				Ist das nicht der Fall, wird das eingelesene Zeichen im Array abgespeichert (emplace_back).
    				*/
    				if (file >> c)
    					row.emplace_back(c);
    
    				file >> std::noskipws >> skip;
    				if (!file || skip == '\n')
    					break;
    			}
    			// Nun wurde eine Zeile gelesen und diese wird nun auch abgespeichert.
    			raster.emplace_back(row);
    		}
    	}
    
    	for (int y = 0; y < zeile; y++) //Übertragen des Inhalts vom dynamischen Array ins Spielefeld.
    	{
    		for (int x = 0; x < spalte; x++)
    		{
    			if (raster[y][x] == 'O')
    			{
    				field[y][x] = 'O';
    			}
    		}
    		cout << endl;
    	}
    
    	Daten.close();
    	cout << "Datei erfolgreich eingelesen!" << endl << endl;
    	system("PAUSE");
    	system("cls");
    
    }
    
    void Field::checkField() //Hier bräúchte ich hilfe
    {
    	char* center = &(field[0][0]);
    	char* right = center + 12;
    
    	for (int i = 0; i < fieldsize; i++)
    	{
    
    		center++;
    
    		right = center + 12;
    	}
    	system("PAUSE");
    
    
    }
    


  • Ist das eingelich eine Hausaufgabe oder ein Lernprojekt für dich selbst? Falls zweiters, solltest du dich von deinen C-Bestandteilen trennen und in C++ denken. Und immer, wenn du dann denkst, du brauchst einen Zeiger, dann weißt du schonmal, dass du auf dem Holzweg bist.

    Du solltest dein Projekt mal etwas objektiver betrachten: Ein Schiff hat einen Anfangspunkt, einen Endpunkt, eine Länge und eine Ausrichtung (horizontal oder vertikal). Also leg ich doch erstmal eine struct mit diesen Eigenschaften an.
    Dann habe ich ein Spielfeld. Auf dem Spielfeld kann ich ein Schiff plazieren. Also brauch ich doch eine Funktion platziere_schiff. Dann kann es eine Kollission geben. Also wieder eine Funktion ist_kollission. Und so weiter.



  • @out
    Sozusagen eine Übungsaufgabe, ich studiere Eletrotechnik und unser C++ Prof hat uns lediglich sein Script gegeben mit Aufgaben und nie etwas erklärt oder sonstiges. Jetzt versuch ich mir des irgendwie anzueignen. Mit dem Platzieren der Schiffe hätte ich kein Problem, aber in der Aufgabenstellung steht, dass man die Positionierung der Schiffe durch eine externe Datei vornimmt, ich hab mich ja für eine CSV Datei entschieden. Und bevor das Spiel ja dann losgeht muss kontrolliert werden ob alles ordnungsgemäß platziert wurde. Sprich ein Feld um die Schiffe herum muss frei sein (Auch die Ecken). Ich kann mir nicht vorstellen wie das ohne Zeiger funktionieren soll?

    Gruß,

    Daniel



  • @phatneezy sagte in 2D array abscannen:

    Sozusagen eine Übungsaufgabe, ich studiere Eletrotechnik und unser C++ Prof hat uns lediglich sein Script gegeben mit Aufgaben und nie etwas erklärt oder sonstiges.

    Dann besorg Dir bitte ein gutestm Lehrbuch. Eine Liste findest Du in der Linkliste. mit "irgendwie" wird das nichts.

    @phatneezy sagte in 2D array abscannen:

    Ich kann mir nicht vorstellen wie das ohne Zeiger funktionieren soll?

    Mit Indizes.


Log in to reply