I think I understand it
It's just that I find it difficult to get it right.
But the current version does all 3 cases right! (queen/knight/knight as attacker giving -550, 100 and 100)
Thank you all.
(more testcases welcome but don't feel obliged
see
Moderators: hgm, Rebel, chrisw
-
- Posts: 688
- Joined: Mon Apr 19, 2010 7:07 pm
- Location: Sweden
- Full name: Peter Osterlund
Re: see
I have some test cases I used when implementing SEE in cuckoochess:flok wrote:(more testcases welcome but don't feel obliged :-)
https://github.com/peterosterlund2/droi ... .java#L276
In complicated cases the SEE value may depend on your implementation though. This can happen when there are multiple X-ray threats to the target square.
-
- Posts: 1221
- Joined: Wed Mar 08, 2006 8:28 pm
- Location: Florida, USA
Re: see
http://www.chessprogramming.net - Maverick Chess Engine
-
- Posts: 931
- Joined: Tue Mar 09, 2010 3:46 pm
- Location: New York
- Full name: Álvaro Begué (RuyDos)
Re: see
That makes no sense. A [non-promoting] capture can't have an SEE value higher than the value of the captured piece, because the opponent could just stand pat after it.flok wrote:I would say +975.
(for pawn 100, knight 325, bishop 325, rook 500, queen 975, king 10000)
Re: see
Hi Steve,
I followed your post -leaving out the early bailouts for now.
That works in some cases but not all. E.g. [d]8/2q2k2/4rb2/4pR2/5P2/3N4/Q7/4K3 w - - 0 1[/d] gives 1200.
It's probably due to that threshold. My question now is: what is the value of the threshold compared to the piece values?
I followed your post -leaving out the early bailouts for now.
That works in some cases but not all. E.g. [d]8/2q2k2/4rb2/4pR2/5P2/3N4/Q7/4K3 w - - 0 1[/d] gives 1200.
It's probably due to that threshold. My question now is: what is the value of the threshold compared to the piece values?
Code: Select all
// xy are of the victim
int Scene::getSEE(const int x, const int y, const ChessPiece *const attacker) const
{
const ChessPiece *const victim = b.getAt(x, y);
const PlayerColor c = attacker -> getColor();
// bit 0...15: if set, then a white piece can walk over and/or attack this field, 16...31 black
const uint32_t bits = ss.back().tcs.cells[y][x];
int see_val = victim -> getEvalVal();
int trophy_val = attacker -> getEvalVal();
PlayerColor sc = opponentColor(c);
int so[] = { 0, 16 }; // where to start to search in the bit pattern. so[0] is for white
constexpr int soe[] = { 16, 32 }; // where to stop searching. soe[0] is for white
for(; so[sc] < soe[sc];) {
// find a 1 bit
while((bits & (1 << so[sc])) == 0) {
// if end of pattern, stop searching
if (++so[sc] == soe[sc])
break;
}
if (so[sc] >= soe[sc])
break;
if (sc == c)
see_val += trophy_val;
else
see_val -= trophy_val;
// get eval val. bit number is an index in pieces[color][index] pointing to the
// piece.
trophy_val = sc == WHITE ? pieces[sc][so[sc]] -> getEvalVal() : pieces[sc][so[sc] - 16] -> getEvalVal();
// on to the next bit!
so[sc]++;
sc = opponentColor(sc);
}
return see_val;
}