Hi,
kennt sich jemand mit dem Programm Borland Delphi aus?
Ich bin dabei ne Straßenkreuzung mit Ampelsystem zu programmieren mit zur Zeit 4 Autos. Ich hab ein Problem beim automatischen Umschalten der Ampeln... kann mir da jemand helfen?
Hi,
kennt sich jemand mit dem Programm Borland Delphi aus?
Ich bin dabei ne Straßenkreuzung mit Ampelsystem zu programmieren mit zur Zeit 4 Autos. Ich hab ein Problem beim automatischen Umschalten der Ampeln... kann mir da jemand helfen?
hm, wie wärs, wenn du uns den quelltext zugänglich machst?
program Verwaltung;
uses
mSuM, mUhr,
mTAuto in 'mTAuto.pas',
mTAmpel in 'mTAmpel.pas';
var
meinStift: Stift;
derBildschirm : Bildschirm;
dieTastatur : Tastatur;
dieUhr : Uhr;
Ampel1 : TAmpel;
Ampel2 : TAmpel;
Ampel3 : TAmpel;
Ampel4 : TAmpel;
Auto1 : TAuto;
Auto2 : TAuto;
Auto3 : TAuto;
Auto4 : TAuto;
begin
{----- Objekte erzeugen und initialisieren ----- }
derBildschirm := Bildschirm.init;
meinstift :=stift.init;
dieTastatur := Tastatur.init;
dieUhr := Uhr.init;
Ampel1 := TAmpel.init;
Ampel2 := TAmpel.init;
Ampel3 := TAmpel.init;
Ampel4 := TAmpel.init;
Auto1 := TAuto.init;
Auto2 := TAuto.init;
Auto3 := TAuto.init;
Auto4 := TAuto.init;
{----- Hauptstraße -----}
meinStift.hoch;
meinStift.bewegeBis(0,280);
meinStift.runter;
meinStift.bewegeUm(450);
meinStift.hoch;
meinStift.bewegeUm(150);
meinStift.runter;
meinStift.bewegeUm(624);
meinStift.hoch;
meinStift.bewegeBis(0,430);
meinStift.runter;
meinStift.bewegeUm(450);
meinStift.hoch;
meinStift.bewegeUm(150);
meinStift.runter;
meinStift.bewegeUm(624);
meinStift.hoch;
meinStift.bewegeBis(0,355);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(150);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
{----- Seitenstraße -----}
meinStift.bewegeBis(450,280);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.runter;
meinStift.bewegeUm(55);
meinStift.dreheUm(180);
meinStift.bewegeUm(55);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.runter;
meinStift.dreheUm(270);
meinStift.bewegeUm(280);
meinStift.dreheUm(270);
meinStift.hoch;
meinStift.bewegeUm(150);
meinStift.dreheUm(270);
meinStift.runter;
meinStift.bewegeUm(280);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.runter;
meinStift.bewegeUm(55);
meinStift.dreheUm(180);
meinStift.bewegeUm(55);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.dreheUm(180);
meinStift.bewegeUm(150);
meinStift.dreheUm(270);
meinStift.bewegeUm(10);
meinStift.runter;
meinStift.bewegeUm(55);
meinStift.dreheUm(180);
meinStift.bewegeUm(55);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.dreheUm(270);
meinStift.runter;
meinStift.bewegeUm(390);
meinStift.dreheUm(270);
meinStift.hoch;
meinStift.bewegeUm(150);
meinStift.dreheUm(270);
meinStift.runter;
meinStift.bewegeUm(390);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.runter;
meinStift.bewegeUm(55);
meinStift.dreheUm(180);
meinStift.bewegeUm(55);
meinStift.hoch;
meinStift.bewegeUm(10);
meinStift.dreheUm(180);
{----- Striche Seitenstraße -----}
meinStift.hoch;
meinStift.bewegeBis(525,0);
meinStift.dreheUm(180);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(180);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
meinStift.runter;
meinStift.bewegeUm(50);
meinStift.hoch;
meinStift.bewegeUm(50);
{----- Ampeln und Autos positionieren -----}
Ampel1.setzePosition(400,450);
Ampel1.setzeOrientierung(4);
Ampel2.setzePosition(620,450);
Ampel2.setzeOrientierung(1);
Ampel3.setzePosition(620,250);
Ampel3.setzeOrientierung(2);
Ampel4.setzePosition(400,230);
Ampel4.setzeOrientierung(3);
Auto1.setzePosition(380,400);
Auto2.dreheUm(90);
Auto2.setzePosition(570,500);
Auto3.dreheUm(180);
Auto3.setzePosition(670,320);
Auto4.dreheUm(270);
Auto4.setzePosition(480,210);
repeat
{----- Auto1 und Auto3 Anfang-----}
begin
if ampel1.farbe=gruen
then
begin
auto1.bewegedich;
auto3.bewegedich;
end;
if auto1.hposition>(derbildschirm.breite) then auto1.setzeposition(0,400);
if auto3.hposition<0 then auto3.setzeposition(derBildschirm.breite,320);
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeillinks) then ampel1.schalteum;
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeillinks) then ampel3.schalteum;
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeillinks) then dietastatur.weiter;
{----- Auto1 und Auto3 Ende -----}
{----- Auto2 und Auto4 Anfang-----}
if ampel2.farbe=gruen
then
begin
auto2.bewegedich;
auto4.bewegedich;
end;
if auto2.vposition<0 then auto2.setzeposition(570,derBildschirm.hoehe);
if auto4.vposition>derBildschirm.hoehe then auto4.setzeposition(480,0);
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeiloben) then ampel2.schalteum;
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeiloben) then ampel4.schalteum;
if (dietastatur.wurdegedrueckt) and (dietastatur.zeichen=pfeiloben) then dietastatur.weiter;
warte(1);
{----- Auto2 und Auto 4 Ende -----}
if (dieuhr.sekunde=10) or
(dieuhr.sekunde=20) or
(dieuhr.sekunde=30) or
(dieuhr.sekunde=40) or
(dieuhr.sekunde=50) or
(dieuhr.sekunde=0) then
begin
ampel3.schalteUm;
ampel1.schalteUm;
end;
end
until (dietastatur.wurdegedrueckt) AND (dietastatur.zeichen=eingabe);
{----- Objekte auflösen -----}
derBildschirm.gibFrei;
dieUhr.gibFrei;
end.
Alles anzeigen
da sollte ein großes U rein, die Instanz von Uhr mit kleinem U gibts nicht.
ZitatAlles anzeigenOriginal von blacksheep
if (dieuhr.sekunde=10) or
(dieuhr.sekunde=20) or
(dieuhr.sekunde=30) or
(dieuhr.sekunde=40) or
(dieuhr.sekunde=50) or
(dieuhr.sekunde=0) then
Aber meckert da die IDE nicht, das sollte doch gar nicht compilierbar sein (oder ist Delphi nicht case-sensitive? ich hab seit Delphi 2 nicht mehr damit programmiert)
nee, delphi ist imho nicht CaseSensitiv.
Was heißt denn Probleme mit der Schaltung? Haste irgendwo nen Logikfehler drinne??
Also wir sollen das Ampelsystem halt so programmieren, wie eine Ampel funktioniert. Wenn Ampel 1 und Ampel 3 grün sind, müssen Ampel 2 und 4 rot sein... und das immer abwechselnd im Abstand (x) Sekunden. Soweit wie ich programmiert habe, werden die Ampeln nicht richtig umgeschaltet. Während einer Sekunde schaltet die Ampel anscheinend zu oft um bzw. sie SOLL nur einmal die Farbe wechseln und nicht so oft wie möglich in jeder Sekunde die ne 5 oder 0 am Ende hat. (Sekunde 5, Sekunde 10, 15 etc...)
Hier mal nen Screenshot zum besseren Verständnis:
was ist denn bei dir die Klasse "Uhr"? Greifste auf die Timer-Komponente in Delphi zu? oder liest du die Systemzeit aus?
Also an deiner If-Abrage ist nichts offensichtlich falsch...
uh da fragst du mich was Die ganzen Objekte haben wir schon gestellt bekommen....
Also der Wert, der bei dieUhr.warte() drin steht ist eine Millisekundenangabe. Deswegen hab ich sekunde=x benutzt, damit er alle Sekunden auswählt mit 5 bzw. 0... weiter kann ich dir die Frage gar nicht beantworten, sorry!
Ist da denn eventuell einfach nur nen logischer Fehler drin? Wie würdet ihr das Ampelsystem "formulieren"?
ZitatOriginal von Beme
Also an deiner If-Abrage ist nichts offensichtlich falsch...
aber das Programm kommt aber mehrmals pro Sekunde in die Abfrage rein.
klar, aber das darf ja normal nichts ausmachen...
also ich hasse aber sowieso die ewig langen if-schleifen.. Mache dann lieber cases draus.
Eleganter: du kannst das ganze mit "mod" (modulo-Funktion, Rest einer ganzzahligen Division) auch vereinfachen bzw. abkürzen. Ich kenn leider die genaue Delphi-Syntax nicht mehr, die Schule is schon so lange her
Ansonsten weiß ich halt jetzt zuwenig über die anderen Klassen die Du einbindest Bescheid um das alles nachvollziehen zu können...
ZitatOriginal von Beme
klar, aber das darf ja normal nichts ausmachen...
doch, dann tritt genau der Fehlerfall ein. Es muß noch eine Abfrage mit rein, ob die Ampel in dieser Sekunde schon umgeschaltet wurde.
richtig, da hast du vollkommen recht... Denn es ist davon auszugehen, dass das Programm mehrmals pro Sekunde die Schleife durchläuft.
Man könnte es derart lösen:
var abgearbeiteteSekunde: integer;
...
//Programmstart, darf nur 1x augerufen werden
abgearbeiteteSekunde=1;
...
...
if (dieuhr.sekunde <> abgerarbeiteteSekunde) then
if ((dieuhr.sekunde + 10 ) mod 10 == 0) then
begin
abgearbeiteteSekunde= dieuhr.sekunde;
ampel3.schalteUm;
ampel1.schalteUm;
end;
Alles anzeigen
interessehalber: haste es hinbekommen?
Ja, jedoch etwas anders:
if (ampel1.farbe=gruen) and (dieuhr.sekunde=5) or
(ampel1.farbe=rot) and (dieUhr.sekunde=10) or
(ampel1.farbe=gruen) and (dieUhr.sekunde=15) or
(ampel1.farbe=rot) and (dieUhr.sekunde=20) or
(ampel1.farbe=gruen) and (dieUhr.sekunde=25) or
(ampel1.farbe=rot) and (dieUhr.sekunde=30) or
(ampel1.farbe=gruen) and (dieUhr.sekunde=35) or
(ampel1.farbe=rot) and (dieUhr.sekunde=40) or
(ampel1.farbe=gruen) and (dieUhr.sekunde=45) or
(ampel1.farbe=rot) and (dieUhr.sekunde=50) or
(ampel1.farbe=gruen) and (dieUhr.sekunde=55) then
Alles anzeigen
klappt. jetzt müssen die Autos nur wieder vor ihren Ampeln stehen bleiben und nicht einfach irgentwo.
stimmt... ich kanns nun zwar nicht mehr selbst erklären wie ich auf die befehle gekommen bin weil wir die noch nie im unterricht hatten aber trotzdem danke, funktioniert!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!