1: | qFiguren[eineFigur].doSomeThing or eineFigur.doSomeThing |
1: | unit logik_Schach; |
1: | type TPlayer=record |
1: | if (Player[0].Feld[X,Y]=0)and(Brett[X,Y]<>FIG_NONE) then |
1: | const |
![]() | ||||
hmm, also da bei Schach jetzt nicht so auf Rechenleistung zu achten ist (außer wenn der NPC einen zug macht) würde ich das ganze mehr auf Übersicht machen:
Delphi-Quelltext
in dieses Array schreibst du nach jedem Zug, wo überall angegriffen wird (und wie viele). Dadurch könnte es dir auch später einfacher sein, einen Zug für den PC zu berechnen, denn man sieht sofort, welches Feld wie oft angegriffen ist. Wenn du das für jeden Spieler machst, siehst du z.B. sofort, wann eine Figur ungedeckt ist usw. Delphi-Quelltext
|
Zitat: | ||
Zudem würde ich nicht die gleichen Figuren durch verschiedene Nummern kennzeichnen:
Delphi-Quelltext
ggf eine Ausnahme würde da vielleicht der schwarze/weiße Läufer machen, aber das ist eher ein Stellungsvorteil. |
![]() |
eine nett Idee, aber kompliziert und daher wahrscheinlich leider unbrauchbar: Einerseits muss bei Figuren wie z.B. Dame dann vor einem Zug in jede Richtung dec(Attacks[dame.x, dame.y] und nach einem Zug in jede Richtung inc mit den neuen Koordinaten. Diese strahlenförmige Suche wird dann abgebrochen, wenn eine blockierende Figur gefunden wurde, wie gehabt. |
![]() |
Andererseits musst du bei der Gelegenheit auch auf Abzugsschach prüfen, d.h. schauen, in welchen Richtungen ein Zugstrahl(Dame, Turm, Läufer) blockiert wurde und diesen fortsetzen. |
![]() |
Entscheidend ist aber die bereits von dir genannte Problematik: sobald eine KI verwendet wird, muss dies für jeden simulierten Zug auch mitsimmuliert werden. Die Unit soll, wie gesagt, beliebig ausbaubar sein und dieser Ansatz würde einen Ausbau zur KI blockieren. |
![]() |
Ich nehme mal an, du beziehst dich auf den Wert 32, der hier als Synonym für nil verwendet wird. Eventuell zuerst zur Kompatiblität des Umstiegs auf Zeiger belassen. Sauberer ist es natürlich ohne: "Keine Figur" ist strenggenommen kein Figurentyp. |
1: | Figur=array of TFigur; |
![]() | ||
Man könnte jedem Bauer dann einen "Informations-Record" zuweisen: Delphi-Quelltext
|
Zitat: |
(da du aber bis 32 zählst nimmst du für jeden bauer eine andre zahl) |
1: | type |
![]() |
Edit: Wobei Farbe und Typ sich im Prinzip auch aus der Referenznummer ergeben. Typ setze ich auf 32, wenn die Figur geschlagen wurde. 32 war ursprünglich einfach die erste Zahl außerhalb des Arrays der Figuren und ist hiermit eigentlich zu einem Synonym für nil geworden. Wie o.e., kann ich keine Zeiger verwenden, da bei vorausberechneten Stellungen diese auf ein beliebiges Figurenarray(Infomationsrecords) anwendbar sein sollen. |
1: | Color:=C_BlackColor; |
![]() | ||
hmm, also ich würde statt 32 eine -1 nehmen... |
Zitat: | ||
Edit: ich mag für sowas keine booleans, da man diese nicht einfach aus einem array auslesen kann:
Delphi-Quelltext
bei einem boolean braucht man dann immer if abfragen usw. |
1: | case Typ of //Liegt das Zielfeld im Zugmuster der Figur? |
![]() |
Gute Idee. Leider verwende ich Byte; sollte ich generell auf Shortint umsteigen? |
![]() |
Wenn ich allerdings(was vergleichsweise ständig vorkommt) im logik-Teil auf die Farbe prüen muss, ist das if Farbe = C_BlackColor statt if Farbe. Andererseits wird der code dadurch unleserlich und ich brauche häufiger einen kommentar //Weiss entspricht true. |
![]() |
Edit: Mal was anderes: Wenn das System am Ende auf KI umgerüstet wird, ist es dann nicht günstiger, wenn ich statt dieser methematischen Zugmusterprüfung vordefinierte Arrays [-7..7, -7..7] of Boolean für jede Figur definiere? |
![]() | ||
hmmm, jo, könnte durchaus sinnvoll sein. Beim Bauer ist das nur etwas schwierig...Hmmm, ne, ich denke mal, die allgemeinen Regeln sind besser. Man müsste sich erstmal n Konzept überlegen, wie die KI vorgehen soll. |
![]() |
unter "Logik-Part" verstehe ich auch KI ;) |
![]() |
Edit: Kennt sich jemand mit GNU-Lizenzen aus? Dürfte ich z.B. diese Figur aus den Wikipedia-Comments einfach in mein Programm einbinden, wenn ich es hier gezippt hochladen würde: http://de.wikipedia.org/wiki/Bild:Chess_rdl44.png ? |
![]() | ||
Delphi-Quelltext
|
![]() | ||
Delphi-Quelltext
|
1: | type |
![]() |
Was mich 'n biserl stört, ist die verwenndung von nummern... |
![]() |
BTW2: beim überfliegen deines codes, hatte ich den eindruck, dass hier noch keine logik für die züge vorhanden ist, sondern dass diese unit eher das regelwerk abbildet... das regelwerk ist natürlich elementar, ohne einem funktionierenden macht eine logik auch keinen sinn. von daher eine design frage, willst du für das regelwerk und die logik eine unit verwenden oder diese auf zwei units aufteilen?
das Regelwerk hat sich seit jahrtausenden praktisch nicht verändert (wenn man von der einführung einer zeitbeschränkung (z. b. blitzschach)) absieht. während du wohl noch lange an der logik zur optimierung herumtüfteln kannst... |
1: | const |
![]() |
//Edit: naja, nach deinen arrays musst du sie dann noch nach unten/links spiegeln |
![]() |
Is es denn besser, sie als konstante drin zu haben oder sollte ich sie zur Laufzeit erzeugen? |
![]() |
Is es denn besser, sie als konstante drin zu haben oder sollte ich sie zur Laufzeit erzeugen? |
![]() |
weshalb machst du denn nicht aus jeder figur ein objekt, welches weiss, wie es ziehen kann? |
![]() | ||
Da sind wir wieder beim selben Problem: Wie prüft das Objekt denn dann sein Zielfeld, per Array oder per Formel? |
![]() | ||||
hier würde ich ein objekt erstellen, TBrett, bei dem sich jede Figur registriert und bei verlassen sein feld als frei kennzeichnet. |
1: | TFeldArray = array[0..7, 0..7] of FigurIndex; |
![]() | ||
:nixweiss: das ist eigentlich egal. Ich würde ja alle Werte usw. in eine extra Unit packen. |
![]() | ||
Ist alles bereits so implementiert, nur einen Grund für den Umstieg auf Objekte sehe ich ehrlichgesagt nicht. Delphi-Quelltext
Erfüllt z.B. die Funktion deines Schachbrett-Objektes wunderbar. |
1: | function TFigur.ZugFeld(qFeld: TFeld): Boolean; |
1: | function ZugFeld(qFigur: TFigur, qFeld: TFeld): Boolean; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!