Autor |
Beitrag |
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 13.04.08 13:01
Hidden hat folgendes geschrieben: |
Is es denn besser, sie als konstante drin zu haben oder sollte ich sie zur Laufzeit erzeugen?
|
 das ist eigentlich egal. Ich würde ja alle Werte usw. in eine extra Unit packen.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 13.04.08 13:03
weshalb machst du denn nicht aus jeder figur ein objekt, welches weiss, wie es ziehen kann?
ausserdem solltest du auch an die sonderlocken denken, wie z.b. dass ein bauer beim ersten zug, zwei felder ziehen kann, und nachträglich kann er dann auch geschlagen werden (en passant).
für den könig gilt dann auch, kurze und lange rochade, unter der prämisse, dass er noch nicht bewegt wurde, der teilnehmende turm ebenfalls nicht, keine figur im weg steht und er sich nicht dem schach entzieht oder sich ins schach setzt. ausserdem darf der könig kein bedrohtes feld dabei überqueren.
dies wäre aber ein logikburch zu deinem bisherigen code. musst selbst entscheiden, ob du so besser zurande kämmst, oder du das procedureal abbilden möchtest, wie du bereits begonnen hast.
<HTH>
Edit: Rochade konkretisiert.
Zuletzt bearbeitet von Grenzgaenger am So 13.04.08 13:08, insgesamt 1-mal bearbeitet
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 13.04.08 13:07
Hidden hat folgendes geschrieben: | Is es denn besser, sie als konstante drin zu haben oder sollte ich sie zur Laufzeit erzeugen? |
wenn sich die konstanten nicht ändern, was spricht dagegen sie im code als konstanten zu deklarieren? dann kann der compiler auch besser optimieren...
|
|
Hidden 
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 13.04.08 13:16
Grenzgaenger hat folgendes geschrieben: | 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?
[qupte]ausserdem solltest du auch an die sonderlocken denken, wie z.b. dass ein bauer beim ersten zug, zwei felder ziehen kann, und nachträglich kann er dann auch geschlagen werden (en passant).
für den könig gilt dann auch, kurze und lange rochade, unter der prämisse, dass er noch nicht bewegt wurde, der teilnehmende turm ebenfalls nicht, keine figur im weg steht und er sich nicht dem schach entzieht oder sich ins schach setzt.[/quote]
Sonderfälle werden getrennt behandelt.
Zu deinem Edit: genau das meinte ich, danke!
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 13.04.08 13:30
Hidden hat folgendes geschrieben: | Grenzgaenger hat folgendes geschrieben: | 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. da sich je nach feld, unterschiedliche zugmöglichkeiten ergeben, auch im bezug auf die belegten felder, gäbe es für jedes tFigur objekt eine methode GetMoveableFields, welches ein Array oder eine Liste der Feldkoordinaten zurückliefert, auf welches gezogen werden kann. Diese Analyse würde ich algorithmisch implementieren. ausserdem weiss ja jede figur (type tSpringer = class (tFigure)) wie es ziehen kann.
neben der klasse tBrett, gäbe es auch noch eine klasse TList, in welcher alle Figuren aufgeführt wären. So bräuchtest du nicht jedes mal das tBrett durchgehen und alle felder abzufragen um die figuren aufzufordern zu ziehen, seine felder zu ziehen oder zu bewerten. hierfür kannst abstracte methoden in tFigure implementieren, welche für alle abgeleiteten figuren gelten.
<HTH>
BTW: der objektorientierte ansatz ist zwar langsamer, denke zum schluss aber auch übersichtlicher in der implementierung.
|
|
Hidden 
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 13.04.08 14:12
Grenzgaenger hat folgendes geschrieben: | Hidden hat folgendes geschrieben: | Grenzgaenger hat folgendes geschrieben: | 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. |
Ist alles bereits so implementiert, nur einen Grund für den Umstieg auf Objekte sehe ich ehrlichgesagt nicht.
Delphi-Quelltext 1:
| TFeldArray = array[0..7, 0..7] of FigurIndex; |
Erfüllt z.B. die Funktion deines Schachbrett-Objektes wunderbar.
Edit: Sollte ich dieses const Array dann global oder lokal deklarieren, wie setzt der Compiler das um? Deklariere ich es z.B. am anfang einer Methode, könnte es ja sein, dass es jedes Mal neu erzeugt wird. Mir geht es dabei explizit um Laufzeit zu ungunsten von Speicher, die KI soll ja schnell sein!
Edit: Xion hat folgendes geschrieben: | Hidden hat folgendes geschrieben: |
Is es denn besser, sie als konstante drin zu haben oder sollte ich sie zur Laufzeit erzeugen?
|
das ist eigentlich egal. Ich würde ja alle Werte usw. in eine extra Unit packen. |
Also den Kopf der Unit mit den Deklarationen oder wie?
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Hidden 
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 14.04.08 19:45
Hi,
Mir ist heute klargeworden, wie kompliziert man/ich eigentlich schachspielt: Wir haben ein Array "RelevantFigures", das wir für unsere Züge durchgehen und, das wir nach bestimmten Mustern, bzw., wenn der Gegner mit der Figur zieht, aktualisieren. Grundsätzlich setzt sich dieses Array aus den Figuren in unserem Blickfeld zusammen, aber das wäre für einen Computer ziemlich kompliziert...
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Fabian E.
      
