![]() |
HILFE! Fehler im "Bild"-Zufallsgenerator
Hallo,
ich bin ein Neuling in Delphi(allgemein im programmieren) und bin derzeit am Programmieren eines Spieles über Black Jack, mithilfe von Delphi 5. Die jeweiligen Karten müssen zufällig generiert werde, dies hab ich mithilfe von Arrays versucht,
Delphi-Quellcode:
jedoch wenn ich auf den Button klicke erscheint das erste mal immer die selbe Karte,
procedure TForm1.Spiel_startenClick(Sender: TObject);
var zufall1,zufall2: Integer; bildarray: array[1..52] of string; begin Spiel_starten.visible:=False; hit.visible:=True; stay.visible:=True; bildarray[1] :='data\Black Jack Karten\1_1_K.bmp'; //Karten als Array aufgelistet bildarray[2] :='data\Black Jack Karten\1_2_Q.bmp'; bildarray[3] :='data\Black Jack Karten\1_3_J.bmp'; bildarray[4] :='data\Black Jack Karten\1_4_10.bmp'; bildarray[5] :='data\Black Jack Karten\1_5_9.bmp'; bildarray[6] :='data\Black Jack Karten\1_6_8.bmp'; bildarray[7] :='data\Black Jack Karten\1_7_7.bmp'; bildarray[8] :='data\Black Jack Karten\1_8_6.bmp'; bildarray[9] :='data\Black Jack Karten\1_9_5.bmp'; bildarray[10] :='data\Black Jack Karten\1_10_4.bmp'; bildarray[11] :='data\Black Jack Karten\1_11_3.bmp'; bildarray[12] :='data\Black Jack Karten\1_12_2.bmp'; bildarray[13] :='data\Black Jack Karten\1_13_A.bmp'; bildarray[14] :='data\Black Jack Karten\2_1_K.bmp'; bildarray[15] :='data\Black Jack Karten\2_2_Q.bmp'; bildarray[16] :='data\Black Jack Karten\2_3_J.bmp'; bildarray[17] :='data\Black Jack Karten\2_4_10.bmp'; bildarray[18] :='data\Black Jack Karten\2_5_9.bmp'; bildarray[19] :='data\Black Jack Karten\2_6_8.bmp'; bildarray[20] :='data\Black Jack Karten\2_7_7.bmp'; bildarray[21] :='data\Black Jack Karten\2_8_6.bmp'; bildarray[22] :='data\Black Jack Karten\2_9_5.bmp'; bildarray[23] :='data\Black Jack Karten\2_10_4.bmp'; bildarray[24] :='data\Black Jack Karten\2_11_3.bmp'; bildarray[25] :='data\Black Jack Karten\2_12_2.bmp'; bildarray[26] :='data\Black Jack Karten\2_13_A.bmp'; bildarray[27] :='data\Black Jack Karten\3_1_K.bmp'; bildarray[28] :='data\Black Jack Karten\3_2_Q.bmp'; bildarray[29] :='data\Black Jack Karten\3_3_J.bmp'; bildarray[30] :='data\Black Jack Karten\3_4_10.bmp'; bildarray[31] :='data\Black Jack Karten\3_5_9.bmp'; bildarray[32] :='data\Black Jack Karten\3_6_8.bmp'; bildarray[33] :='data\Black Jack Karten\3_7_7.bmp'; bildarray[34] :='data\Black Jack Karten\3_8_6.bmp'; bildarray[35] :='data\Black Jack Karten\3_9_5.bmp'; bildarray[36] :='data\Black Jack Karten\3_10_4.bmp'; bildarray[37] :='data\Black Jack Karten\3_11_3.bmp'; bildarray[38] :='data\Black Jack Karten\3_12_2.bmp'; bildarray[39] :='data\Black Jack Karten\3_13_A.bmp'; bildarray[40] :='data\Black Jack Karten\4_1_K.bmp'; bildarray[41] :='data\Black Jack Karten\4_2_Q.bmp'; bildarray[42] :='data\Black Jack Karten\4_3_J.bmp'; bildarray[43] :='data\Black Jack Karten\4_4_10.bmp'; bildarray[44] :='data\Black Jack Karten\4_5_9.bmp'; bildarray[45] :='data\Black Jack Karten\4_6_8.bmp'; bildarray[46] :='data\Black Jack Karten\4_7_7.bmp'; bildarray[47] :='data\Black Jack Karten\4_8_6.bmp'; bildarray[48] :='data\Black Jack Karten\4_9_5.bmp'; bildarray[49] :='data\Black Jack Karten\4_10_4.bmp'; bildarray[50] :='data\Black Jack Karten\4_11_3.bmp'; bildarray[51] :='data\Black Jack Karten\4_12_2.bmp'; bildarray[52] :='data\Black Jack Karten\4_13_A.bmp'; begin zufall1 := Random (52)+1; zufall2 := zufall1+Random(5); randomize; Image1.Picture.LoadFromFile(bildarray[zufall1]); Image5.Picture.LoadFromFile('data\Black Jack Karten\Karte_verdeckt.bmp'); end; end; obwohl ich versucht habe dies mit Randoms zu umgehen :gruebel: , wie gesagt ich bin ein Neuling in diesem Bereich und deswegen sieht der Quellcode nicht ganz so professionell aus :lol:. Ich würde mich über Hilfe sehr freuen. KING_OF_BONGO |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Hi! Du musst randomize vor dem ersten aufruf von random setzen, damit der Zufallszahlengenerator richtig initialisiert wird :)
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
ruf randomize vor random auf.
randomize sollte eh nur einmal im programm aufgerufen werden, im oncreate zb. |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Außerdem macht dein Quelltext so wie du ihn gepostet hast keinen Sinn. Du hast zwei "begin-end"-Blöcke, was so nicht sein kann. Außerdem würde ich dir raten, das "Befüllen" des Arrays auch nur EINMAL auszuführen, beispielweise im OnCreate, denn so wie es jetzt ist, wird es jedesmal ausgeführt, wenn geklickt wird, obwohl sich ja am Array-Inhalt nichts ändern sollte.
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Und relative Pfade sind auch "böse", verwende absolute. Den Pfad zum eigenen Programm bekommst Du mit ExtractFilePath(ParamStr(0)).
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zitat:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Und ich bin mir ziemlich sicher, dass sich sich das Befüllen des Arrays deutlich vereinfachen lässt. Mach es so wie DeddyH es vorgeschlagen hat und besorge dir erstmal den richtigen Pfad:
Delphi-Quellcode:
Anschließend kannst du mit einer doppelten Schleife dein Array mit Inhalten befüllen:
var pfad : string;
begin //-- pfad := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'data\Black Jack Karten\';
Delphi-Quellcode:
So kannst du dein Array viel effektiver befüllen. Du musst beachten, dass deine Bild-Dateien dementsprechend benannt sein müssen, also aus "1_1_K.bmp" machst du beispielsweise "1_1.bmp", ich denke die zusätzliche Angabe für den Wert der Karte kannst du dir im Dateinamen sparen.
for i1 := 1 to 4 do
begin for i2 := 1 to 13 do begin BildArray[(i1-1)*13+i2] := pfad + i1 + '_' + i2 + '.bmp'; end; end; Patti Edit: Kleinen Fehler im Quelltext angepasst. @alleinherrscher: Okay, das mit den zwei Blöcken stimmt vielleicht. Es mag funktionieren, aber gerade einem Anfänger würde ich raten, sauber zu programmieren, bevor sich "Fehler" oder "Unsauberkeiten" in den Stil einschleichen. |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zusammenfassung der Vorschläge:
Delphi-Quellcode:
[edit] Befüllen des Array in 2 Schleifen gelegt [/edit]
//Pfad zu den Bildern als Konstante hinterlegen, spart Schreibarbeit
const Bildpfad = 'data\Black Jack Karten\'; //der Einfachheit halber globale Variablen, normalerweise würde man private Felder deklarieren var bildarray: array[1..52] of string; Pfad: string; procedure TForm1.FormCreate(Sender: TObject); const KartenJeFarbe: array[1..13] of string = ('K','Q','J','10','9','8','7','6','5','4','3','2','A'); var i,j: integer; begin Randomize; Pfad := ExtracFilePath(ParamStr(0)) + Bildpfad; for i := 0 to 3 do for j := Low(KartenJeFarbe) to High(KartenJeFarbe) do bildarray[i * Length(KartenJeFarbe) + j] := Format('%d_%d_%s.bmp',[i + 1,j,KartenJeFarbe[j]]); end; procedure TForm1.Spiel_startenClick(Sender: TObject); var zufall1{,zufall2 wird nie benutzt}: Integer; begin Spiel_starten.visible:=False; hit.visible:=True; stay.visible:=True; zufall1 := Random (52)+1; // zufall2 := zufall1+Random(5); Image1.Picture.LoadFromFile(Pfad + bildarray[zufall1]); Image5.Picture.LoadFromFile(Pfad + 'Karte_verdeckt.bmp'); end; |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zitat:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Hi,
ich habe meinen Quellcode euren Vorschlägen halbwegs angepasst.
Delphi-Quellcode:
Jetzt bekomme ich jedoch einen EInvalidGraphic Fehler(Unbekannte Bilddateierweiterung), wenn ich auf Spiel Starten gehe,
var //bildarray als globale Variable
Form1: TForm1; bildarray: array[1..52] of string; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin randomize; bildarray[1] :='data\Black Jack Karten\1_1_K.bmp'; bildarray[2] :='data\Black Jack Karten\1_2_Q.bmp'; bildarray[3] :='data\Black Jack Karten\1_3_J.bmp'; bildarray[4] :='data\Black Jack Karten\1_4_10.bmp'; bildarray[5] :='data\Black Jack Karten\1_5_9.bmp'; bildarray[6] :='data\Black Jack Karten\1_6_8.bmp'; bildarray[7] :='data\Black Jack Karten\1_7_7.bmp'; bildarray[8] :='data\Black Jack Karten\1_8_6.bmp'; bildarray[9] :='data\Black Jack Karten\1_9_5.bmp'; bildarray[10] :='data\Black Jack Karten\1_10_4.bmp'; bildarray[11] :='data\Black Jack Karten\1_11_3.bmp'; bildarray[12] :='data\Black Jack Karten\1_12_2.bmp'; bildarray[13] :='data\Black Jack Karten\1_13_A.bmp'; bildarray[14] :='data\Black Jack Karten\2_1_K.bmp'; bildarray[15] :='data\Black Jack Karten\2_2_Q.bmp'; bildarray[16] :='data\Black Jack Karten\2_3_J.bmp'; bildarray[17] :='data\Black Jack Karten\2_4_10.bmp'; bildarray[18] :='data\Black Jack Karten\2_5_9.bmp'; bildarray[19] :='data\Black Jack Karten\2_6_8.bmp'; bildarray[20] :='data\Black Jack Karten\2_7_7.bmp'; bildarray[21] :='data\Black Jack Karten\2_8_6.bmp'; bildarray[22] :='data\Black Jack Karten\2_9_5.bmp'; bildarray[23] :='data\Black Jack Karten\2_10_4.bmp'; bildarray[24] :='data\Black Jack Karten\2_11_3.bmp'; bildarray[25] :='data\Black Jack Karten\2_12_2.bmp'; bildarray[26] :='data\Black Jack Karten\2_13_A.bmp'; bildarray[27] :='data\Black Jack Karten\3_1_K.bmp'; bildarray[28] :='data\Black Jack Karten\3_2_Q.bmp'; bildarray[29] :='data\Black Jack Karten\3_3_J.bmp'; bildarray[30] :='data\Black Jack Karten\3_4_10.bmp'; bildarray[31] :='data\Black Jack Karten\3_5_9.bmp'; bildarray[32] :='data\Black Jack Karten\3_6_8.bmp'; bildarray[33] :='data\Black Jack Karten\3_7_7.bmp'; bildarray[34] :='data\Black Jack Karten\3_8_6.bmp'; bildarray[35] :='data\Black Jack Karten\3_9_5.bmp'; bildarray[36] :='data\Black Jack Karten\3_10_4.bmp'; bildarray[37] :='data\Black Jack Karten\3_11_3.bmp'; bildarray[38] :='data\Black Jack Karten\3_12_2.bmp'; bildarray[39] :='data\Black Jack Karten\3_13_A.bmp'; bildarray[40] :='data\Black Jack Karten\4_1_K.bmp'; bildarray[41] :='data\Black Jack Karten\4_2_Q.bmp'; bildarray[42] :='data\Black Jack Karten\4_3_J.bmp'; bildarray[43] :='data\Black Jack Karten\4_4_10.bmp'; bildarray[44] :='data\Black Jack Karten\4_5_9.bmp'; bildarray[45] :='data\Black Jack Karten\4_6_8.bmp'; bildarray[46] :='data\Black Jack Karten\4_7_7.bmp'; bildarray[47] :='data\Black Jack Karten\4_8_6.bmp'; bildarray[48] :='data\Black Jack Karten\4_9_5.bmp'; bildarray[49] :='data\Black Jack Karten\4_10_4.bmp'; bildarray[50] :='data\Black Jack Karten\4_11_3.bmp'; bildarray[51] :='data\Black Jack Karten\4_12_2.bmp'; bildarray[52] :='data\Black Jack Karten\4_13_A.bmp'; end; procedure TForm1.Spiel_startenClick(Sender: TObject); var zufall1,zufall2:integer; begin Spiel_starten.visible:=False; hit.visible:=True; stay.visible:=True; zufall1 := Random (52)+1; Image1.Picture.LoadFromFile(bildarray[zufall1]); Image5.Picture.LoadFromFile('data\Black Jack Karten\Karte_verdeckt.bmp'); end; obwohl ich eigentlich das Format .bmp benutze. Was hab ich falsch gemacht??? KING_OF_BONGO |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Lad mal eine der Bilddateien hoch. Und Du benutzt immer noch relative Pfade. Drücken wir uns so undeutlich aus, oder willst Du unsere Hilfe gar nicht?
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Nein nein ganz im Gegenteil ich freu mich sehr, dass ihr mir diesbezüglich helft.
Ich wollte nur vorher sichergehen, ob sich nicht noch ein Fehler eingeschlichen hat, bevor ich die relativen Pfade einfüge. ![]() KING_OF_BONGO |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
.. es wäre schöner, wenn Du das Bild an Deinen Eintrag anhängen würdest.
Grüße Klaus |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Hm, die Datei sieht nach einem gültigen BMP Format aus. Kommt der Fehler denn bie jedem Start, oder wenn er zufällig eine bestimmte Karte auswählt? Und welche Zeile zeigt der Debugger in Rot an? das erste Loadfromfile?
(by the way: Am besten Bilder etc. direkt hier im Forum anhängen, das geht in der Box zum Beitrag eingeben, unterhalb des Text-Eingabefeldes) [edit]Ich schätze dass einige Karten evtl. nicht das richtige Dateiformat haben und er früher (bevor du das mit dem randomize geändert hast) nicht gemeckert hat, weil er da ja immer eine bestimmte Bilddatei angezeigt hat, die ein korrektes Dateiformat hat...jetzt versucht er, auch die anderen Dateien anzuzeigen und erwischt dabei vielleicht eine Datei mit falschem Dateiformat.[/edit] |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
mh,
also ich hab jetzt das Programm ein paar mal gestartet und der Fehler trat jedes Mal auf. Der Debugger markiert diese Zeile:
Delphi-Quellcode:
PS:Es sind alle Karten im .bmp Format vorhanden.
Image5.Picture.LoadFromFile('data\Black Jack Karten\Karte_verdeckt.bmp');
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
.. nimm doch bitte mal, wie schon des öfteren geschrieben, direkte Pfade
mit ExtractFilePath(ParamStr(0)) bekommst Du den Pfad heraus wo deine exe liegt dann mußt Du nur noch zu Deinen Bildern navigieren. Grüße Klaus |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Jetzt nimmst Du einmal den Code von
![]() |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Ich werde jetzt mal direkte Pfade einbauen. :lol: :lol: :lol:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Ich habe jetzt genau den Code von DeddyH verwendet und es kommt immer noch der selbe
Fehler. :gruebel: Also werden wohl die Karten das Problem sein, obwohl ich es mir eigentlich nicht vorstellen kann. |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Delphi-Quellcode:
Was kommt hierbei heraus?
if not FileExists(Pfad + bildarray[zufall1]) then
ShowMessage('Datei existiert nicht: "' + Pfad + bildarray[zufall1] + '"') else Image1.Picture.LoadFromFile(Pfad + bildarray[zufall1]); |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zitat:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Ach stimmt ja. Nun, man könnte ja alle Dateien einmal mit IrfanView o.ä. öffnen und explizit als Bitmap abspeichern.
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Ok ich werde es mal mit iranview versuchen.
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zitat:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Liste der Anhänge anzeigen (Anzahl: 1)
So hier ist das "Programm".
(ExtractFilePath(ParamStr(0))muss noch eingetragen werden) |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Die wichtigste Datei, die Unit1.pas, ist nicht mit dabei :(
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Liste der Anhänge anzeigen (Anzahl: 1)
oh sry :oops: :oops: :oops:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Liste der Anhänge anzeigen (Anzahl: 1)
Seht ihr, das habt ihr jetzt davon, dass ihr ihm die tollen, sauber programmierten Funktionen geschrieben habt: Wenn er sie nicht richtig einbinden kann, bringen sie ihm nix.
Pass auf dein Problem ist ganz einfach: Du hast die FormCreate Prozedur aus dem Forum hier kopiert aber du hast sie im Objekt Inspektor nicht mit dem Ereignis OnCreate verbunden. Daher wird FormCreate nie aufgerufen und dein Bildarray bleibt leer. Wähle bitte im Objekt Inspektor Form1 aus, klicke dann auf den Karteireiter "Ereignisse" und dann klicke bitte doppelt in den leeren Eintrag rechts neben "OnCreate", dann sollte er an dieser stelle automatisch den Text "FormCreate" reinschreiben. Anschließend ist die Prozedur "FormCreate" mit dem Ereignis "OnCreate" verknüpft und du dein Programm läuft wunderbar. |
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Vielen Dank alleinherrscher, jetzt klappt es wunderbar! :thumb: :thumb: :thumb:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Und das soll jetzt die Erklärung für die ungültige Grafik sein?
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Zitat:
|
Re: HILFE! Fehler im "Bild"-Zufallsgenerator
Sehr dubios, das Ganze :gruebel: Aber wenn es jetzt tut, belassen wir es dabei.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz