Entwickler-Ecke

Free Pascal - Einarmiger Bandit


Aaron2608 - Do 17.12.15 17:16
Titel: Einarmiger Bandit
allo,
Ich will einen Einarmigen Bandit programmieren mit 3 Bildern.
Die Bilder heißen bei mir ABild & BBild.
Es muss kein Betrag sonder nur der Text Verloren oder Gewonnen im Panel2 ausgegeben werden
Ich habe auf den Button geschrieben


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
begin

Image1.picture.loadfromfile ('ABild');
Image2.picture.loadfromfile ('ABild');
Image3.picture.loadfromfile ('ABild');
Image1.picture.loadfromfile ('BBild');
Image2.picture.loadfromfile ('BBild');
Image3.picture.loadfromfile ('BBild');
if (Image1 = Image2) AND (Image3 = Image1) then
panel2.caption:=('gut') ;
end;



Ich habe mehere Probleme , wie bekomme ich es hin dass die Bilder gemischt werden also neu gewürfelt ?
Wenn ich das Programm starte und auf den Button drücke kommt unable to load file 'ABild'

Ich bin noch sehr neu & habe bis jetzt alle Aufgaben geschafft aber ich komme nicht weiter...

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


Mathematiker - Do 17.12.15 17:44

Hallo
und :welcome:
Mit den Anweisungen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Image1.picture.loadfromfile ('ABild');
Image2.picture.loadfromfile ('ABild');
Image3.picture.loadfromfile ('ABild');
Image1.picture.loadfromfile ('BBild');
Image2.picture.loadfromfile ('BBild');
Image3.picture.loadfromfile ('BBild');
wird in jedes Image jedes Bild geladen. Am Ende steht in allen BBild.

Du benötigst eine zufällige Auswahl. Dazu gibt es die Anweisung random().
Mit auswahl:=random(2) wird eine zufällig Zahl 0 oder 1 (nicht 2!) "gewürfelt". Mit if-then-else wird

Delphi-Quelltext
1:
2:
3:
Auswahl:=random(2);
if Auswahl=0 then Image1.picture.loadfromfile ('ABild')
             else Image1.picture.loadfromfile ('BBild');

Kürzer ist

Delphi-Quelltext
1:
2:
if random(2then Image1.picture.loadfromfile ('ABild')
             else Image1.picture.loadfromfile ('BBild');

Willst du noch mehr Bilder auswählen, muss der Wert in random entsprechend erhöht werden. Dann solltest du case statt if-then-else nutzen.
Nebenbei: In der show-Methode des Formulars solltest du randomize schreiben. Das garantiert bei jedem Programmstart eine neue Zufallsfolge.
Deine Bilder haben bestimmt einen Typ. Schöner wäre also 'ABild.bmp', 'ABild.jpg' oder entsprechend. Andernfalls findet er die Dateien nicht. Evtl. musst du auch noch den Ordner angeben.

Für die Ausgabe solltest du auch if-then-else verwenden, also

Delphi-Quelltext
1:
2:
  if (Image1 = Image2) AND (Image3 = Image1) then panel2.caption:='gut'
                                             else panel2.caption:='......';


Beste Grüße
Mathematiker


ub60 - Do 17.12.15 18:40

user profile iconAaron2608 hat folgendes geschrieben Zum zitierten Posting springen:

Wenn ich das Programm starte und auf den Button drücke kommt unable to load file 'ABild'

Möglicherweise heißt Dein Bild nicht "ABild", sondern "ABild.bmp" oder "ABild.png". Das solltest Du mal testen.
Ich weiß auch nicht, ob LoadFromFile überhaupt Bilder ohne Dateinamenserweiterung einliest.

ub60


Jumpy - Do 17.12.15 18:48


Quelltext
1:
if (Image1 = Image2) AND (Image3 = Image1)                    


wird den dabei jemals was rauskommen? Image1 ist doch nicht gleich Image2, nur weil die gerade das selbe Bild darstellen, oder sehe ich das falsch?

Auch wenn der TE noch sehr neu ist, wäre es doch hier vielleicht sinnvoll mit z.B. 3 (String-)variablen zu arbeiten, wo ein zufälliger Dateiname (der Bilder) drin gespeichert wird. Zu jedem Image kann dann über den Dateinamen in der Variablen das passende Bild geladen werden und der obige Vergleich benutzt dann halt diese Variablen zum Vergleich und das geht ja dann.

Das mehrfache Zuweisen von Bildern zur Image-Komponente könnte ein Versuch des TE sein die wechselnden Bildchen in einem einarmigen Banditen darzustellen? Falls er das damit erreichen wollte, müsste man sich dafür auch mal ein Konzept überlegen, z.B. mit einem Timer solange die anfgezeigten Bildchen (zufällig) wechseln, bis ein Button gedrückt (=Hebel gezogen) wird und dann erst die dann vorhandene Darstellung Auswerten.


Mathematiker - Do 17.12.15 18:51

Hallo,
user profile iconJumpy hat folgendes geschrieben Zum zitierten Posting springen:

Quelltext
1:
if (Image1 = Image2) AND (Image3 = Image1)                    

wird den dabei jemals was rauskommen? Image1 ist doch nicht gleich Image2, nur weil die gerade das selbe Bild darstellen,

Du hast recht. Den Fehler habe ich glatt übersehen. :cry:

Mathematiker


Jumpy - Do 17.12.15 19:20

Mit den folgenden Bausteinen könnte man es vllt. umsetzen, hoffe ihr seht das nicht als zuviel geholfen an:


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:
const Bilder: array[0..5] od String = ('BildA.bmp','BildB.bmp','BildC.bmp','BildD.bmp','BildE.bmp','BildF.bmp',);
      Bilderverzeichnis='Verzeichnis wo die Bilder liegen';

var Walzen:Array of Integer;
    Bilderanzahl:Integer;

procedure Form_Create(...) 
begin 
  ...
  Bilderanzahl=Length(Bilder);
  SetLength(Walzen,3);
  Randomize;
  ...
end;

procedure ButtonStart_Click(...)
begin
  Timer.Enabled=True;
end;

procedure ButtonStop_Click(...)
begin
  Timer.Enabled=False;
  If WalzenbilderAlleGleich then
    panel2.Capion:='gut';
end;

function WalzenbilderAlleGleich:Boolean;
begin
  Result:= (Walzen[0]=Walzen[1]) and (Walzen[0]=Walzen[2]);
end;

procedure Timer_OnTimer(...)
var i:integer;
begin
  Timer.Enabled=False;
  for i=0 to 2 do
    Walzen[i]:=Random(Bilderanzahl);
  BilderAnzeigeAktualisieren;
  Timer.Enabled=true;
end;

procedure BilderAnzeigeAktualisieren;
begin
  Image1.Picture.LoadFromFile(Bilderverzeichnis+Bilder[Walzen[1]]);
  usw.
end;


P.S.: Es gibt auch einen krassen Crosspost im parallelen DP-Universum, den ich aber nicht verlinke :)

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt