Ampel



  • ja wenn ich drauf druecke aufm den knopf soll es wie ne ampel laufen, die haben sollen dann lightred oder sowas werden.
    gibt ja amplen da sieht man die farbe bisschen, wie gesagt kann ich aber noch rausnehmen. mein quelltext ist bis jetzt nur die grafik das ist das einzige was ich hinbekomme ;I die ganze funktionen bin ich noch garnicht zu gekommen.

    Bei einem Mausklick auf dem Knopf ('Knpofdruck') soll unten im Fenster der Text 'Signal kommt' erscheinen

    Die Ampel ist Standardmäßig grün

    Nach erfolgten Knopfdruck soll die Ampel nach einer zufälligen Zeit (1 bis 15 Sekunden) für drei Sekunden auf gelb, dann auf rot springen

    Nach einer halbminütigen Rotphase geht die Ampel für eine Sekunde in die Rot/Gelbphase, danach in die Grünphase

    Zu Beginn der Gelbphase wird der Text 'Signal kommt' wieder gelöscht

    so das kommt noch dazu ;/



  • Die Infos, die ich noch weggelassen hab bekommst du schon hin 😃

    Muss gestehen das ich zu bequem bin das mit den Farben zu testen - Borland konnte nur 16 Farben bei 640x480 serienmässig.
    Teste das Ersetzen der Farbentexte mal mit Zahlen zwischen 0 und 255 ( oder höher ? ).
    Kannst ja eine Farbtafel programmieren, wenn sehen möchtest was bei Farben geht.

    Viel Spass noch
    f.-th.



  • da hoert der spass schon wieder auf 😞

    hab deins jetzt mit drin kommt :`dgray_clicked' undeclared (first use this function)
    -.-

    hab wieder schon gesucht kann ich aber nichts wirklich mit anfangen. naja dann wollte ich deine box ausprobieren. nehm mein kaestchen raus und will deins benutzen ist deins gruen statt darkgray... Wenn ich, wo die anderen farben stehen, ne farbe wegneheme wird mein ganzer rand rot gelb oder gruen, wenn ich alles raus nehme ist alle auf einmal weiss.

    ich dachte ich hab wenigstens die farben hinbekommen -.- scheint aber auch nichts zu passen.

    will dich damit ja nicht nerven aber so macht das echt kein spass-.- :(((

    mfg ExEcUt!oNeR



  • So schwer ist das aber nicht, da steht doch, es fehlen:

    int x, y;        // x and y pixel coordinates of a mouse click
        bool dgray_clicked;// Changes to true when a darkgray pixel is clicked
    

    Wenn du mehrere gleichfarbige Felder hast, halt zusätzlich die Koordinaten abfragen und da ein paar nebeneinander gleichzeitig 😃 Denn ob man zuverlässig ein einzelnes Pixel trifft?

    Beim Darstellen einer Leuchte, überlege mal ob du das nicht in eine Funktion bekommst, dann wird der Quelltext übersichtlicher.

    MfG f.-th.



  • 😉 so einfach ist das nicht 😛

    woher weiss ich das ich bool hinschreiben muss? -.-

    naja also soweit klappt es dass er sich beschwert, aber ich hab noch das problem mit den farben.

    wenn ich das kaestchen nach unten schreiben nimmt es die farbe von der letzte ampelfarbe an, erst gruen wenn ich das wegnehme orange und dann rot, wenn ich alles raus nehme seh ich nichts mehr.

    wenn ich es nach oben setzte ueber die ampelfarben dann wird es nur weiss egal welche farbe ich reinschreiben, nichmal schwarz will das scheiss ding werden.

    dann habe ich ueberall WHITE rein geschrieben da das feld ja eh weiss ist, hat aber nichts gebracht. hab auch noch else hingeschrieben, weil ich wollte das er schreibt das ich vorbei gedrueckt haben, aber sobald ich das programm starte hat er gleich "daneben" gesagt 😞
    dir x und y habe ich werte im weissen kasten genommen das sollte ja auch so richtig sein. wenn ich den knopf druecke hab ich ja noch dazu geschrieben muesste "Signal kommt" kommen. das kommt aber auch nicht.
    hat aber alles kein erfolg.

    // dunkelgrauer Knopf
    bar( 110, 459, 140, 490 );
    setfillstyle(1, WHITE);
    while (!dgray_clicked);
    {
    if (ismouseclick(WM_LBUTTONDOWN)) <---glaube da darf kein ; stehen wie du es geschrieben hast ^^ dann hat er keine abfrage gemacht. (glaube ich)
    {
    getmouseclick(WM_LBUTTONDOWN, x, y);
    dgray_clicked = (getpixel(123, 474) == WHITE);
    outtextxy(10,467,"Signal kommt");
    }
    }

    was du da bei den farben meinst weis ich nicht so recht habe jetzt ueberall das midx und midy raus genommen das ist dann ja doppelt, wenn ich aber setcolor wegnehme bleibt um rand ein weisser kreis 😞 muss also bleiben.

    /* midx = getmaxx() / 2 + 2;
    midy = getmaxy() / 6 + 5; */
    setcolor(RED);
    setfillstyle(1, RED);
    fillellipse(76, 88, 50, 50);
    //circle(midx, midy, radius);

    -.- ist mir echt schon peinlich 😕

    mfg ExEcUt!oNeR



  • weis nicht ob es was zu sagen hat, aber da stimmt glaube noch mehr nicht...
    wenn ich das auf mein laptop ziehe und daran arbeiten will ist kein kreis mehr da. -.- selbst wenn ich das alles zurueck mache was ich raus ge/* habe.

    bloedes programm 😕

    mfg ExEcUt!oNeR



  • Hier mal der Farbtest:

    #include <cstdlib>
    #include <iostream>
    
    #include <graphics.h>
    
    using namespace std;
    
    void leuchte(int posv, int posh, int lcolor)
    {
    	int hpos;
    	hpos = 20 + posh * 20;
    //    setcolor(lcolor);
        setfillstyle(1, lcolor);
        fillellipse(posv, hpos, 9, 9);
    
    }
    
    int main(int argc, char *argv[])
    
    {
        int gdriver = DETECT, gmode, errorcode;
        int i, p;
        int x, y;        // x and y pixel coordinates of a mouse click
        bool dgray_clicked;// Changes to true when a red pixel is clicked
    
    //Grafikfenster grösse 150x500
        initwindow(150, 500);
    
    //Linien im Grafikfenster für die Ampel
        line(140, 10, getmaxx()-9, getmaxy()-50);
        line(9, 10, getmaxx()-140, getmaxy()-50);
        line(9, 10, getmaxx()-9, getmaxy()-489);
        line(9, 449, getmaxx()-9, getmaxy()-50);
        outtextxy(10,460,"Farbtest");
    
    //read result of initialization
        errorcode = graphresult();
        if (errorcode != grOk) //Wenn ein Fehler Auftritt
        {
            printf("Graphics error: %s\n", grapherrormsg(errorcode));
            printf("Press any key to halt:");
            getch();
            exit(1); //Mit einen Fehlercode beenden
        }
    
    	for(i = 0; i < 20; i++)
    		leuchte( 50, i, i);
    
    // dunkelgrauer Knopf
        setfillstyle(1, DARKGRAY);
    	bar( 120, 460, 140, 490 );
        while (!dgray_clicked)
        {
    		if (ismouseclick(WM_LBUTTONDOWN))
    		{
    	    	getmouseclick(WM_LBUTTONDOWN, x, y);
    	    	dgray_clicked = (getpixel(x, y) == DARKGRAY);
    		}
    	   }
    
    // um folgendes zu starten -> Maus auf grauen Button klicken und anschliessend
    // Taste der Tastatur drücken solange sich Farbe ändert.
    	for(p = 0; p < 8000; p++)
    	{
    		getch();
    		for(i = 0; i < 20; i++)
    			leuchte( 80, i, p * 16 + i); // -> eventuell andere Werte als 16 testen
    	}
    
    //Grafikfenster und Konsole schliessen
        getch();
        closegraph();
    //system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Bedienung im Quelltext beschrieben.

    Erst sieht es so aus als ob nur 16 Farben da wären.
    Wenn ihr aber nach dem Mausklick auf den grauen Button, entweder die Tastatur quält oder einfach den Finger auf der Taste parkt, seht ihr das noch andere Farben möglich sind. Nur die Logik hab ich ( noch ) nicht 🤡

    Warum das bei dir auf dem Laptop anders aussieht? Keine Ahnung.

    MfG f.-th.



  • ok das ist schonmal super ^^ ich werde mir da mal was zusammen basteln 😉
    echt besten dank fuer die ganze hilfe 😉
    ^^ denke morgen abend hab ich wieder was fuer dich xDDDDDDDDDDDDDD.
    melde mich wie es laeuft 😉

    mfg ExEcUt!oNeR



  • quelltext wieder entfernt ;I

    ich hab mir das da jetzt so zusammen gebastelt 😉
    klappt auch soweit alles. =DDD (so macht das auch spass)

    1. jetzt wuerde ich das aber gerne so machen, dass wenn es abgelaufen ist wieder von vorne starten kann, weil jetzt kann ich nichts mehr machen ausser beenden und neustarten.

    2. wenn ich den knopf drueck und dann enter im programm ablauf macht es auch noch bis zum ende weiter aber schliesst es dann sofort. kann man das irgendwie unterbinden? das man in derzeit wo das programm laeuft kein enter druecken kann?
    erst nach ablauf des programms.

    zum programm, weis nicht ob das so gut ist, denke mal da kann man noch viel anderes machen, besonders das mit den kreisen?! da hab ich ja jetzt 3 mal void gemacht. 😢

    und nochmal ein riesen dank an dich f.-th 😃

    mfg ExEcUt!oNeR



  • 1. Du könntest eine do-while-schleife verwenden.
    2. Eventuell system("pause") oder mit STRG-F5 debuggen, anstelle von getch().



  • also das mit der system("pause"); klappt 😉
    die do-while-schleife O.o weiss ich noch nicht so ganz wie ich die da rein bekomm.
    irgendwie funzt das alles nicht, da beendet er sofort mein programm =(.

    mfg ExEcUt!oNeR



  • Wie sieht denn deine Schleife bisher aus, was ist die Abbruchbedingung für die Schleife?



  • 😢 es gibt eigentlich keine abbruchbedingung, nur wenn durchgelaufen ist und ich enter druecke soll es programm ausgehen, sonst will ich noch einmal draufdruecken :I.

    (Bleibt nurnoch das obere als problem)

    srand((unsigned)time(NULL));          //Der Zufallszahlgenerator wird vorbereitet
    int DELAY1 = rand()%15000+1000;       //Zeitverzoegerung von 1 - 15 sekunden
    

    hier ist mir auch noch was aufgefallen, eigentlich sollte das ja so richtig sein, aber anscheind haut der mir immer den gleichen wert raus 😢
    hab so bisschen rumgelesen, da steht ueberall dass das normal ist O.o.
    stimmt das?

    Edit:
    hab jetzt noch weiter gemacht und es sind immer andere zeiten, aber wenn ich 20 in folge druecke ist es immer der gleiche wert, scheint sich nach einer gewissen zeit zu aendern. :o



  • du solltest das srand nur ein einzieges am anfang in deienm code aufrufen. dann müsste es klappen 🙂

    EDIT:
    ist ja auch klar das sich die werte immer etwas verändern, da du das srand mit der zeit initialisiert(ist das das richtige wort??)



  • ich hab immernoch ein problem mit meiner wiederholung :I
    wollte das jetzt so machen wenn man enter drueck bricht es ab und wenn man den knopf nochmal betaetigt gehts weiter.
    das andere problem ist das er einfach immer wieder von vorne anfaengt aber ohne knopf druecken ;I weiss nicht was da los ist...

    mfg ExEcUt!oNeR



  • das musst du in die bedingung einer/der while schleife setzten
    kannst du mal bitte den code zeigen?



  • erstmal wieder weg gemacht...

    so ist der ursprung wo es rein soll, aber wie gesagt kann ich dann kein 2tes mal druecken der laeuft immer durch. aber das koennte vielleicht am 2ten while dann liegen weis es aber nicht.

    mfg ExEcUt!oNeR



  • Meinst du das Programm endet, nachdem du einmal erfolgreich gedrückt hast? Wenn ja, ist das logisch, weil du keine Schleife hast die dich wieder vor die drücken-schleife setzt.



  • ja das ist das programm wo die schleife rein soll, so laeuft es einmal durch und dann ist ende, ich bekomm dann nur keine gescheite schleife rein, er hoert dann nie auf... macht ein nach dem anderen mal die ampel durch. hab immer ueber der ersten while schleife noch eine gemacht da muesste es ja richtig sein.



  • Okay, hier mal ein Quelltext, der nicht ganz zu deiner Aufgabe passt:

    #include <cstdlib>
    #include <iostream>
    
    #include <graphics.h>
    
    using namespace std;
    
    void leuchte(int pos, int lcolor)
    {
        int hpos;
        hpos = 88 + pos * 140;
        setcolor(lcolor);
        setfillstyle(1, lcolor);
        fillellipse(76, hpos, 49, 49);
    }
    
    int main(int argc, char *argv[])
    {
        int gdriver = DETECT, gmode, errorcode;  // gdriver, gmode <- only old Borland?
    
        int x, y;        // x and y pixel coordinates of a mouse click
        bool green_clicked; // Changes to true when a green pixel is clicked
        bool red_clicked = 0; // Changes to true when a red pixel is clicked
    
    //Grafikfenster grösse 150x500
        initwindow(150, 500);
    
    //Linien im Grafikfenster für die Ampel
        line(140, 10, getmaxx()-9, getmaxy()-50);
        line(9, 10, getmaxx()-140, getmaxy()-50);
        line(9, 10, getmaxx()-9, getmaxy()-489);
        line(9, 449, getmaxx()-9, getmaxy()-50);
        outtextxy(10,467,"Signal kommt");
    
    //read result of initialization
        errorcode = graphresult();
        if (errorcode != grOk) // Wenn ein Fehler Auftritt
        {
            printf("Graphics error: %s\n", grapherrormsg(errorcode));
            printf("Press any key to halt:");
            getch();
            exit(1); //Mit einen Fehlercode beenden
        }
    //Kreis 1 im Grafikfenster für Ampel
        leuchte( 0, RED);
    
    //Kreis 2 im Grafikfenster für Ampel
        leuchte( 1, YELLOW);
    
    //Kreis 3 im Grafikfenster für Ampel
        leuchte( 2, GREEN);
    
        do
        {
            if (ismouseclick(WM_LBUTTONDOWN))   // grün anforden
            {
                getmouseclick(WM_LBUTTONDOWN, x, y);
                green_clicked = (getpixel(x, y) == GREEN); // wenn rot dann auf Position des grünen Mausklicken
                red_clicked = (getpixel(x, y) == BROWN);   // gelb-aus -> Programm beenden
            }
    
            if(green_clicked)
            {
                green_clicked=0;
                leuchte( 1, BROWN);
                Sleep(1000);
                leuchte( 0, 250);
                Sleep(1000);
                leuchte( 1, YELLOW);
                Sleep(2000);
                leuchte( 0, RED);
                leuchte( 1, BROWN);
                leuchte( 2, LIGHTGREEN);
                Sleep(10000);
    
                leuchte( 2, GREEN);
                leuchte( 1, YELLOW);
                Sleep(2000);
                leuchte( 1, BROWN);
                leuchte( 0, 250);
            }
        }
        while(!red_clicked);
    
        cout << "The mouse was clicked at: "; // check the mouse ;)
        cout << "x=" << mousex( );
        cout << " y=" << mousey( ) << endl;
    
    //Grafikfenster und Konsole schliessen
        closegraph();
    
        return EXIT_SUCCESS;
    }
    

    Starten -> warten -> wenn sie wieder rot ist, auf dem grünen Feld klick oder auf dem gelben/braunen, wenn es nicht leuchtet zum beenden klick.

    verzögern: nimm ruhig delay

    Der Quelltext ist nicht zum 1:1 zum kopieren, es sein denn ihr wollt nicht die volle Punktzahl 😃 🤡 🕶

    Und es geht ohne getch() oder system(bla) und ähnliche Krücken 😉

    MfG f.-th.


Anmelden zum Antworten