grafische Darstellung in DOS-console

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von fat-lobyte » Di Feb 17, 2009 8:41 pm

Xin hat geschrieben:Ich glaube, es gibt eine MS-DOS Version der AA-Lib. (BB-Demo, pure ASCII, Verschmierungen sind Fragmenten durch die Kompression)
Wow, das ist ja der Hammer... :o
Sowas hab ich noch nie gesehen, hätt mir nicht gedacht dass man das in ASCII hinbekommt...
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: grafische Darstellung in DOS-console

Beitrag von cloidnerux » Di Feb 17, 2009 8:49 pm

Ich glaube, es gibt eine MS-DOS Version der AA-Lib. (BB-Demo, pure ASCII, Verschmierungen sind Fragmenten durch die Kompression)
Er soll doch nicht gleich die Matrix Programmieren und die Menscheit ins Unglück stürzen ;)
Zeichenen in der Konsole ist zwar witzig, ist es aber überhaupt sinnvoll?
Soll er doch lieber C lernen und dann mit OpenGL, GTK+ oder SDL anfangen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von Xin » Di Feb 17, 2009 8:56 pm

cloidnerux hat geschrieben:Zeichenen in der Konsole ist zwar witzig, ist es aber überhaupt sinnvoll?
Soll er doch lieber C lernen und dann mit OpenGL, GTK+ oder SDL anfangen.
Zeichnen in der Konsole ist grade zum Lernen sehr sinnvoll, weil man ohne großen Aufwand was sieht.
Die AA-Lib ist dafür aber natürlich trotzdem zu groß.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

darkangel
Beiträge: 17
Registriert: Sa Jan 17, 2009 9:26 pm
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von darkangel » Do Feb 19, 2009 7:02 pm

nufan hat geschrieben: Jetzt zum Problem:
Du erstellt selbst eine Funktion clrscr... diese ist aber schon in conio.h enthalten. Wenn du willst, dass der Bildschirm gelöscht und dann der Cursor auf die jeweilige Position gesetzt wird, musst du einen anderen Namen wählen und darin zuerst clrscr und dann gotoxy verwenden.
Also merke: clrscr ist eine fertige Funktion, du brauchst sie nicht mehr selbst zu schreiben.
Vlt hätte ich hätte ich das berücksichtigen sollen^^..
...naja das ganze Problem bedestand allerdings darin, dass ich einfach zu dumm zum schreiben war..statt - clrscr() - hatte ich in der main funktion lediglich - clrscr - geschrieben.

Aber hatt eigentlich irgendjemand eine Ahnung wie ich mein kleines Problem mit den Farben lösen könnte?
Denn es regt schon irgendwie auf, wenn solch "grundlegende" Befehle nicht funktionieren und man sich sicher ist, dass es bestimmt eine ganz einfache Lösung für alles gibt, jedoch die eigene Sichtweite nicht ausreicht, um diese zu erkennen.^.^

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: grafische Darstellung in DOS-console

Beitrag von nufan » Do Feb 19, 2009 7:19 pm

darkangel hat geschrieben: Aber hatt eigentlich irgendjemand eine Ahnung wie ich mein kleines Problem mit den Farben lösen könnte?
Denn es regt schon irgendwie auf, wenn solch "grundlegende" Befehle nicht funktionieren und man sich sicher ist, dass es bestimmt eine ganz einfache Lösung für alles gibt, jedoch die eigene Sichtweite nicht ausreicht, um diese zu erkennen.^.^
Reicht diene Sichtweite aus um meinen ersten Beitrag in diesem Thread zu lesen? ;)
Ich habe dich bewusst auf dieses Programm verwiesen, da ich weiß, dass es unter verschiedenen Windows-Versionen problemlos funktioniert. Funktioniert es bei dir auch, liegt es an deinem Programm. Tut es das nicht hast du ein anderes Problem.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von fat-lobyte » Do Feb 19, 2009 7:20 pm

