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.