Entwickler-Ecke

Sonstiges (Delphi) - Einarmiger Bandit


schattenlord - Fr 10.10.08 13:21
Titel: Einarmiger Bandit
Moin moin,

Ich hab jetzt dieses Jahr Informatik dazu bekommen und komm auch ganz gut zurecht. Nur bei dem Einarmigen Banditen komm ich nicht weiter.

1. Ich habe drei Stop-Buttons für jeweils ein "Rad". Wie kann ich zusammenfassen, dass wenn alle drei Buttons gedrückt worden sind, z.B. der Start-Button wieder enabled wird.

2. Ich krieg das mit den Punkten nicht hin. Wenn alle "Räder" das gleiche anzeigen, dann soll die Variable (Punkte) +500 hochzählen. Wenn aber ein "Rad" was anderes anzeigt, dann soll (Punkte) -100 folgen.


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:
var
        Form1: TForm1;
        Punkte : Integer ;
        Spiele : Integer  ;
        x,y,z : Integer ;

implementation

{$R *.DFM}





procedure TForm1.FormCreate(Sender: TObject);
begin
        Spiele:= 0 ;
        Punkte:=1500 ;
        PnlPunkte.caption:=IntToStr(punkte);
        PnlSpiele.caption:=IntToStr(Spiele) ;
        x:=40;
        y:=40;
        z:=40;
        if (x = 40and  (y = 40and (z = 40then Punkte:=Punkte +500;
        if (x = 44and  (y = 44and (z = 44then Punkte:=Punkte +500;
        if (x = 48and  (y = 48and (z = 48then Punkte:=Punkte +500;
        if (x = 52and  (y = 52and (z = 52then Punkte:=Punkte +500;
        if (x = 56and  (y = 56and (z = 56then Punkte:=Punkte +500;
        if (x = 60and  (y = 60and (z = 60then Punkte:=Punkte +500;
end;

procedure TForm1.BtnNeuClick(Sender: TObject);
begin
        punkte:=1500;
        spiele:= 0;
        PnlPunkte.caption:=IntToStr(punkte);
        PnlSpiele.caption:=IntToStr(Spiele) ;
        pnlTextausgabe.caption:= ' ';
        pnlTextausgabe.color:= clActiveBorder ;
        Timer1.enabled := false;
        Timer2.enabled := false;
        Timer3.enabled := false;
        BtnStart.enabled := true;
        BtnStop1.enabled := true;
        BtnStop2.enabled := true;
        BtnStop3.enabled := true;
end;

procedure TForm1.BtnStartClick(Sender: TObject);
begin
        Inc(spiele) ;
        PnlSpiele.caption:=IntToStr(Spiele);
        Timer1.enabled:=true;
        Timer2.enabled:=true;
        Timer3.enabled:=true;
        BtnStart.enabled := false;
        BtnStop1.enabled := true;
        BtnStop2.enabled := true;
        BtnStop3.enabled := true;
        if (x)=(y)  then Punkte := Punkte +100;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
        x:=x+4 ;
        PnlRad1.caption:=Chr(x);
        if x = 60 then x:=40;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
        y:=y+4  ;
        PnlRad2.caption:=Chr(y);
        if y = 60 then y:=40;

end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
        z:=z+4  ;
        PnlRad3.caption:=Chr(z);
        if z = 60 then z:=40;

end;

procedure TForm1.BtnStop1Click(Sender: TObject);
begin
        Timer1.enabled:=false;
        BtnStop1.enabled := false;
end;

procedure TForm1.BtnStop2Click(Sender: TObject);
begin
        Timer2.enabled:=false;
        BtnStop2.enabled := false;
end;

procedure TForm1.BtnStop3Click(Sender: TObject);
begin
        Timer3.enabled:=false;
        BtnStop3.enabled := false;

end;

end.


Vielen Dank für alle Antworten!


jaenicke - Fr 10.10.08 13:29

Hallo und :welcome: ;-)

Du kannst dir eine Methode schreiben, die du in jedem der drei ButtonClicks aufrufst. In dieser prüfst du ob alle drei Buttons nicht mehr Enabled sind (also geklickt wurden) und wenn ja, dann aktivierst du deinen anderen Button.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure CheckButtons;
begin
  if not (Form1.BtnStop1.Enabled or Form1.BtnStop2.Enabled or Form1.BtnStop3.Enabled) then
    Form1.BtnStart.Enabled := true;
end;

procedure TForm1.BtnStop1Click(Sender: TObject);
begin
  Timer1.enabled:=false;
  BtnStop1.enabled := false;
  CheckButtons;
end;
Das geht eigentlich auch noch kürzer, weil du den praktisch selben Quelltext mehrfach schreibst, aber es muss ja nicht unnötig kompliziert werden ;-).


Jerk - Fr 10.10.08 13:31

Du kannst Variablen auch direkt miteinander vergleichen.


Delphi-Quelltext
1:
IF (x = y) and (y = z) then Punktehoch else Punkterunter                    


Das mit den Buttons realisierst du in einer Prozedur.
Die wird bei jedem Button im Onclick aufgerufen.
In der Prozedur wird verglichen ob alle gedrückt worden sind. Da du sie ja auf Enabled := False setzt bietet sich das ja an.
Sollten alle Enabled = False sein setzt die Prozedur sie dann wieder auf true.

*edit* verdammt, zu langsam


jaenicke - Fr 10.10.08 13:38

Ach ja, das mit den Punkten, dazu hat user profile iconJerk ja schon etwas geschrieben, und das andere ist: du machst diese Prüfung in FormCreate, das wird aber ja nur am Anfang aufgerufen. Ich vermute das gehört auch in CheckButtons hinein, also wenn alle gedrückt wurden, oder?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure CheckButtons;
begin
  if not (Form1.BtnStop1.Enabled or Form1.BtnStop2.Enabled or Form1.BtnStop3.Enabled) then
  begin
    Form1.BtnStart.Enabled := true;
    // Hier kannst du das dann machen
  end;
end;


Delete - Fr 10.10.08 13:51

Eleganter wäre das allerdings als Methode ;) Und zum Vergleich: das ginge auch so

Delphi-Quelltext
1:
2:
3:
4:
if (x and y and z) = x then
  Punkterauf
else
  Punkterunter;


jaenicke - Fr 10.10.08 13:56

Dass das ganze auch viel kürzer und eleganter geht, ist klar, aber ich wollte darauf gar nicht erst weiter eingehen um nicht Verwirrung zu stiften, deshalb ja auch der Zugriff mit Form1. statt einer Methode des Formulars ;-).


Delete - Fr 10.10.08 14:04

Bei mir ist es eben so, dass ich Zuckungen bekomme, wenn in regulären Prozeduren auf VCL-Instanzen zugegriffen wird :mrgreen:


schattenlord - Fr 10.10.08 14:05

Super, Danke für die schnellen Antworten!!!