darkangel hat geschrieben:Aber hatt eigentlich irgendjemand eine Ahnung wie ich mein kleines Problem mit den Farben lösen könnte?
Denn es regt schon irgendwie auf, wenn solch "grundlegende" Befehle nicht funktionieren und man sich sicher ist, dass es bestimmt eine ganz einfache Lösung für alles gibt, jedoch die eigene Sichtweite nicht ausreicht, um diese zu erkennen.^.^
Das Problem ist, die gibt es eben nicht!
Jedes Betriebssystem ist verschieden, jede Konsole ist verschieden, jeder PC ist verschieden. Weißt du wie viel Aufwand das ist eine paar Farbige Pixel auf den Schirm zu bringen?
Ausgabe und Eingabe sind sehr, SEHR spezifische Dinge, die nichtmal auf dem gleichen Betriebssystem ähnlich ablaufen (gleiche Hardware? gleicher Kernel? gleiche Bibliotheken? Gleiche Programme?)
Eine vermeintlich einfache Funktion wie clsrc() muss einige Probleme bewältigen. Wie krieg ich die Kommandozeile dazu den bildschirm zu löschen? Es muss die Shell steuern (z.B. cmd.exe). Was ist aber wenn die Konsole Zeilenbasiert ist, und die Zeilen sich jetzt nicht mehr Löschen lassen? Man muss ein paar leerzeilen einfügen. Wie viele? Manche Shells (z.B. xterm) lassen sich vergrößern, haben also mehr als 23 Zeilen. Man könnte das Programm fragen wie breit es nun ist, aber das ist wieder für jedes Programm verschieden.

Verstehst du was ich meine? Alles nicht so einfach, bei einer so "einfachen" Funktion.

C und C++ sind hingegen Programmiersprachen, die im Prinzip (!) Plattformübergreifend funktionieren. Deswegen enthält die Standardbibliothek auch nur rudimentäre Ein/Ausgabe Befehle, die auf jedem OS funktionieren sollten.

Ich bitte dich, aber auch alle anderen, die gerade Programmieren lernen:
Finger weg von vermeintlichen einfachen Ein/Ausgabefunktionen wie scanf() oder getch() oder gotoxy() oder sonstwas...
Diese sind nicht Portabel (funktionieren nicht auf jedem System!), oft schwer zu verwenden, sie sind auch sehr undurchsichtig und lassen Platz für viele Fehler (Paradebeispiel scanf() a.k.a. Anfängerschreck)
Um die Probleme, die diese angeblich so "einfachen" Funktionen mit sich ziehen zu beheben oder vorherzusehen, ist viel (sehr viel) programmiererisches Können gefragt!! Das ist nichts für Anfänger.
Und wenn man dann soweit ist, um diese Probleme vorherzusehen ist man aber schon soweit eine funktionierende GUI zu schreiben, mit einer netten Bibliothek wie GTK+ oder wxWidgets.


@ darkangel: Also bitte, überlege dir gründlich ob du deine Farbige konsole mit den Kreisen und Linien wirklich wirklich wirklich unbedingt brauchst.
Vielleicht tuts auch eine nette ASCII grafik, oder ein origineller und kess formattierter Text.
Wenns ein spiel ist (bitte sag mir das das kein Spiel ist...) dann würde ich dir empfehlen mal ein gutes C- Tutorial (unseres zum Beispiel) durchzumachen, und dann gleich ein Tutorial eines GUI Toolkits dranzuhängen, und das Spiel dann damit zu schreiben.

@alle Anderen:
Und langsam wirklich: Ich will das c- Wort nicht mehr hören. Das welches mit onio.h aufhört. Diese bibliothek GIBT ES NICHT. Sie ist gestorben. Schon vor vielen Jahren. Hat ein Grab mit schönem Grabstein, mit ein paar Blumen von seinen Enkeln "WinAPI" und ".NET" drauf. Deswegen bitte ich alle inständig die Grabschänderei zu unterlassen und diesen Dinosaurier in Frieden ruhen zu lassen :!:
Haters gonna hate, potatoes gonna potate.

darkangel
Beiträge: 17
Registriert: Sa Jan 17, 2009 9:26 pm
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von darkangel » Do Feb 19, 2009 8:09 pm

darkangel hat geschrieben:Danke.
Werde ich mir gleich einmal anschauen.
nufan hat geschrieben:
darkangel hat geschrieben:Der Compiler gibt bei der entsprechenden Zeile - is not declared in this scope - an.
Hast du schon meinen Code versucht? Ich hab ihn gerade noch einmal kompiliert. Er funktioniert einwandfrei nur mit stdio.h und conio.h.
Nun ja, bei deinem Code ist das Problem, dass der Compiler, bei der Zeile - clrscr (); - angibt, dass es nicht deklariert sei.
[/code]
Also habe ich offenbar "einanderes Problem"^^
fat-lobyte hat geschrieben:bitte sag mir das das kein Spiel ist...
Zu der Frage wie man die Textfarbe ändern könnte, ich halte es einfach für einen grundlegenden Schritt um in ein textbasierendes Programm mehr Übersichtlichkeit reinzubringen.
Zwar ist es eines meiner Ziele einfache Spiele, grafische Dinge zu programmieren, doch bin ich mir auch vollstens der Tatsache bewusst, dass es zunächst ein seeeeeehr wichtiger und umgänglischer schritt ist, zunächst einmal ein gut fundiertes, grundlegendes Wissen zu erlangen.

Ich habe im Internet dieses Dokument gefunden und hoffte so erst einmal auf einpaar allgemeine Befehle zurückgreifen zu können.
http://waringo.fatalexception.de/Lehre/ ... fehle7.doc
Jedoch meine Versuche einige Befehle (..einfach mal die obersten^^) auszuprobieren, sind "wiedereinmal fehlgeschlagen"^-^.
Zwa weiß ich,dass es bei - cout<<"text" - daran liegt, dass dieses Dokument offenbar unter Vorraussetzung des alten Standards geschrieben wurde (,zumindest wenn ich meinem Tutorial glauben darf,) und ich deswegen
- std::cout<<"text" - schreiben muss, doch liegt der Fehler bei - _settextposition( 10, 40 ) - offenbar woanders.
--->not declared in this scope

Hat jemand eine Ahnung woran das liegen könnte?
PS: Ich habe (,zumindest laut besagtem Dokument,) alles nötige eingebunden (conio..iostream...etc).

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: grafische Darstellung in DOS-console

Beitrag von cloidnerux » Do Feb 19, 2009 8:16 pm

Kannst du uns bitte deinen Quelltext Posten?
Redundanz macht wiederholen unnötig.
quod erat expectandum

darkangel
Beiträge: 17
Registriert: Sa Jan 17, 2009 9:26 pm
Kontaktdaten:

Re: grafische Darstellung in DOS-console

Beitrag von darkangel » Do Feb 19, 2009 9:19 pm

Ursprünglich wollte ich es neben dem Grund für die allgemeine Übersichtlichkeit in der Dos-Box wissen, um ein kleines Minesweaper ähnliches Programm zu programmieren.
Ich bin bis jetzt noch nicht sehr weit gekommen.
Die beiden Probleme sind:
1. - textcolor() -
2. - checkfield - <-- "cannot convert 'bool' to 'bool (*) [40]' for argument '3' to void checkfeld(int...."
Es sollte ursprünglich ein kleines "Projekt" neben den restlichen Übungen werden, doch bin ich mir nun nicht mehr 100% sicher, ob es so das richtige für den Anfang ist.

Code: Alles auswählen

//#include<stdio.h>
#include<windows.h>
#include<iostream.h>
#include<conio.h>
//#include<stdlib.h>

void gotoxy(int xpos, int ypos)
{
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = xpos; scrn.Y = ypos;
    SetConsoleCursorPosition(hOuput,scrn);
}


void clrscr()
{
    int xpos=0,ypos=0;
    for(xpos=0;xpos<=79;++xpos)
    {
        for(ypos=0;ypos<=24;++ypos)
        {
            COORD scrn;
            HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
            scrn.X = xpos; scrn.Y = ypos;
            SetConsoleCursorPosition(hOuput,scrn);
            std::cout<<" ";
        }
    }
    COORD scrn;
    HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
    scrn.X = 0; scrn.Y = 0;
    SetConsoleCursorPosition(hOuput,scrn);
}


void pfeld(int b, int h)
{
    int x=0,y=0,countx=0,county=0;
    for(y=0;y<=(2*h);++y)
    {
        countx=0;
        if(county>1)
        {
            county=0;
        }
        if(county==0)
        {
            for(x=0;x<=(2*b);++x)
            {
                gotoxy(x,y);
                std::cout<<"-";
            }
        }
        if(county==1)
        {
            for(x=0;x<=(2*b);++x)
            {
                gotoxy(x,y);
                if(countx>1)
                {
                    countx=0;
                }
                if(countx==0)
                {
                    std::cout<<"|";
                }
                ++countx;
            }
        }
        ++county;
    }
    gotoxy(0,2*h+1);
}


char numc(int i)
{
    char c;
    c=i;
    return c;
}


void checkfeld(int b, int h, bool feld[15][40])
{
    int x,y,fx,fy;
    for(fx=0;fx<=b;++fx)
    {
        for(fy=0;fy<=h;++fy)
        {
            gotoxy(2*fx,2*fy);
            if(feld[fx][fy]==false)
            {
                textcolor(10);
                std::cout<<numc(69);
            }
            else
            {
                textcolor(5);
                std::cout<<numc(1);
            }
        }
    }
}




int main()
{
    bool proof_endlos;          //proof fuer das gesamte programm
    bool proof_spiel;           //proof fuer das laufende Spiel

    while(proof_endlos!=true)   //legt "endlosschleife" fest -> spiel wird immer wieder wiederholt
    {

        //intro starte / einfuehrungsteil

        bool proof;

        std::cout<<"test_goto"<<std::endl;
        char buffer[5];
        int h,b;
        std::cout<<"Definieren Sie bitte folgende Werte des Feldes:"<<std::endl;
        std::cout<<"Hoehe(min.5,max.10): ";
        std::cin.get(buffer,sizeof(buffer));
        std::cin.ignore();
        h=atoi(buffer);
        if(h>=5&&h<=10)
        {
            proof=true;
        }else
        {
            proof=false;
        }
        while(proof!=true)
        {
            std::cout<<"Der angegebene Wert entspricht nicht den Vorgaben.\nBitte definieren Sie ihn neu."<<std::endl;
            std::cout<<"Hoehe(min.5,max.10): ";
            std::cin.get(buffer,sizeof(buffer));
            std::cin.ignore();
            h=atoi(buffer);
            if(h>=5&&h<=10)
            {
                proof=true;
            }else
            {
                proof=false;
            }
        }
        std::cout<<"Breite(min.5,max.39): ";
        std::cin.get(buffer,sizeof(buffer));
        std::cin.ignore();
        b=atoi(buffer);
        if(b>=5&&b<=39)
        {
            proof=true;
        }else
        {
            proof=false;
        }
        while(proof!=true)
        {
            std::cout<<"Der angegebene Wert entspricht nicht den Vorgaben.\nBitte definieren Sie ihn neu."<<std::endl;
            std::cout<<"Breite(min.5,max.39): ";
            std::cin.get(buffer,sizeof(buffer));
            std::cin.ignore();
            b=atoi(buffer);
            if(b>=5&&b<=39)
            {
                proof=true;
            }else
            {
                proof=false;
            }
        }
        bool feld[b][h];
        int x,y;
        for(x=0;x<=b;++x)
        {
            for(y=0;y<=h;++y)
            {
                feld[x][y]=false;
            }
        }
        //intro beendet

        while(proof_spiel!=true)    //legt "spielschleife" fest -> spiel wird wiederholt/fortgesetzt
        {
            //spiel beginnt

            clrscr();
            pfeld(b,h);
            checkfeld(b,h,feld[b][h]);
            std::cout<<"Feld zum aufdecken?: ";
            getch();
        }

        //spiel endet
    }
    system("Pause");
}



nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: grafische Darstellung in DOS-console

Beitrag von nufan » Do Feb 19, 2009 9:33 pm

darkangel hat geschrieben:
Also habe ich offenbar "einanderes Problem"^^
Das mit clrscr hab ich dir doch letztens schon erklärt, oder? Diese Funktion gibt es bereits (oder besser gesagt gab es einmal), du brauchst sie deshalb nicht selbst schreiben. Das gleiche gilt für gotoxy.

Ein paar allgemeine Hinweise:
Deklarationen solltest du ganz oben in den Funktionen schreiben.
Schluckt dein Compiler die Deklaration des Feldes mit 'b' und 'h'? Versuch mal konstante Werte (z.B. 10, 10) anzunehmen.
"system" sollte man in Programmen möglichst vermeiden. Sie sind langsam und außerdem sehr systemabhängig.

Zu 2. :

Code: Alles auswählen

void checkfeld(int b, int h, bool feld[15][40])

Code: Alles auswählen

        bool feld[b][h];
        int x,y;
        for(x=0;x<=b;++x)
        {
            for(y=0;y<=h;++y)
            {
                feld[x][y]=false;
            }
        }
        //intro beendet

        while(proof_spiel!=true)    //legt "spielschleife" fest -> spiel wird wiederholt/fortgesetzt
        {
            //spiel beginnt

            clrscr();
            pfeld(b,h);
            checkfeld(b,h,feld[b][h]);
            std::cout<<"Feld zum aufdecken?: ";
            getch();
        }

        //spiel endet
    }
    system("Pause");
}

Zu dem Problem mit dem Feld. Du übergibst einen Wert vom Typ bool. In der Funktion erstellst du jedoch wieder ein Feld. Dabei reicht doch eigentlich eine normale Variable. Oder willst du das ganze Feld übergeben?

Antworten