char Array in 2d und mit freien raum für Wörter ?



  • Hallo ich will ein 2d Feld programmieren, hier der code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	//Karte
    	const int breite = 10;
    	const int hoehe  = 10;
    	int breite2;
    	int hoehe2;
    	char Map[breite][hoehe];
    
    	for(int x = 0; x < 10; x++)
    	{
    		for(int y = 0; y < 10; y++)
    		{
    			Map[x][y] = '.';
    		}
    		cout << endl;
    	}
    
    	//Variablen
    	int Auswahl;
    	bool stopmenue = false;
    
    	while(stopmenue == false)
    	{
    		system("cls");
    		cout << "Aufgabe: 2d Spielfeld mit Funktionen\n--------------------------------\n" << endl
    			 << "1 - Spielfeld anzeigen" << endl
    			 << "2 - Feld besetzen" << endl
    			 << "3 - Felddaten anzeigen" << endl
    			 << "4 - Spielfeld loeschen" << endl
    			 << "5 - Programm beenden" << endl;
    		cout << "Auswahl: ";
    		cin  >> Auswahl;
    		cout << endl;
    
    		switch(Auswahl)
    		{
    		case(1):
    			{
    				//Spielfeld anzeigen
    				for(int x = 0; x < breite; x++)
    				{
    					for(int y = 0; y < hoehe; y++)
    					{
    
    							if(Map[x][y] != '.')
    							{
    								cout << "x";
    							}else{
    							cout << ".";
    							}
    
    					}
    						cout << endl;	
    				}
    
    				cout << endl;
    				system("PAUSE");
    			}break;
    
    		case(2):
    			{
    				//Feld besetzen
    				cout << "X-Achse: ";
    				cin  >> breite2;
    				cout << "\nY-Achse: ";
    				cin  >> hoehe2;
    
    				breite2 -=1;
    				hoehe2 -=1;
    
    				cout << "\nEingabe: ";
    				cin  >> Map[breite2][hoehe2];
    			}break;
    
    		case(3):
    			{
    				//Felddaten anzeigen
    				for(int x = 0; x < 10; x++)
    				{
    					for(int y = 0; y < 10; y++)
    					{
    						cout << "Feld " << x+1 << " " << y+1 << " = " << Map[x][y];
    						cout << endl;
    					}
    				}
    				system("PAUSE");
    			}break;
    
    		case(4):
    			{
    				//Spielfeld loeschen
    				for(int x = 0; x < 10; x++)
    				{
    					for(int y = 0; y < 10; y++)
    					{
    						Map[x][y] = '.';
    					}
    					cout << endl;
    				}
    				system("cls");
    				cout << "Spielfeld wurde erfolgreich geloescht !" << endl;
    				system("PAUSE");
    			}break;
    
    		case(5):
    			{
    				//beenden
    				stopmenue = true;
    			}break;
    
    		default:
    			{
    				//falsche eingabe
    				cout << "Deine eingabe exestiert nicht !" << endl;
    			}
    		}
    	}
    
    	return 0;
    }
    

    Ich will nun aber das ich nicht nur 1 Buchstaben speichern kann sondern ich will Wörter eingeben können, wie kann ich das bewerkstelligen ohne den ganzen Code umzubauen ?



  • Erstmal ein paar Hinweise zu deinem Code:

    int main() 
    { 
        //Karte 
        const int breite = 10; 
        const int hoehe  = 10; 
        int breite2; 
        int hoehe2; 
        char Map[breite][hoehe]; 
    
        for(int x = 0; x < 10; x++) //nimm hier >breite< statt >10<
        { 
            for(int y = 0; y < 10; y++) //nimm hier >hoehe< statt >10<
            { 
                Map[x][y] = '.';  // Die Funktion zum Clearen des Arrays würde ich in ne Funktion auslagern
            } 
            cout << endl; 
        } 
    
        //Variablen 
        int Auswahl; 
        bool stopmenue = false; 
    
        while(stopmenue == false) // !stopmenue, keine Verlgeiche mit true/false
        { 
            system("cls"); 
            cout << "Aufgabe: 2d Spielfeld mit Funktionen\n--------------------------------\n" << endl 
                 << "1 - Spielfeld anzeigen" << endl 
                 << "2 - Feld besetzen" << endl 
                 << "3 - Felddaten anzeigen" << endl 
                 << "4 - Spielfeld loeschen" << endl 
                 << "5 - Programm beenden" << endl; 
            cout << "Auswahl: "; 
            cin  >> Auswahl; 
            cout << endl; 
    
            switch(Auswahl) 
            { 
            case(1): //Runde Klammern und die geschweifen Klammern für den Block würde ich auch weglassen
                { 
                    for(int x = 0; x < breite; x++) 
                    { 
                        for(int y = 0; y < hoehe; y++) 
                        { 
    
                                if(Map[x][y] != '.') // warum nicht einfach cout << Map[x][y] ?
                                { 
                                    cout << "x"; 
                                }else{ 
                                cout << "."; 
                                } 
    
                        } 
                            cout << endl;   
                    } 
    
                    cout << endl; 
                    system("PAUSE"); //Pause wirklich nötig ? cin blockt doch sowieso
                }break; 
    
            case(2): 
                { 
                    cout << "X-Achse: "; 
                    cin  >> breite2; 
                    cout << "\nY-Achse: "; 
                    cin  >> hoehe2; 
    
                    breite2 -=1; //lass die zwei Zeilen weg...
                    hoehe2 -=1;  // 
    
                    cout << "\nEingabe: "; 
                    cin  >> Map[breite2][hoehe2]; // ...und pack das -1 heir rein
                }break; 
    
            case(3): //Ist "Felddaten anzeigen" wirklich nötig wenn man das Feld doch sowieso sieht ?
                { 
                    for(int x = 0; x < 10; x++) //nimm hier >breite< statt >10<
                    { 
                        for(int y = 0; y < 10; y++)  //nimm hier >hoehe< statt >10<
                        { 
                            cout << "Feld " << x+1 << " " << y+1 << " = " << Map[x][y]; 
                            cout << endl; 
                        } 
                    } 
                    system("PAUSE");
                }break; 
    
            case(4): 
                { 
                    for(int x = 0; x < 10; x++) //nimm hier >breite< statt >10<
                    { 
                        for(int y = 0; y < 10; y++)  //nimm hier >hoehe< statt >10<
                        { 
                            Map[x][y] = '.'; 
                        } 
                        cout << endl; 
                    } 
                    system("cls"); 
                    cout << "Spielfeld wurde erfolgreich geloescht !" << endl; 
                    system("PAUSE"); 
                }break; 
    
            case(5): 
                { 
                    stopmenue = true; 
                }break; 
    
            default: 
                { 
                    cout << "Deine eingabe exestiert nicht !" << endl; 
                } 
            } 
        } 
    
        return 0; 
    }
    

    Außerdem bist du heir nicht bei C++/CLI.

    wie kann ich das bewerkstelligen ohne den ganzen Code umzubauen

    Gar nicht ? Natürlich musst du den Code umschreiben.
    z.B.

    char Map[breite][hoehe][MaxChars];
    

    Aber anpassen musst du den Code ja trotzdem.
    Ein normales 2d Spielfeld leuchtet mir ja noch ein, aber warum Wörter (mit vermutlich unterschiedlicher Länge) ? Wie willst du das denn ausgeben ohne dass es sich verschiebt ?



  • Du sprichst eher Kosmetische Stellen an, die ich erstmals nicht vertiefen möchte.

    // Die Funktion zum Clearen des Arrays würde ich in ne Funktion auslagern
    Dieser Bereich dient dazu das Feld zu beschriften um keine leeren Textzeilen auslesen zu können.

    //Pause wirklich nötig ? cin blockt doch sowieso
    Das man das Feld mit der Funktion "Anzeigen" auch sehen kann 🤡

    // warum nicht einfach cout << Map[x][y] ?
    Weil es dann das beschriftete Feld doppelt anzeigt.

    Gar nicht ? Natürlich musst du den Code umschreiben.
    Dann werde ich ihn wohl oder übel umschreiben müssen ...

    char Map[breite][hoehe][MaxChars];
    Funktioniert leider nicht, das char Array kann trozdem nur 1 Buchstabe aufnehmen.

    Ich schreibe nun den Kompleten Code neu und verwende eine Struktur um das Feld zugleich mit einem bool Schalter auf besetzt oder frei zu stellen & auch ein Array für die Namen zu schreiben.

    Deine Methode mit (!BoolVariable) finde ich sehr kompfortabel und ich werde es mir merken, vielen dank 🙂



  • Du hast mit map[width][height] einen * auf einen Pointer welcher wiederum auf ein char zeigt, was du aber brauchst ist ein Pointer, welcher auf einen Pointer der auf einen Pointer zeigt:

    char map[width][height][length];
    

    length ist dann die maximale länge deines Wortes.


Anmelden zum Antworten