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.


Anmelden zum Antworten