Beiträge: 554
Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
|
Verfasst: Mo 14.04.08 20:21
Hidden hat folgendes geschrieben: |
Ist alles bereits so implementiert, nur einen Grund für den Umstieg auf Objekte sehe ich ehrlichgesagt nicht.
Delphi-Quelltext 1:
| TFeldArray = array[0..7, 0..7] of FigurIndex; |
Erfüllt z.B. die Funktion deines Schachbrett-Objektes wunderbar.
|
naja der grund ist ganz einfach. dir fällt ziemlich viel verwaltungsaufwand weg. wenn du schön in OOP ein paar klassen bildest und diese dann noch sauber ableitest muss man sich nach dem implementieren der klassen um fast gar nichts mehr kümmern. deine objekte wüssten selber wohin sie dürfen und wo nicht. sie könnten sich selbständig vom spielfeld entfernen, etc...
gruß
|
|
Hidden 
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 14.04.08 21:52
Hi,
Der erste Unterschied deines Konzeptes wäre, dass sich ein Array[Bauer..Koenig, 0..7, 0..7] in ein Array [0..7, 0..7] verwandeln würde, das für jede Figur anders ist. Der restliche Part deiner Delphi-Quelltext 1:
| function TFigur.ZugFeld(qFeld: TFeld): Boolean; | (gegenüber Delphi-Quelltext 1:
| function ZugFeld(qFigur: TFigur, qFeld: TFeld): Boolean; |
) wäre bei allen Figuren gleich: Prüfen, ob eigene Figur auf dem Feld, Prüfen, ob das Array an den Koordinaten den Wert true hat, auf Abzugsschach prüfen.
Beim, dann folgenden, seperaten Teil für die Sonderfälle werden zwei if-Abfragen gespaart: Prüfen auf König und Prüfen auf Bauern(die zwei Sonderfälle). Die Sonderfallbehandlung ist dann ja auch relativ kurz(13 Zeilen beim Bauern, 2 beim König), ansonsten wäre das ein klarer Übersichtsvorteil.
Die Geschwindigkeitsfrage kann ich nicht beurteilen, aber da du gesagt hast, dass das langsamer wäre, nehme ich mal an, dass diese zwei if-Abfragen da nicht den entscheidenden Trend geben werden. Wie gesagt kommt es bei allen Operationen, die die KI zum Vorrechnen benötigt, in erster Linie auf Schnelligkeit an.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|