![]() |
Schachbrett - Komprnenten ansprechen
Hi, ich versuche Immoment ein Schachbrett zu Programmieren, jedoch hab ich Probleme beim Ansprechen der Felder/Figuren.
Falls Falsche Gruppe bitte Verschieben Die bisher einzige Möglichkeit, die Funktionieren "sollte", währe über ein paar tausend if-Abfragen, wobei ich bei jedem Feld alles andere jedes Mal neu abfrage, um dann die richtigen Figuren auf das richtige Feld zu setzen. Da ja aber kein Mensch so blöd ist, und so viele abfragen schreibt, versuche ich irgendwie anders dahinzukommen. Ich hab schon versucht, die Feld/Figurnamen auf eine variable einzulesen, und sie dann weiterzubenutzen, jedoch hab ich dann nur den wert geändert, und nit den Namen, so dass logischer weise die Fehlermeldung kommt, dat es nit klappt, da die variable ja keine Eigenschaften hat. Könnte man vielleicht Funktionen (top/left/...) für die variablen schreiben, so dass ich über die variable darauf zugreifen kann?? Oder gibt es andere Möglichkeiten, dat ich die verschiebe bzw wenn nötig verschwinden lasse. Hinweis: Die Felder sind aus Labels, da ich dort die Figur, die auf dem Feld steht als caption nehmen kann, und die Figuren Sind Imageboxen. Thorben PS: Hab erst seit diesem Schuljahr Delphi, also kein Profi, aber trotzden könnt ihr ja auch wat komplexeres schreiben, versuch es dann zu verstehen :-) |
Re: Schachbrett - Komprnenten ansprechen
Wie genau sieht denn die Funktion aus? Und was für eine Variable hast du versucht zu benutzen?
Allegemein kannst du ja auch das Label und das Image selbst übergeben oder du erstellst einen ganz eigenen Objekttyp für die Schachfiguren. |
Re: Schachbrett - Komprnenten ansprechen
Ich würde die Felder als array nehmen,
das erspart dir die tausend if Abfragen... Ich möcht zur zeit auch ein kleines Schach(Netzwerk) erstellen, weist du wo man Bilfer von Figuren herbekommt ? |
Re: Schachbrett - Komprnenten ansprechen
Also, ich hatte string-Variablen, wat eigentlich logisch ist, dat die nit klappen können, weil is ja halt en test, und wat meinste mit
Zitat:
Mit ärrays wär ne gute möglichkeit, nur dann hab ich immer noch dat Problem, dat ich die nit ansprechen kann, oderverplan ich da gerade irgend wat? |
Re: Schachbrett - Komprnenten ansprechen
Ich mein, was du genau damit machen willst. Versuchst du herauszufinden, welche Figur auf einem Feld ist, oder auf welchem Feld eine Figur ist?
Zum Array: Man kann auch Arrays mit Objekten füllen. Die kannste dann natürlich auch ansprechen. |
Re: Schachbrett - Komprnenten ansprechen
Was hast du denn als Figuren und Brett gedacht? Grafiken in Form von Timage?
Dann kann man das mit einem Array of Timage machen. |
Re: Schachbrett - Komprnenten ansprechen
Hier erzeugt ein Button-Klick ein neues Bild.
Diese Bilder kann ich dann zB. mit einer for-schleife mit
Delphi-Quellcode:
Hier der Code:
for i := 0 to anzahl-1 do
begin Figuren[i].left := .... ; Figuren[i].visible := false; // usw... end; Hinweis man kann auch mit einer Schleife problemlos 100 Bilder initilaisieren.
Delphi-Quellcode:
var
Form1: TForm1; Figuren : Array of Timage; anzahl : Integer; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin anzahl := anzahl + 1; setlength(Figuren,anzahl); Figuren[anzahl-1] := Timage.Create(Form1); with Figuren[anzahl-1] do begin parent := form1; top := high(Figuren) * 60; left := high(Figuren) * 30; Picture.LoadFromFile('C:\test.bmp'); show; end; end; initialization anzahl := 0; setlength(Figuren,anzahl); end. |
Re: Schachbrett - Komprnenten ansprechen
Bei sowas muss ich ja immer wieder den "objektorientierten" Ansatz vorschlagen :)
Schachbrett hat-> Felder Figuren stehen auf -> Feldern Also einfach ne Klasse Schachbrett mit nem Container der Objekte vom Typ Feld aufnimmt (am besten noch Singleton) Klasse Felder mit Attributen wie : Feldname(zB A8 ) <- kann man auch noch splitten Figur-Objekt (entweder nil wenn nix draufsteht, oder halt die entsprechende Figur) Klasse Figur mit Name (Läufer/Springer/Bauer etc) Bildlink (falls du mit Bildern arbeitest) Bewegungsformel usw....fänd ich einfacher als da direkt in nem Array rumzuwurscheln. Array dann nachher nur zur Darstellung und selbst da wär vermutlich nen Drawgrid oder so einfacher. P.S.: Ich hab das nun nicht volständig durchdacht, will also nix von "aber figur wäre doch eher ne Elternklasse und die einzelnen Figuren wären blabla" hören :wink: Wollt damit nur sagen, dass gerade in so Beispielen meiner Meinung nach der Ansatz über Objekte/Klassen zu gehen sinnvoll wäre :wink: |
Re: Schachbrett - Komprnenten ansprechen
Liste der Anhänge anzeigen (Anzahl: 1)
Also mal am Anfang:
Meiner meinung nach ist ein Schachprogramm eher was für Fortgeschrittene. Anfänger sollten sich erst mal an was einfacheren versuchen. Ich hab keine Ahnung warum plötzlich so viele Anfänger auf Schach stehen, und auch gleich an einem eigenen Spielchen basteln wollen? Ich persönlich arbeite schon seit ein paar Jahren an einer eigenen Version. Bei mir hängt es aber mehr an der selbst entwickelten KI und den vielen größeren Pausen zwischendurch. :wall: Zitat:
Und nun zum Thema: Am bessten lassen sich die Figuren in einem Array speichern; Deklaration:
Code:
die grauen Variablen werden nur bei einer richtigen Programmierung des Schachspiels benötigt. Wenn zum Beispiel Sonderzüge wie Rochade und so unterstützt werden sollen.
[b]Const[/b]
F_F = 0; { Frei (keine Figur) } [color=gray] F_WBb = 1; { Weiß - Bauer (noch nicht bewegt) }[/color] F_WB = 2; { Weiß - Bauer } F_WS = 3; { Weiß - Springer } F_WL = 4; { Weiß - Läufer } [color=gray] F_WTb = 5; { Weiß - Turm (noch nicht bewegt) }[/color] F_WT = 6; { Weiß - Turm } F_WD = 7; { Weiß - Dame } [color=gray] F_WKb = 8; { Weiß - König (noch nicht bewegt) }[/color] F_WK = 9; { Weiß - König } [color=gray] F_SBb = 11; { Schwarz - Bauer (noch nicht bewegt) }[/color] F_SB = 12; { Schwarz - Bauer } F_SS = 13; { Schwarz - Springer } F_SL = 14; { Schwarz - Läufer } [color=gray] F_STb = 15; { Schwarz - Turm (noch nicht bewegt) }[/color] F_ST = 16; { Schwarz - Turm } F_SD = 17; { Schwarz - Dame } [color=gray] F_SKb = 18; { Schwarz - König (noch nicht bewegt) }[/color] F_SK = 19; { Schwarz - König } [b]Var[/b] Spielfeld: [b]Array[/b][1..8, 1..8] [b]of[/b] Byte; Zuweisung und auslesen ist wie bei jedem anderen Array auch:
Delphi-Quellcode:
Abfragen:
Spielfeld[2, 1] := F_WS;
Delphi-Quellcode:
(Die Zahlen können natürlich auch durch die oben definierten Konstanten ersetzt werden)
Case Spielfeld[X, Y] of
0: ... { Feld ist leer } 1..9: ... { weiße Figur } 11..19: ... { schwarze Figur } End; Feld zeichnen:
Delphi-Quellcode:
Könnte mich zwar noch weiter auslassen, hab aber keine Lust dazu. Es steckt schließlich ein Haufen Arbeit drin, und jetzt einfach alles zu verschenken kommt nicht in Frage.
For X := 1 to 8 do
For Y := 1 to 8 do Case Spielfeld[X, Y] of 0: ... { leeres Feld zeichnen } 1, 2: ... { weißen Bauern zeichnen } 3: ... { weißen Springer zeichnen } 4: ... { weißen Läufer zeichen } ... 18, 19: ... { schwarzen König zeichnen } End; Hab mal einen meiner alten Ansätze ausgekramt. Das ist eine reine Singelplayerversion, da das Setup zum Benutzerwechsel nicht enthalten ist. Da dort die KI nicht drinn ist, wird Schwarz nie ziehen.
http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Schachbrett - Komprnenten ansprechen
Thx für all die antworten, aus allem zusammen werd ich's schon irgendwie hinkriegen. :wiejetzt: :coder:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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