Ampel
-
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 sekundenhier 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 :).
-
Ich bin jetzt ein wenig ratlos. Die Maus wird doch erst wieder ausgewertet, wenn der Zyklus, also, von grün über rot und wieder zu grün, beendet ist

folgenden Codeabschnitt lass besser in deinem Quellcode:
//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 }Der prüft schon mal ob die Grafikbibliothek eingebunden wird.
Die Kommentare in Zeile 36 + 37 halte ich für nicht richtig. Überlege noch mal was da besser hin kommt.
i + p brauchst du gar nicht -> setze statt i -> d = Dummy , wenn du die Leuchten so ansteuern möchtest.Was hältst du hiervon:
while(!dunkelgrau_klicken1); // Dunkelgrauer Knopf wurde mit Rechtsklick bestaetigt -> do-while-endeNur so eine Idee:
Vielleicht noch "Signal anfordern" ergänzen - wenn du links klickst, dann "Signal kommt" - eventuell dann schwarz oder "Signal anfordern"MfG f.-th.