![]() |
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:
|
Re: Schachbrett - Komprnenten ansprechen
Also warum ich eigentlich n kleines Schachspiel proggen will ist:
PS: Dein Schach find ich richtig klasse ! Schicke Figuren und ne tolle Uhr ! |
Re: Schachbrett - Komprnenten ansprechen
Wir haben halt ne Info-Lehrerein, die schafft es, nach einem Quartal immer noch fast bei Ampeln mit 1 Button :shock: und Textfeldern als Leuten (Shapes kennt sie nit, hat sie noch nie mit gearbeitet) zu stehen. Außerdem hat die soviel peil davon, dat ehr der kurs der wat erklären muss :wiejetzt: . Da Muss man sich halt wat einfallen lassen, und da man keine spiele installieren kann, da alles geloggt wird, muss man et eben selbst in die hand nehmen. :coder:
|
Re: Schachbrett - Komprnenten ansprechen
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab noch den Vorgänger gefunden.
Da diese Version nicht mehr bearbeitet wird, aber dennoch zu Schade zum löschen ist, würde ich diese Oberfläche an liebe volle Hände weitergeben. :angle2: Das Programm besteht aber nur aus der Oberfläche und den gesamten Variablendeklaration (Brett, Figuren...) PS: es wird alles selbstgezeichnet (keine fremden Komponenten oder so), sogar die Buttons. (Line, Polygon, TextOut) Die Oberfläche ist eigentlich selbsterklärend. (ähnlich den Hint's steht nach kurzer Zeit unten rechts ein kleiner Text) @MrKnogge, Die Bildchen, die du wolltest, müssten auch in diesem Projekt enthalten sein. ("*.BitMap's") Allerdings dürften dir diese Packete nichts bringen. Sind halt ein selbst entwickeltes Format. Und an die Bilder, die darin enthalten sind kommt man nur über den genauen Verwaltungsnamen (Code) ran. Allerdings hab ich gerade nicht die Codes zu Hand. :oops: Hab dir aber mal ein Prog zum entpacken angehängt. Kannst ja mal dein Glück versuchen. * Verzeichnis = Verzeichnis zum Bildarchiv ohne abschließendes "\", relatieve Pfade möglich - das Feld darf nur nicht leer sein * Datei = Name des Archivs * Code = Verwaltungsname eines Bildes * 'Lesen' = Bild auslesen (ein falscher Code oder so verursacht einen Fehler) http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Schachbrett - Komprnenten ansprechen
Zitat:
Tom (Platz 27549 (oder so) der Weltrangliste ... |
Re: Schachbrett - Komprnenten ansprechen
Hallöle TOM
![]() Zitat:
In meiner privaten Felddefinition gibt es auf den Ausgangsfeldern die entsprechenden Definition für "Bauer bewegt" nicht und auf den restlichen Feldern dafür eben nicht die für "Bauer nicht bewegt". Außerdem hat das noch den Efekt, dass ich nicht mehr abfragen muß wo z.B. ein Bauer steht, da es ja schon aus der Definition heraus vorgeht. (wieder ein paar Befehle eingespart) Da ich noch eine Speicheroptimierung gemacht hab, würde sich das dann sowieso wieder aufheben. :wink: Normaler Weise werden ja 64 Felder ( 8 * 8 ) erzeugt. Verursacht durch das Array[8, 8] welches meistens nicht mal als packed Array definiert ist. Ein Array belegt gleich mal ~260 Bytes, da die Bytes an den Integergrenzen zum schlelleren Zugriff abgelegt sind und daher für ein Byte gleich mal 4 Bytes reserviert werden. (4 Bytes für Zeiger + 64 * 4 Bytes für die Felder) Selbst ein packed Array belegt noch ~68 Bytes, da die Bytes hier direkt aneinander gereiht abgelegt werden und daher für ein Byte zum Glück nur 1 Bytes reserviert wird. (4 Bytes für Zeiger + 64 Bytes für die Felder) Durch eine eigene Komprimierung komme ich aber auf 29 Byte und 2 Bit (also ~30 Byte incl. 6 Bit für sonstige Daten) :mrgreen: [ADD] PS: Dann hab ich ja gleich Einen zum anlernen und testen meiner KI gefunden, wenn sie mal fertig ist. :oops: http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: Schachbrett - Komprnenten ansprechen
Wenn interessiert es, ob ein Schachbrett im Speicher 260 Byte oder 29 Byte belegt? Zum Speichern eines Zuges auf Datenträger benötigst Du eh nur 1 (EIN) Byte.
|
Re: Schachbrett - Komprnenten ansprechen
(Tom) Die Antwort hab'sch wohl ganz übersehn. :oops:
Also das aktive Spielfeld im Ram komprimiere ich nicht - da sind die paar Byte nicht weiter störend und die (De)Komprimierung würde nur Zeit verschwenden. Aber beim Speichern, da macht das schon was aus. (zumindestens, wenn sich dann mal irgendwann die Spielerdaten ansammlen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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