Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Ampel Straßenprojekt programmieren kann jemand helfen???
Hacker1 - Di 16.05.06 11:37
Titel: Ampel Straßenprojekt programmieren kann jemand helfen???
Hallo Leute
Ich bräuchte Hilfe in meinem Ampelprojekt in Delphi ich komme nicht weiter ich weis nicht wie ich anfangen soll
meine schritte:
1.Anfangsposition: jede Ampel ist aus
2.Autoampel ist grün
Fußgängerampel ist rot
3.Ampel springt auf orange kurz danach auf rot
4.Fußgängerampel wird grün
5.Fußgängerampel wird rot
6.Autoampel wird gelb danach auf grün
Dies soll mit der while schleifen funktion passieren habe echt kein plan ich hoffe ich könnt mir helfen
mfg
hacker1
starsurfer - Di 16.05.06 12:31
also:
ich hab keine Ahnung wie du das mit 'while' machen willst, zumal selbst wenns ginge wäre das so schnell das das fürs Auge nicht sichbar wäre UND du würdest den Comp auch noch in ne Endlosschleife schicken....
ich würds so machen:
Was brauch ich für Komponenten?
5x TShape //für die ampellichter
1x TTimer //zumsteuern der abläufe
1x Button // zum an und aus schalten
Was brauch ich an Variablen?
StatusAutoAmpel:array[0..2] of bool;//speichert den wert der Ampel - 3te Stelle:rot, 2te Stelle:gelb, 1te Stelle:Grün - true = an, false =aus
StatusFussgaengerAmpel:integer;//speichert den Wert der Ampel - 2Rot, 1:Grün
Wann leuchtet welches Licht?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Auto |Fußgänger ----------------------- Rot Gelb Grün| Rot Grün aus aus an | an aus aus an aus | an aus an aus aus | aus an an an aus | an aus aus aus an | an aus |
Daraus muss ich jetzt ermitteln welches licht wann an ist,
zB. Fügänger haben nur Grün wenn
Quelltext
1:
| Autoampel Rot AN ist UND Autoampel Gelb AUS |
um keinen Status am anfang zu haben setzt du beim Formcreate einfach alles auf False bzw auf 0 ( auch den Timer ausschalten)
mit den klick auf dem Button startest du den Ampel Vorgang
die "Formeln" für jedes Licht setzt du jetzt im Timer Ereignis um.
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Timer1Timer(Sender: TObject); begin
end; |
und setzt die Werte halt wie sie sein müssen.
Bsp:
Delphi-Quelltext
1: 2: 3: 4:
| if (StatusAutoAmpel[2]=true) and (StatusAutoAmpel[1]=false) then begin fussgaengerAmpel:=1; end; |
hast du die Formeln umgesetzt muss du die TShaps noch nach Status sichtbar bzw unsichtbar machen...
star
DaKirsche - Di 16.05.06 13:05
@starsurfer : wozu gibt es sleep(); ?? Damit wird es langsamer. Dann Application.Processmessages, damit die Änderung angezeigt wird und Klicks abgefragt werden und eine Boolsche Variable zum Beenden der Schleife.
Also ich habe es zwar etwas umständlich gelöst, aber zumindest mit While-Schleife...
Er wiederholt den Vorgang der kompletten Ampelphasen solange, bis der Stop-Button geklickt wurde....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
| procedure FormCreate(Sender: TObject); procedure StartAmpelSimulationClick(Sender: TObject); procedure SetStartWerte(); procedure ColorizeAll(); procedure ColorizeSingle(AmpelLicht: TShape; Farbe : TColor); procedure BeendeSimulationClick(Sender: TObject); private public end;
var Form1: TForm1; stop : boolean; implementation
{$R *.dfm}
procedure TForm1.SetStartWerte(); begin stop := false; ColorizeAll(); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape5, clLime); end;
procedure TForm1.ColorizeAll(); begin ColorizeSingle(Shape1, clSilver); ColorizeSingle(Shape2, clSilver); ColorizeSingle(Shape3, clSilver); ColorizeSingle(Shape4, clSilver); ColorizeSingle(Shape5, clSilver); end;
procedure TForm1.ColorizeSingle(AmpelLicht: TShape; Farbe : TColor); begin AmpelLicht.Brush.Color := Farbe; Application.Processmessages; end;
procedure TForm1.FormCreate(Sender: TObject); begin Shape1.Brush.Color := clsilver; Shape2.Brush.Color := clsilver; Shape3.Brush.Color := clsilver; Shape4.Brush.Color := clsilver; Shape5.Brush.Color := clsilver; end;
procedure TForm1.StartAmpelSimulationClick(Sender: TObject); begin SetStartWerte();
while (not stop) do begin sleep(1000); ColorizeAll(); ColorizeSingle(Shape4, clYellow); ColorizeSingle(Shape1, clRed); sleep(1000); ColorizeAll(); ColorizeSingle(Shape3, clRed); ColorizeSingle(Shape1, clRed); sleep(1000); ColorizeAll(); ColorizeSingle(Shape3, clRed); ColorizeSingle(Shape2, clLime); sleep(1000); ColorizeAll(); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape3, clRed); sleep(1000); ColorizeAll(); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape4, clYellow); sleep(1000); ColorizeAll(); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape5, clLime); sleep(1000); end; ColorizeAll(); end; procedure TForm1.BeendeSimulationClick(Sender: TObject); begin stop := true; end; |
chriss1988 - Di 16.05.06 13:12
und was bedeutet bei dir die einzelnen prozeduren?
Delphi-Quelltext
1: 2: 3:
| procedure ColorizeAll(); procedure SetStartWerte(); procedure ColorizeSingle(AmpelLicht: TShape; Farbe : TColor); |
LLCoolDave - Di 16.05.06 13:16
DaKirsche: Ich würde trotzdem von sleep abraten, da reagiert das Programm gar nicht mehr. Sinnvoller wäre es bis zum verstreichen einer bestimmten immer wieder die neu ankommenden Nachrichten zu verarbeiten, dann reagiert das Programm auch weiterhin, auch wenn die Prozedur solange Pause macht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var lasttickcount: cardinal;
lasttickcount := GetTickCount; while lasttickcount + 100 < GetTickCount do Application.ProcessMessages; |
Da bleibt die Prozedur auch 100ms stehen, aber man kann in der zwischenzeit das Programm trotzdem verschieben, Beenden, Buttons klicken etc.
Sleep ist wie das Bremsen eines Autos mit einem Anker. Es funktioniert zweifelsohne, hat jedoch nicht immer den gewünschten Effekt (es wird wohl entweder die Ankerkette oder ein Teil Karosserie nachgeben), und erscheint bei näherer Betrachtung doch eher unbrauchbar wegen anderer Alternativen.
DaKirsche - Di 16.05.06 13:32
Mit ColorizeAll(); werden alle AmpelLichter auf grau gesetzt.
ColorizeSingle kann man mit den Werten der Shapebezeichnung und eines Farbwertes ein bestimmtes Licht färben (zum "leuchten bringen").
SetStartWerte(); macht quasi beides und setzt damit die Anfangswerte (FAmpel rot AAmel grün).
Nagut, aber wenns so sein soll kann ich es auch insofern übertreiben und sleep(1); 1000mal in einer Schleife wiederholen lassen, dann wird alle 1ms die eingabe abgefragt....
chriss1988 - Di 16.05.06 13:36
jo sorry war mein fehler habs zuspät erkannt
@ DaKirsche
dein code hatte ein paar fehler(die ampel war falsch)
und das mit dem stop geht auch nicht
also hier nochmal der code richtig sosollte die ampel laufen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;
type TForm1 = class(TForm) Shape1: TShape; Shape2: TShape; Shape3: TShape; Shape4: TShape; Shape5: TShape; StartAmpelSimulation: TButton; timer1: TTimer; BeendeSimulation: TButton; procedure FormCreate(Sender: TObject); procedure StartAmpelSimulationClick(Sender: TObject); procedure SetStartWerte(); procedure ColorizeAll(); procedure ColorizeSingle(AmpelLicht: TShape; Farbe : TColor); procedure BeendeSimulationClick(Sender: TObject); private public end;
var Form1: TForm1; stop : boolean; implementation
{$R *.dfm}
procedure TForm1.SetStartWerte(); begin stop := false; ColorizeAll(); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape4, clred); end;
procedure TForm1.ColorizeAll(); begin ColorizeSingle(Shape1, clSilver); ColorizeSingle(Shape2, clSilver); ColorizeSingle(Shape3, clSilver); ColorizeSingle(Shape4, clSilver); ColorizeSingle(Shape5, clSilver); end;
procedure TForm1.ColorizeSingle(AmpelLicht: TShape; Farbe : TColor); begin AmpelLicht.Brush.Color := Farbe; Application.Processmessages; end;
procedure TForm1.FormCreate(Sender: TObject); begin Shape1.Brush.Color := clsilver; Shape2.Brush.Color := clsilver; Shape3.Brush.Color := clsilver; Shape4.Brush.Color := clsilver; Shape5.Brush.Color := clsilver; end;
procedure TForm1.StartAmpelSimulationClick(Sender: TObject); begin SetStartWerte();
while (not stop) do begin
sleep(1000); ColorizeAll(); ColorizeSingle(Shape1, clred); ColorizeSingle(Shape5, clGreen);
sleep(1000); ColorizeAll(); ColorizeSingle(Shape4, clRed); ColorizeSingle(Shape1, clRed);
sleep(1000); ColorizeAll(); ColorizeSingle(Shape1, clred); ColorizeSingle(Shape2, clyellow); ColorizeSingle(Shape4, clRed);
sleep(1000); ColorizeAll(); ColorizeSingle(Shape3, clGreen); ColorizeSingle(Shape4, clRed);
sleep(2000); ColorizeAll(); ColorizeSingle(Shape2, clYellow); ColorizeSingle(Shape4, clRed);
sleep(1000); ColorizeAll(); ColorizeSingle(Shape2, clYellow); ColorizeSingle(Shape1, clRed); ColorizeSingle(Shape4, clRed); end;
end; procedure TForm1.BeendeSimulationClick(Sender: TObject); begin stop := true; end;
end. |
DaKirsche - Di 16.05.06 13:48
nagut, das Einzige, was du jetzt verändert hast ist, dass teilweise 3 Lampen leuchten.....sonst sehe ich nix, was du geändert hast....aber ok....^^
Jetstream - So 21.05.06 11:32
Du kannst dir bei Initialisierung des Programms die Systemzeit merken, und diese dann per Timer alle x Millisekunden mit der aktuellen Zeit vergleichen, ob sich die Ampeln umschalten müssen.
Das ist etwas eleganter als der sleep() Befehl.
Jakob Schöttl - Mo 22.05.06 12:13
In einer While-Schleife kannst du das vielleicht auch lösen mit dem Sleep Befehl.
Sleep(Millisekunden): Hält das Programm die angegebenen millisekunden an.
Nachteil: Man kann das Programm nur mit gewalt und dem Taskmanager beenden, es sei denn, du baust bei jedem Durchgang folgenden Befehl ein.
Application.ProcessMessages: Unterbricht die aktuelle Procedure bzw. funktion und reagiert auf andere Ereignisse für die Anwendung. Da könnte dann die Anwendung geschlossen werden vom Benutzer...
Vielleicht hilfts dir was
Affenkopf - So 29.04.07 20:51
hallo leute, wie kann ich diese ampelprogramm denn mit case Anweisungen schreiben. Ich habs mal so programmiert wies hier steht, dass geht auch, aber mein Lehrer will, dass wir es mit Case Anweisungen machen.
Gruß Affe
Narses - So 29.04.07 23:35
Moin und :welcome: im Forum!
Affenkopf hat folgendes geschrieben: |
wie kann ich diese ampelprogramm denn mit case Anweisungen schreiben. Ich habs mal so programmiert wies hier steht, dass geht auch, aber mein Lehrer will, dass wir es mit Case Anweisungen machen. |
Laut Forumsregeln musst du für eine neue Frage einen neuen Thread erstellen, sonst gibt es hier Chaos, weil man später nix mehr wiederfindet... :? :mahn: ;)
Aber trotzdem hier schonmal der Hinweis: hast du bereits die Suchfunktion verwendet? :arrow:
AMPEL, vielleicht ist ja schon was dabei, was dich weiter bringt. ;)
cu
Narses
hansg - Mo 30.04.07 19:54
Hallo,
habe mal auf die schnelle was gebastelt für eine Ampel.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Shape1: TShape; Shape2: TShape; Shape3: TShape; Button1: TButton; Button2: TButton; procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; z: integer;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject); begin z:=z+1; case z of 3: begin shape1.Brush.Color:=clred; shape2.Brush.Color:=clyellow; end;
4: begin shape1.Brush.Color:=clwhite; shape2.Brush.Color:=clwhite; shape3.Brush.Color:=clgreen; end;
10:begin shape2.Brush.Color:=clyellow; shape3.Brush.Color:=clwhite; end;
14:begin shape1.Brush.Color:=clred; shape2.Brush.Color:=clwhite; end; 17:begin z:=0; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin shape1.Brush.Color:=clred; z:=0; timer1.Enabled:=true; end;
procedure TForm1.Button2Click(Sender: TObject); begin timer1.Enabled:=false; shape1.Brush.Color:=clwhite; shape2.Brush.Color:=clwhite; shape3.Brush.Color:=clwhite; end;
end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!