Entwickler-Ecke
Multimedia / Grafik - frage zu programm 'hütchenspiel'
extend your life - Do 05.01.12 21:38
Titel: frage zu programm 'hütchenspiel'
hey, :)
in meinem Informatikkurs sollen wir mit delphi oder lazarus ein "kleines Spiel" erstellen und ich habe mich für eine vereinfachte Art des Hütchenspiels entschieden. Anstatt der drei Hütchen/Becher gibt es nur drei Kreise und das darunterliegende steinchen soll als aufleuchten des Kreises dargestellt werden. Bis jetzt habe ich mit Random ein zufällige reihenfolge erstellt, aber man muss immer wieder auf den Startknopf drücken, damit ein neuer Krei aufleuchtet. Es soll nach und nach schneller werden und am Ende soll man 3 Knöpfe zur auswahl haben, wo man tippt, welcher der zuletzt rot werdende Kreis war. danach soll angezeigt werden, ob es stimmt. Die Idee muss auf jeden Fall noch ausgearbeitet werden, aber im Moment habe ich das Problem, dass ich es nicht hinbekomme, dass es von allein wechselt und dann nach einer bestimmten zeit wieder aufhört. Und das mit der Auflösung klappt auch hinten und vorn nicht :? ... ich hoffe, ihr könnt mir helfen und wenn es geht, bitte relativ einfach erklärt. :oops:
Tilo - Do 05.01.12 22:28
Hallo extend your life,
Willkommen im Forum :welcome:
Bitte für verschiedene Probleme Demnächst mehre Themen eröffnen.
Hier aber dennoch ein paar Hilfen:
1) Weiterschalten der Farbe:
Für den Anfang reicht ein Timer. In einer globalen Variablen merkst du dir welcher Kreis Aufleuten soll. In der Timer Mehtode färbst Du die Kreise entsprechend ein. Damit es schneller geht kannst Du die Timerzeit runterstellen. Wenn es dann nicht mehr leutchten soll, so chalte den Timer aus und "entfärbe" alle Kreise.
b) keine Methode zum Start ist nicht übersichtlich erstellt.
statt
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.StartClick(Sender: TObject); begin z := random(3) +1; if z = 1 then shape1.brush.color:=clred; if z = 2 then shape2.brush.color:=clred; if z = 3 then shape3.brush.color:=clred;
if z = 2 then shape1.brush.color:=clblack; if z = 3 then shape1.brush.color:=clblack;
if z = 1 then shape2.brush.color:=clblack; if z = 3 then shape2.brush.color:=clblack;
if z = 1 then shape3.brush.color:=clblack; if z = 2 then shape3.brush.color:=clblack;
end; |
besser so etwas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.StartClick(Sender: TObject); begin z := random(3) +1; if z = 1 then begin shape1.brush.color:=clred; shape2.brush.color:=clblack; shape3.brush.color:=clblack; end; if z = 2 then begin shape2.brush.color:=clred; shape1.brush.color:=clblack; shape3.brush.color:=clblack; end; if z = 3 then begin shape3.brush.color:=clred; shape1.brush.color:=clblack; shape2.brush.color:=clblack; end; end; |
Mit einem case-Statement geht es auch.
c) Die Auflösung:
Die Shape Objekte haben mehrere Ereignisse. Ein Ereigniss dass Du verwenden könntest ist "OnMouseUp".
Ein guter Weg ist wenn Du eine Methode "NutzerWahl(Kreisnummer:integer)" erstellt, für jedes Kreisobjekt einen Aufruf nachdem Muster
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin NutzerWahl(1) end; |
erstellst und in der Methode "NutzerWahl" prüfst du der richtige Kreis ausgewählt wurde.
d) Ebenfalls gut ist es das initiale Färben der Kreise aus der Startmethode (zwischen "Kreise färben Anfang" und "Kreise färben Ende" in eine extra Methode zu schreiben -> vermeidung redundanter Code (buzzwords DRY und KISS)
Viel Erfolg und viel Lernerfolg!
Tilo
extend your life - Fr 06.01.12 15:57
Soweit hab ich es jetzt hinbekommen, vielen Dank für die antwort! :) Aber ich versteh noch nicht, wie ich nach z.B. 10 sekunden den 1. Timer ausschalte und dann den 2. schnelleren Timer einschalte... ich hab schon im internet gesucht, aber vieles hat nciht funktioniert, wie die downto schleife, da springt sofort der 2. Timer an. Naja, die Lösung passt auch nocht nich, ich weiß nicht, wie der erkennen kann, welcher kreis zu letzt rot war und den dann anzeigt.
lg extend your life ;)
Tilo - Fr 06.01.12 19:21
Ein Timer Objekt wird über die Eigenschaft "Enabled" gesteuert.
Im ersten Timer prüfst du ob eine Abbruchbedinung erfüllt ist (z.B. Laufzeit zeit Start des Timers). Ist die Bedinung erfültt so wird der erste Timer gestoppt und der 2. Timer gestartet.
Welcher Kreis zuletzt rot war steckt in deiner Variable "z" mit der Du die Färbung der Kreise steuerst.
Schönes Wochenende
Tilo
extend your life - Sa 07.01.12 14:23
gibt es für meine Auflösung einen begriff wie 'show variable' oder so? tut mir leid, ich steh echt aufm schlauch. :?
hm, danke schonmal und wenn ich mein projekt vorstellen muss, zeige ich meinem kurs dieses forum :wink:
lg extend your life und noch ein schönes restliches wochenende :)
Tilo - Sa 07.01.12 17:54
Hallo extend your life,
Die "Auflösung" kannst Du auf verschiedenen Wegen realisieren.
Hier nur 2 Möglichkeiten:
- Ausgabe in einem Popup, z.B. mit MessageDlg()
- Auf dem Formular ein Ausgabeobjekt (z.B. ein Tedit) und diesem das Ergebniss zuweisen
Einen schönen Samstagabend,
Tilo
extend your life - So 08.01.12 17:43
habs dann doch geschafft ;) ich hoffe, mein lehrer ist zufrieden, auf jeden fall hab ich viel gelernt. danke! :zustimm:
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!