Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Schachprogrammierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.02.2005, 13:53 Uhr
knopfauge



Hallo,

wir beschäftigen uns in der Schule derzeit mit der Schachprogrammierung in C++. Wir sollen in Gruppenarbeit ein Schachprogramm, dass aus den Modulen User Interface, Schachbrett/Figuren, Zugenerator, Zugwahlalgorithmus und Stellungsbewertung besteht, programmieren. Unsere Gruppe beschäftigt sich mit dem Zuggenerator. Jedoch kommen wir nicht so ganz weiter, ich versuche das mal etwas genauer zu erläutern.

Wir bekommen von einer Klasse Schachbrett eine Liste, in der die möglichen Züge jeder Figur gespeichert sind. Jedes Feld hat einen Zeiger auf die jeweilige Figur, die sich auf diesem Feld befindet, um an die Zugmöglichkeiten der Figur und deren Farbe zu kommen. Die Felder sind mit den Zahlen von 0 bis 143 gekennzeichnet, wir haben also ein 12x12 Brett. Die Aufgabe der Klasse Zuggenerator ist nun, die Stellung der Figuren auf dem Schachbrett zu prüfen und nur die gültigen Züge jeder Figur in eine neue Liste zu speichern. Diese Liste wird dann an die Klasse Zugwahlalgorithmus übergeben.

Anmerkungen:

liste = Vom Schachbrett gelieferte Liste mit den Zugmöglichkeiten der Figuren
genListe = Vom Zuggenerator erstellte Liste mit den gültigen Zügen
Ziel = Zielposition der Figur nach einem Zug
Feld = Feld mit Zeiger auf die jeweilige Figur oder auf NULL, wenn es leer ist
ZugHinzufügen = vordefinierte Funktion, um einen Zug zur Liste hinzuzufügen

Ein Zug wird durch die Start- und die Zielposition der Figur dargestellt. Der Zuggenerator muss also prüfen, ob die Zielpositionen gültig sind (ist das Feld leer? Steht dort bereits eine eigene Figur? Steht der König im Schach? Ist eine Rochade noch möglich?).

Ansatz meines Quellcodes
(in übersichtlicher Form: http://home.arcor.de/fabian.liebnow/prog.rar):


C++:
int f;
/* Feldindex von 0 bis 143 */

int z;
/* Zielpositionsindex */

Zugliste Zuggenerator::moeglicheZuege(Schachbrett*Brett);
/* Brett ist ein Objekt der Klasse Schachbrett */

{
Zugliste genListe;
/* genListe wird die neue Liste */

for (f=0; f>143; f++) {
/* Prüfe alle Felder nach Figuren */

if (Brett -> GetFeld(f) != NULL) {
Figur = Brett -> GetFeld(f);
/* Wenn auf dem Feld eine Figur steht ... */

/* Unvollständig / Fehlerhaft */

for (z=0; z>liste[z] ; z++) {
/* Prüfe alle Zugmöglichkeiten der Figur */

if (liste -> GetZiel == LEER) {
/* Wenn das Zielfeld leer ist ...*/

einZug = new Zug;
einZug -> SetFeld(Ziel);
/* Erstelle Zug und setze ihn als gültig */

/* Unvollständig / Fehlerhaft */
}

if (gueltigerZug == true) {
liste.ZugHinzufuegen(einZug);
/* Füge gültigen Zug zur neuen Liste hinzu */

/* Unvollständig / Fehlerhaft */
}
}
}

else {
continue;
/* Prüfe das nächste Feld */

}
}

return genListe;
}



Mein Problem ist nun, ob dieser Quellcode fehlerhaft ist und wie ich die fehlenden/unvollständigen Ansätze am besten realisiere.


Bearbeitung von typecast:

cpp-Tags gesetzt. Das macht die ganze Sache doch ein wenig uebersichtlicher, oder?


Dieser Post wurde am 05.03.2005 um 19:47 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.02.2005, 17:27 Uhr
knopfauge



Ich benötige dringend Hilfe... :>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2005, 17:33 Uhr
Spacelord
Hoffnungsloser Fall


Ich befürchte dein Projekt ist etwas zu umfangreich als dass sich irgend jemand bereit erklären würde dieses Korrektur zu lesen.....

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.02.2005, 23:08 Uhr
knopfauge



Das sind doch nur ein paar Zeilen. Und Korrekturlesen genügt nicht. Mir fehlt noch einiges, was ergänzt werden muss. Aber du magst recht haben. Die Leute haben andere Sorgen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.02.2005, 23:33 Uhr
enno-tyrant
Frag nicht!


dir wurde doch schon geholfen
--
...um etwas zu verstehen muß man wissen wie es funktioniert...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.02.2005, 13:42 Uhr
Th



Hi, ich will dich ja nicht enttäuschen, aber Schachprogrammierung ist etwas komplexer, als die lineare Anordnung der Module, da ein Großteil auf Rekusion (insbesondere bei der KI) beruht. Evtl. ist sich dein Lehrer dieser Komplexität nicht bewußt?

Um alle Zugmöglichkeiten zu bestimmen, muß für jeden Zug überprüft werden, ob der eigene König dann nicht im Schach steht, d.h. für alle gegnerischen Figuren muß überprüft werden, ob sie den König dann schlagen könnten.

In Pseudo-Code sieht das dann so aus:


Code:
for all own figures
    for all possible moves of current figure
       if not IsInChess
           add move to movelist
    endfor
endfor

function IsInChess:
  for all enemy figures
    for all possibe moves of current figure
       if pos of current figure == pos of other king
          return true
  endfor
  return false



d.h. für die Zugberechnung solltet ihr die Position der beiden Könige extra speichern und bei jedem Königszug aktualisieren (natürlich auch bei Rochade)!

P.S.
Falls ihr noch eine KI bauen wollt, solltet ihr euch mal den Alpha-Beta-Pruning Algorithmus anschauen, eine verbesserte Variante des MinMax-Algorithmus.

Dieser Post wurde am 28.02.2005 um 13:44 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.03.2005, 18:17 Uhr
~honk
Gast


schon allein die stellungsbewertung, die dann die werte für den alpha-beta-algo liefern ist derart komplex, dass das kaum als schulprojekt realisiert werden kann. das ist allenfalls in der uni machbar, setzt aber zu fundierter programmierkenntnis noch schacherfahrung voraus...
ich frag mich was sich euer lehrer dabei denkt...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: