Ampel



  • 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.



  • ok danke 😉
    ich werd mir da wieder was zurecht basteln ^^

    hoffe das ist jetzt mein letztes problem 😃

    nochmals danke f.-th und dir anderen (vielleicht hats dir ja bisschen spass gemacht xD)

    mfg ExEcUt!oNeR



  • erinnert mich an meine Anfänge mit grafischen Oberflächen 🕶

    An meinem letzten Quelltext geht noch was zu feilen 👍

    Aber du sollst das ja eh noch ein wenig anders lösen.

    Hab das nicht getestet, aber ich denke auf Wunsch sind auch andere Schriften, also grösser oder bunt möglich.

    MfG f.-th.



  • so hab es rein bekommen 😉 hab rechtslick option gemacht 😉
    rechtsklick macht jetzt abbruch links wiederholt 😉
    (weiss nichtmal ob ich das machen sollte =D)

    aber damit ist das hier abgeschlossen 😃

    ich danke euch nochmal alle die mir tipps/geholfen haben!!!

    mfg ExEcUt!oNeR

    Edit: -.- jetzt ist mir wieder was aufgefallen...

    wenn ich druecke er den ablauf auch schon macht kann ich nochmal raufklicken und er macht dann direkt noch einen durchlauf wenn der erste durch ist(oder mit rechts brichts eben direkt ab). wie bekomm ich das hin das erst dann wieder klicken kann wenn er durchgelaufen ist?



  • Habt ihr eigentlich die Ampel an?



  • Dann kombinierst du halt die Mausabfrage mit den Farben der Ampel. Das ist eine Möglichkeit. Die andere lässt erst dann wieder eine Mausabfrage nach einem abgeschlossenem Zyklus zu.

    MfG f.-th.



  • f.-th. schrieb:

    Die andere lässt erst dann wieder eine Mausabfrage nach einem abgeschlossenem Zyklus zu.

    Das andere kann ich nicht machen weil wir den knopf haben muessen.
    ich kann mir darunter nichts vorstellen mit abgeschlossenem zyklus.
    und google schmeisst mir dafuer auch nichts raus :o.
    bei dir hast du es ja ueber farben gemacht, aber wie mach ich das jetzt das er erst nach durchlauf naechste mausabfrage macht?

    und was meinst du mit "Habt ihr eigentlich die Ampel an? "???



  • Am einfachsten kann ich das wahrscheinlich an deinem Quelltext zeigen, wenn du den zeigen möchtest. Eventuell reicht die Schleife: do -while als Codeausschnitt.

    MfG f.-th.



  • wieder raus genommen...

    so sieht der jetzt aus 😉 denke mal ist auch noch nicht perfekt, hab ich schon gesehen bei dir wegegn 3 mal void lechte ^^ aber es geht :).


Anmelden zum Antworten