Hallo Reinhold
Dem kann ich mich anschliessen. Es wundert mich immer wieder, welche
Vorschläge daherkommen, um das "normale" Schach zu verändern.
Gruss
Kurt
> Da generiere ich mit ChatGPT für das Forum ein rudimentäres Schachprogramm und keiner kompiliert es oder geht darauf ein. Welche Ignoranz!
alphabeta_tt()
und sort_moves_heuristic()
. Man findet sie in vorausgegangenen Posts. Aber als beim nächsten Kompilierversuch weitere Funktionen fehlten (insbesondere die für die Hash-Tabellen), stellte ich meine Versuche erstmal ein. Vermutlich würde ich Funktionen mit diesen Namen in anderen Posts finden, wäre aber im Ungewissen, ob diese so ergänzten Funktionen auch die erwartete Funktionalität liefern würden.// Springerbewegung
Bitboard knight_moves(int sq) {
Bitboard bb = 0;
int r = sq / 8, f = sq % 8;
int dr[8] = {-2,-1,1,2,2,1,-1,-2};
int df[8] = {1,2,2,1,-1,-2,-2,-1};
for (int i = 0; i < 8; i++) {
int nr = r + dr, nf = f + df;
if (nr >= 0 && nr < 8 && nf >= 0 && nf < 8)
SET_BIT(bb, nr * 8 + nf);
}
return bb;
}
Bitboard bb = pos.pieces(Us, KNIGHT);
while (bb)
{
Square from = pop_lsb(bb);
Bitboard b = attacks_bb<KNIGHT>(from, pos.pieces()) & target;
while (b)
*moveList++ = Move(from, pop_lsb(b));
}
return moveList;
Bitboard b = attacks_bb<KNIGHT>(from, pos.pieces()) & target;
moveList
übertragen.attacks_bb<KNIGHT>()
ist dabei ein beim Programmstart vorberechnetes Bitboard, das für alle 64 möglichen Felder erzeugt wird.
>attacks_bb<KNIGHT>() ist dabei ein beim Programmstart vorberechnetes Bitboard, das für alle 64 möglichen Felder erzeugt wird.
attacks_bb<KNIGHT>()
wäre nach meinem Verständnis - analog C - eine Funktion, deren - und das wäre für mich dann spezifisch C++ - eine ihrer Aufruf-Variablen (welche auch immer, da gucke ich schon wieder wie die Sau ins Uhrwerk) mit der Konstanten KNIGHT vorbesetzt ist. Der Compiler soll damit informiert werden, dass diese Variable ein bestimmter konstanter Wert ist.Bitboard b = attacks_bb<KNIGHT>(from, pos.pieces()) & target;
,from
erreichbar sind. In target
müssten dafür alle Bits gesetzt sein, die für freie Felder stehen. Dann können sie in der nächsten Schleife in die Zugliste moveList
eingetragen werden. Mit der Funktion pop_lsb(bb)
müsste dafür bei jedem Aufruf das nächste gesetzte Bit des übergebenen Bitboards zurückgegeben werden (die to
-Felder sozusagen) und im übergebenen Bitboard auf 0 gesetzt werden, damit beim nächsten Aufruf das nächste Bit geholt werden kann. Ist das Bitboard schließlich leer, sind alle Züge übertragen. Damit wären dann alle Nicht-Schlagzüge gefunden. Für Schlagzüge müsste die Logik noch ergänzt werden, um zu speichern, welcher Figurentyp geschlagen wurde. Das am besten in einer eigenen Funktion.target
Bitboard einfach mit dem Bitboard für die gegnerischen Figuren ersetzt.template<Color Us, PieceType Pt>
ExtMove* generate_moves(const Position& pos, ExtMove* moveList, Bitboard target)
Color us
(für die Seite, die am Zug ist) und die Figurenart PieceType Pt
.uci
id name FinalBitboardEngine
id author Du
uciok
go depth 5
bestmove a1a1
uci
und go depth 5
waren meine Eingaben.FinalBitboardEngine
einen Zug finden soll, gibt sie bestmove a1a1
aus.Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill