Rechteck zeichnen
-
Hallo,
nachdem das zeichnen eines Rechtecks mit "Füllung" kein Problem mehr ist, wollte ich ein Rechteck zeichnen, wo nur die Außengrenzen gezeichnet werden und nichts dort drin, also dass der Eindruck entsteht, als wär das ein Raum.
Aus irgendeinem Grund hat das geklappt, aber ich bin mir sicher, dass es eine elegantere Methode geben muss, beispielsweise mit zweidimensionalen Arrays. Dummerweise steig ich da aber von vorne bis hinten nicht durch... hier aber erst mal der Quelltext:
#include <iostream> using namespace std; void drawField (); // Prototyp int main () // Hauptprogramm { int Auswahl; // Variablen while (Auswahl !=3) // Menue { system("cls"); cout << "ZeichneRechteck\n\n" << endl; cout << "Hauptmenue\n"; cout << "----------\n"; cout << "1. Spiel starten\n"; cout << "2. Optionen\n"; cout << "3. Spiel beenden\n\n"; cin >> Auswahl; if (Auswahl == 1) drawField (); else if (Auswahl == 2) cout << "> Optionen < " << endl; else if (Auswahl == 3) cout << "\n> Spiel wurde beendet <\n\n" << endl; else cout << "> Falsche Eingabe <" << endl; } return 0; } void drawField () // Funktion: Feld zeichnen { // Mach frei den Bildschirm system("cls"); // Variablen char cFrage; int Breite1 = 25; int Hoehe1 = 1; int Breite2 = 25; int Hoehe2 = 1; int MidPart = 5; for (int y=0; y<Hoehe1; y++) { for (int x=0; x<Breite1; x++) { cout << "o"; } cout << endl; } for (int z=0; z<MidPart; z++) { cout << "o\t\t\to"; cout << endl; } for (int i=0; i<Hoehe2; i++) { for (int j=0; j<Breite2; j++) { cout << "o"; } cout << endl; } // Sicherheitsabfrage (erzwungene Pause) cout << "\n\n"; cout << "Alles OK? J/N" << endl; cin >> cFrage; if ((cFrage == 'n') || (cFrage == 'N')) drawField (); else cout << "...OK, kehre zurueck." << endl; }
Hat jemand Vorschläge? Ich bin absoluter Neuling auf diesem Gebiet, um ausführlichere Erklärungen wäre ich deswegen sehr dankbar.
-
Hier haste eine Funktion zum dynamischen Zeichnen von Rechtecken mit einem beliebigen Rahmen:
#include <iostream> using namespace std; void DrawRect( int nHeight, int nWidth, char cBorder ); int main() { int Auswahl = 0; // Variablen while( Auswahl != 3 ) // Menue { system("cls"); cout << "ZeichneRechteck\n\n" << endl; cout << "Hauptmenue\n"; cout << "----------\n"; cout << "1. Spiel starten\n"; cout << "2. Optionen\n"; cout << "3. Spiel beenden\n\n"; cin >> Auswahl; switch( Auswahl ) { case 1: // Rechteck zeichnen DrawRect( 7, 25, 'x' ); break; case 2: cout << "> Optionen < " << endl; break; case 3: cout << "\n> Spiel wurde beendet <\n\n" << endl; break; default: cout << "> Falsche Eingabe <" << endl; } } return 0; } // Rechteck mit der Höhe nHeight, Breite nWidth und Rahmen cBorder void DrawRect( int nHeight, int nWidth, char cBorder ) { for( int y = 0; y < nHeight; ++y ) { // erste und letzte Zeile if( y == 0 || y == nHeight - 1 ) { for( int x = 0; x < nWidth; ++x ) cout << cBorder; } else // die mittleren Zeilen { // linker Rand cout << cBorder; // Mitte mit Leerzeichen auffüllen for( int space = 0; space < nWidth - 2; ++space ) cout << " "; // rechter Rand cout << cBorder; } cout << endl; } // die Pause getch(); }
Man hätte auch ein 2D-Array füllen und es dann ausgeben können...
-
Hey, danke, ich sehs mir gleich mal im Detail an.
Mit 2D-Arrays hab ich das auch schon versucht zu lösen, aber bleib - wie immer - am Mathe-Zeugs hängen:
#include <iostream> using namespace std; struct S_FeldInfo { bool ShouldBeEmpty; bool Spieler1; }; const int Breite = 25; const int Hoehe = 10; S_FeldInfo Spielfeld[Breite] [Hoehe]; /* Prototypen */ void drawField (); void WhatNext (); void MapHoch (); void MapRunter (); void MapLinks (); void MapRechts (); /* Hauptprogramm */ int main () { int Auswahl; while (Auswahl !=3) { system("cls"); cout << "Hauptmenue\n"; cout << "----------\n"; cout << "1. Spiel starten\n"; cout << "2. Optionen\n"; cout << "3. Spiel beenden\n\n"; cin >> Auswahl; if (Auswahl == 1) drawField (); else if (Auswahl == 2) cout << "> Optionen < " << endl; else if (Auswahl == 3) cout << "\n> Spiel wurde beendet <\n\n" << endl; else cout << "> Falsche Eingabe <" << endl; } return 0; } /* Funktion: Feld zeichnen */ void drawField () { system("cls"); // Rechteck zeichnen /* while (HoeheBesetzt != 1) { HoeheBesetzt--; Spielfeld[HoeheBesetzt] [1].Besetzt = true; }; */ Spielfeld[5] [5].Spieler1 = true; // Rechteck ausgeben for (int y=0; y<Hoehe; y++) { for (int x=0; x<Breite; x++) { if (Spielfeld[x] [y].Spieler1 == true) cout << "X"; else cout << "."; } cout << endl; } WhatNext (); } void WhatNext () { char cFrage; cout << "\n\n"; cout << "Wie solls nun weitergehen?" << endl; cout << "\n"; cout << "(h)och,...?"; cin >> cFrage; switch (cFrage) { case ('h'): { MapHoch(); break; } default: WhatNext (); } } /* Karte hoch */ void MapHoch () { system("cls"); for (int y=0; y<Hoehe; y++) { for (int x=0; x<Breite; x++) { if (Spielfeld[x] [y+1].Spieler1 == true) cout << "X"; else cout << "."; } cout << endl; } WhatNext (); }
Das mit dem Parametern in Funktionen durch die Gegend hab ich noch nicht so ganz verstanden, bzw. will das nicht klar werden, deswegen verzichte ich da vorerst drauf.