![]() |
Spiel programmieren, Hilfe benötigt.
Ich versuche, ein Spiel gegen den Computer zu programmieren, allerdings treten gleich am Anfang ein paar Probleme auf:
Ich habe mir Bilder als BitMap erstellt, die später vom Programm zufällig auf 24 Labels verteilt werden sollen. Wie lade ich die Bilder im Programmtext ins Programm? |
AW: Spiel programmieren, Hilfe benötigt.
Entweder im OnPaint direkt auf das Formular zeichnen oder 24 TImage-Komponenten auf dem Form verteilen und die Bilder dann dort hinein laden.
|
AW: Spiel programmieren, Hilfe benötigt.
Aber immer in zufälliger Verteilung, sonst würde ichs ja wissen.
|
AW: Spiel programmieren, Hilfe benötigt.
Dann erstell Dir ein Array oder eine Liste und "mische" die Einträge. Wie man das macht, steht mehrfach im Forum. Anschließend gehst Du diese Liste durch und verteilst die Bilder auf die Images.
|
AW: Spiel programmieren, Hilfe benötigt.
Und wie lade ich die Bilder im Programmtext?
Da wusste sogar mein Lehrer nicht weiter >.< |
AW: Spiel programmieren, Hilfe benötigt.
Zitat:
|
AW: Spiel programmieren, Hilfe benötigt.
@Caleb: Du glaubst garnicht, wievielen Lehrern mand ass dan sagen müsste ;)
@Topic:
Code:
Alternativ machst du dir soviele TBitmaps wie du verschiedene Bilder hast, lädst dan jedes bild in ein anderes TBitmap und machst dann bei den Images nurnoch
ImageName.Picture.LoadFromFile('Dateiname');
Code:
MFG
ImageName.picture.assign(Bitmap);
Memnarch |
AW: Spiel programmieren, Hilfe benötigt.
Zitat:
Man muß nur wissen wo es steht! Gruß K-H |
AW: Spiel programmieren, Hilfe benötigt.
Was DeddyH meinte (so hab ich das vestanden):
Delphi-Quellcode:
Wichtig dürfte sein, dass die Anzahl der Elemente in der Stringlist >= der Anzahl der TImages ist (- sonst ist die SL leer)
var
ListeVonDateinamen:TStringlist; DatenameIndex:Integer; i:Integer; begin Randomize; //EIGENTLICH SOLLTEN WIR DAS IM FORMCREATE ODER SO MACHEN(nur einmal aufrufen) ListeVonDateinamen:=TStringList.Create; //wir erzeugen eine Stringlist (, die wir unten wieder freigeben) try ListeVonDateinamen.add('C:\pfad\dateiname1.bmp'); //Die Stringlist muss jedes mal befüllt werden ListeVonDateinamen.add('C:\pfad\dateiname2.bmp'); //Oder aus einer Anderen kopiert ListeVonDateinamen.add('C:\pfad\dateiname3.bmp'); //weil Unten Einträge gelöscht werden (damit sie nicht 2 mal vorkommen) ListeVonDateinamen.add('C:\pfad\dateiname4.bmp'); //Übrigens: Dateinamen NIEMALS so hinschreiben, sondern am Besten einen Pfad relativ zu der .exe angeben (s.ParamStr(0)) for i:=0 to Form1.ComponentCount-1 do //hier laufen wir alle auf dem Formular platzierten Komponenten durch begin if Form1.Components[i] is TImage then //und wenn wir ein TImage finden, dann begin DateinameIndex:=Random(ListeVonDateinamen.count) //machen wir erst mal eine Zufallszahl ImageName.Picture.LoadFromFile(ListeVonDateinamen[DatenameIndex]; //und laden das Bild mit dem Dateinamen, der in der Stringlist mit dem Index DatenameIndex liegt ListeVonDateinamen.Delete(DateinameIndex); //dann löschen wir den Eintrag, damit wir nicht 2 mal das gleiche Bild laden end; end; finally //selbst wenn oben seit den try etwas schief läuft kommen wir hier rein FreeAndNil(ListeVonDateinamen); //und geben unsere stringlist wieder frei end; end; Ausserdem kopiere nicht einfach den code (den ich übrigens mangels Delphi nicht getestet habe), sondern sieh dir an was er macht und programmiere es dann selbst, sonst lernst du dabei gar nichts (spreche aus Erfahrung) |
AW: Spiel programmieren, Hilfe benötigt.
Jetzt versteh ich gar nichts mehr -.-
Also, das Spiel, soll ein Spiel gegen den Computer werden, mit den Zahlen von -4 - -1 und den Zahlen 1 - 4 befüllt werden, diese Zahlen sind aber auf Bildern, die ich in Images laden will. Außerdem soll das Spiel in einem 5x5 Feld gespielt werden und man startet immer in der Mitte, die Zahlen in dem Images sollen zufällig auf den restlichen 24 Plätzen verteilt werden. Wenn man das Spiel dann startet darf man nur in seiner vertikalen Reihe eine Zahl auswählen und der Computer wählt dann in der horizontalen Reihe, von der man selbst die Zahl gewählt hat, die möglichst höchste Zahl, also das beste für sich. Ziel des Spiels ist es die höhere Punktzahl als der PC zu bekommen. Die Verteilung der Zahlen ist 3x von jeder Zahl. Ich hab jetzt 24 Images gemacht, wo zufällig etwas reingeladen werden soll. Dazu ein Neu-Button, der die Bilder dort zufällig reinladen soll. Wenn ich das Spiel dann starte will ich auf eins der Images der vertikalen Reihe klicken können, nirgendwo sonst. Dieses Image soll dann verschwinden. Dann soll der PC die für sich beste Zahl wählen. Dort soll dann das X hingesetzt werden und man selbst darf wieder in der vertikalen Reihe wählen, nachdem man einen 2. Weiter-Button drückt und die Punkte zur Zwischenpunktzahl für sich und den PC zusammengezählt werden. Das Spiel endet, wenn man selbst, oder der PC nicht mehr wählen kann. Dann soll die Gesamtpunktzahl verglichen werden und eine Ausgabe erscheinen, wer gewonnen hat. |
AW: Spiel programmieren, Hilfe benötigt.
Öhmmm ja, und was ist jetzt die Frage?
|
AW: Spiel programmieren, Hilfe benötigt.
Wie ich das hinbekomme, weil das Programm schon meine Images nicht laden will.
|
AW: Spiel programmieren, Hilfe benötigt.
Was heißt "nicht laden will"? Kommt eine Fehlermeldung? Wenn ja, welche?
|
AW: Spiel programmieren, Hilfe benötigt.
Okay, ich kenn den Befehl dafür nicht, und die hier funktionieren auch nicht.
|
AW: Spiel programmieren, Hilfe benötigt.
Der Befehl wurde doch schon genannt:
Delphi-Quellcode:
Image.Picture.LoadFromFile(<kompletter Dateiname samt absolutem Pfad>);
|
AW: Spiel programmieren, Hilfe benötigt.
Der Befehl funktioniert bei mir aber komischerweise nicht.
Ich glaub ich bin zu doof für Delphi -.- |
AW: Spiel programmieren, Hilfe benötigt.
Zeig doch mal Deinen Code, meine Glaskugel ist gerade zum Polieren :glaskugel:
|
AW: Spiel programmieren, Hilfe benötigt.
Ich hab keinen Code, weil ich gar nicht weiß, wie ich starten soll :x
Ich hab auch versucht den Code von hier umzuschreiben, aber das funktioniert auch nicht, weil der meint, das Image kein definierter Bezeichner wäre. |
AW: Spiel programmieren, Hilfe benötigt.
Pack Dir ein TImage auf das Formular und drück dann STRG-F9. Dadurch wird die benötigte Unit automatisch eingebunden, sofern sie noch nicht vorhanden ist. Im Anschluss kannst Du den Code noch einmal versuchen, wobei Du statt "Image" dann natürlich den Namen des TImage verwenden musst.
|
AW: Spiel programmieren, Hilfe benötigt.
Das funktioniert auch nicht, da kommt derselbe Fehler.
Hier mal das Formular: ![]() |
AW: Spiel programmieren, Hilfe benötigt.
Wie soll ich Dir helfen, wenn Du nicht mit dem Code herausrückst?
|
AW: Spiel programmieren, Hilfe benötigt.
Der code ist fürn Ar***
Zumindest so, wie ich ihn umgeschrieben habe. Und irgendwie kann mir auch niemand helfen... Hier ist der Code, den ich nicht selbst geschrieben habe, sondern nur verändert habe:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var ListeVonDateinamen:TStringlist; DateinameIndex:Integer; i:Integer; Image : Integer; begin Randomize; ListeVonDateinamen:=TStringList.Create; ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\1.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\2.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\3.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\4.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\-1.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\-2.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\-3.bmp'); ListeVonDateinamen.add('H:\Mathematik-Informatik\Delphi\ClickForest\Informatik-Bilder\-4.bmp'); for i:=0 to Form1.ComponentCount-1 do if Form1.Components[i] is TImage then begin DateinameIndex:=Random(ListeVonDateinamen.count); Image.Picture.LoadFromFile(ListeVonDateinamen[DateinameIndex]; ListeVonDateinamen.Delete(DateinameIndex); end; end; finally FreeAndNil(ListeVonDateinamen); end; end; end. |
AW: Spiel programmieren, Hilfe benötigt.
Wozu die lokale Image-Variable vom Typ integer? Du musst das Bild in das gerade ermittelte Image laden.
Delphi-Quellcode:
if Components[i] is TImage then
begin DateinameIndex:=Random(ListeVonDateinamen.count); TImage(Components[i]).Picture.LoadFromFile(ListeVonDateinamen[DateinameIndex]); ListeVonDateinamen.Delete(DateinameIndex); |
AW: Spiel programmieren, Hilfe benötigt.
Jetzt hat er bei dem Finally noch was zu meckern, dass er eine Deklaration erwartet, aber Finally findet.
|
AW: Spiel programmieren, Hilfe benötigt.
Delphi-Quellcode:
ListeVonDateinamen:=TStringList.Create;
try //das hast Du unterschlagen bzw. nicht mitkopiert |
AW: Spiel programmieren, Hilfe benötigt.
Da fehlt auch noch ein begin:
Delphi-Quellcode:
for i:=0 to Form1.ComponentCount-1 do
begin |
AW: Spiel programmieren, Hilfe benötigt.
Wenn schon C&P, dann aber bitte vollständig.
|
AW: Spiel programmieren, Hilfe benötigt.
Zitat:
|
AW: Spiel programmieren, Hilfe benötigt.
Trotzdem hab ich jetzt noch einen undefinierten Bezeichner nach dem Finally, das FreeAndNil.
|
AW: Spiel programmieren, Hilfe benötigt.
FreeAndNil ist in der Unit SysUtils definiert. Aber an dieser Stelle reicht auch ein einfaches .Free :wink:
|
AW: Spiel programmieren, Hilfe benötigt.
Vielleicht sollte man die
![]() |
AW: Spiel programmieren, Hilfe benötigt.
Delphi-Quellcode:
Jetzt hab ich zu viele Parameter bei dem Free.
procedure TForm1.Button2Click(Sender: TObject);
var ListeVonDateinamen:TStringlist; DateinameIndex:Integer; i:Integer; begin Randomize; ListeVonDateinamen:=TStringList.Create; try ListeVonDateinamen.add('H:\Informatik-Bilder\1.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\2.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\3.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\4.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\-1.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\-2.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\-3.bmp'); ListeVonDateinamen.add('H:\Informatik-Bilder\-4.bmp'); for i:=0 to Form1.ComponentCount-1 do if Components[i] is TImage then begin DateinameIndex:=Random(ListeVonDateinamen.count); TImage(Components[i]).Picture.LoadFromFile(ListeVonDateinamen[DateinameIndex]); ListeVonDateinamen.Delete(DateinameIndex); end; finally Free(ListeVonDateinamen); end; end; end. Mit .Free hat es nicht geklappt. |
AW: Spiel programmieren, Hilfe benötigt.
|
AW: Spiel programmieren, Hilfe benötigt.
Delphi-Quellcode:
So?
finally
TObject.Free(ListeVonDateinamen); end; Dann sagt er mir, dass diese Form, des Methodenaufrufs nur für Klassenmodelle erlaubt sei. |
AW: Spiel programmieren, Hilfe benötigt.
Versuchs mal mit ListeVonDateinamen.Free;
|
AW: Spiel programmieren, Hilfe benötigt.
:wall: Hast Du Dir mittlerweile die oben verlinkten Tutorials angesehen? Du sollst die Liste freigeben, welche die Free-Methode von TObject erbt.
|
AW: Spiel programmieren, Hilfe benötigt.
Die Tutorials muss ich mir mal in Ruhe angucken.
Neues Problem beim starten des Programms: ![]() ![]() |
AW: Spiel programmieren, Hilfe benötigt.
Zitat:
Zum Problem: Du hast wahrscheinlich mehr Images als Einträge in der Liste :roll: |
AW: Spiel programmieren, Hilfe benötigt.
Momentan hab ich aber keine Ruhe, da ich nur Freistunden habe.
Wie kann ich dieses Problem dann beheben? |
AW: Spiel programmieren, Hilfe benötigt.
Einige Images löschen oder mehr Einträge in die Liste hinzufügen?! ..........
(Und trotzdem am besten gleich in den Quellcode eine Prüfung einbauen.) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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