Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schachbrett - Komprnenten ansprechen (https://www.delphipraxis.net/12400-schachbrett-komprnenten-ansprechen.html)

Thorben86 26. Nov 2003 14:54


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 :-)

Treffnix 26. Nov 2003 15:08

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.

MrKnogge 26. Nov 2003 15:25

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 ?

Thorben86 26. Nov 2003 15:36

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:

Wie sieht die Funktion denn aus
:wiejetzt:

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?

Treffnix 26. Nov 2003 15:43

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.

axelf98 26. Nov 2003 16:33

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.

axelf98 26. Nov 2003 16:53

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:
for i := 0 to anzahl-1 do
begin

 Figuren[i].left := .... ;
 Figuren[i].visible := false;

  // usw...
end;
Hier der Code:
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.

Smokey 26. Nov 2003 17:09

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:

himitsu 26. Nov 2003 17:21

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:

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.
Das klingt so, als wenn du die Abfrage einfach weglassen willst - würde ich dir nicht empfehlen.

Und nun zum Thema:

Am bessten lassen sich die Figuren in einem Array speichern;
Deklaration:
Code:
[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;
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.

Zuweisung und auslesen ist wie bei jedem anderen Array auch:
Delphi-Quellcode:
Spielfeld[2, 1] := F_WS;
Abfragen:
Delphi-Quellcode:
Case Spielfeld[X, Y] of
  0: ...     { Feld ist leer }
  1..9: ...  { weiße Figur   }
  11..19: ... { schwarze Figur }
End;
(Die Zahlen können natürlich auch durch die oben definierten Konstanten ersetzt werden)

Feld zeichnen:
Delphi-Quellcode:
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;
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.



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.
  • über "Neu" wird ein neues Spielfeld geladen
  • über "Ende" wird das Programm beendet
  • "Einstellungen" zum ändern der Oberfläche und des Anschlusses (Ohne Treiber, also inaktiv)
  • "Brett drehen" (Brett wird aus privaten Gründen nicht gedreht, sondern gespiegelt)
  • "Editor" startet/beendet den Editormodus
    • Linke Maustaste = Figur setzen/tauschen
    • Mittlere Maustaste / Shift + Linke Maustaste = Figur wechseln
    • Rechte Maustaste = Figur löschen
  • "Sprungfelder" zeigt die möglichen Sprungfelder an
    die Mothode zur Auswahl möglicher Felder hat aber in dieser Version einen kleinen Fehler
    (bei Dame oder König, glaube ich zumindestens)
  • Die anderen Felder im Einstellungsbereich sind selbst erklärend
  • Die untersten eigenartigen Werte im Einstellungsbereich sind für Debugzecke (Anzeigetempo...)
  • Schwarz kann nicht gezogen werden
  • Weiß zieht nur einmal, da ja die KI für schwarz fehlt.
    Das läßt sich aber umgehen, wenn nach dem Zug kurz der Editmodus gestartet und wieder beendet wird, das setzt intern einige Register zurück (deswegen bleibt der Editmodus nach dem 1. Zug auch noch aktiv)

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Thorben86 26. Nov 2003 18:23

Re: Schachbrett - Komprnenten ansprechen
 
Thx für all die antworten, aus allem zusammen werd ich's schon irgendwie hinkriegen. :wiejetzt: :coder:

MrKnogge 26. Nov 2003 18:25

Re: Schachbrett - Komprnenten ansprechen
 
Also warum ich eigentlich n kleines Schachspiel proggen will ist:
  • zum ersten kleines "Schmankerl" für n Chat
  • und desweiteren, weil ich 3 Jahre in nem Schachverein gespielt
    habe, und nun wieder auf den Geschmack gekommen bin.
    (will eben online mit n paar Kumpels zocken)

PS:
Dein Schach find ich richtig klasse !
Schicke Figuren und ne tolle Uhr !

Thorben86 26. Nov 2003 18:28

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:

himitsu 26. Nov 2003 21:10

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
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Tom 27. Nov 2003 00:23

Re: Schachbrett - Komprnenten ansprechen
 
Zitat:

Zitat von himitsu
F_WBb = 1; { Weiß - Bauer (noch nicht bewegt) }

Ein fachlicher Einwand: Ein Bauer ist nicht bewwegt, wenn er auf dem Ausgangsfeld steht. Extra speichern muß man das nicht. Mit Turm/König hast Du ja Recht ...

Tom (Platz 27549 (oder so) der Weltrangliste ...

himitsu 27. Nov 2003 10:40

Re: Schachbrett - Komprnenten ansprechen
 
Hallöle TOM http://www.FrankNStein.de/Smiley-Wolke.gif,

Zitat:

Zitat von TOM
Ein Bauer ist nicht bewwegt, wenn er auf dem Ausgangsfeld steht. Extra speichern muß man das nicht

das ist einfach nur der wegen Richtigkeit so mit in die Definition mit aufgenommen wurden.

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
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Tom 27. Nov 2003 12:44

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.

himitsu 8. Mär 2004 10:59

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 09:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz