本文整理汇总了C++中Position::Ep方法的典型用法代码示例。如果您正苦于以下问题:C++ Position::Ep方法的具体用法?C++ Position::Ep怎么用?C++ Position::Ep使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Position
的用法示例。
在下文中一共展示了Position::Ep方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Mirror
void Position::Mirror()
{
Position old = *this;
Clear();
for (int f = 0; f < 64; f++)
{
PIECE p = old[f];
if (p == NOPIECE) continue;
Put(FLIP[f], p ^ 1);
if (p == KW)
m_Kings[BLACK] = FLIP[f];
else if (p == KB)
m_Kings[WHITE] = FLIP[f];
}
m_side = old.Side() ^ 1;
m_fifty = old.Fifty();
if (old.Ep() != NF) m_ep = FLIP[old.Ep()];
m_ply = old.Ply();
int bit0 = old.m_castlings & 0x01;
int bit1 = (old.m_castlings & 0x02) >> 1;
int bit2 = (old.m_castlings & 0x04) >> 2;
int bit3 = (old.m_castlings & 0x08) >> 3;
int bit4 = (old.m_castlings & 0x10) >> 4;
int bit5 = (old.m_castlings & 0x20) >> 5;
int bit6 = (old.m_castlings & 0x40) >> 6;
int bit7 = (old.m_castlings & 0x80) >> 7;
m_castlings = static_cast<U8>((bit5 << 7) | (bit4 << 6) | (bit7 << 5) | (bit6 << 4) | (bit1 << 3) | (bit0 << 2) | (bit3 << 1) | (bit2 << 0));
}
示例2: GenCheckEvasions
void MoveList::GenCheckEvasions(const Position& pos)
{
Clear();
COLOR side = pos.Side();
COLOR opp = side ^ 1;
U64 freeOrOpp = ~pos.BitsAll(side);
U64 occ = pos.BitsAll();
U64 x, y;
FLD from, to;
PIECE piece, captured;
FLD K = pos.King(side);
U64 attackers = pos.GetAttacks(K, opp, occ);
U64 mask = attackers;
while (attackers)
{
from = PopLSB(attackers);
mask |= BB_BETWEEN[from][K];
}
int fwd = -8 + 16 * side;
int second = 6 - 5 * side;
int seventh = 1 + 5 * side;
piece = PW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
int row = Row(from);
to = static_cast<FLD>(from + fwd);
if (!pos[to])
{
if (row == second)
{
if (BB_SINGLE[to] & mask)
Add(from, to, piece);
to = static_cast<FLD>(to + fwd);
if (!pos[to])
{
if (BB_SINGLE[to] & mask)
Add(from, to, piece);
}
}
else if (row == seventh)
{
if (BB_SINGLE[to] & mask)
{
Add(from, to, piece, NOPIECE, QW | side);
Add(from, to, piece, NOPIECE, RW | side);
Add(from, to, piece, NOPIECE, BW | side);
Add(from, to, piece, NOPIECE, NW | side);
}
}
else
{
if (BB_SINGLE[to] & mask)
Add(from, to, piece);
}
}
y = BB_PAWN_ATTACKS[from][side] & pos.BitsAll(opp) & mask;
while (y)
{
to = PopLSB(y);
captured = pos[to];
if (row == seventh)
{
Add(from, to, piece, captured, QW | side);
Add(from, to, piece, captured, RW | side);
Add(from, to, piece, captured, BW | side);
Add(from, to, piece, captured, NW | side);
}
else
Add(from, to, piece, captured);
}
}
to = pos.Ep();
if (to != NF)
{
y = BB_PAWN_ATTACKS[to][opp] & pos.Bits(PW | side);
while (y)
{
from = PopLSB(y);
Add(from, to, piece, PW | opp);
}
}
piece = NW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
y = BB_KNIGHT_ATTACKS[from] & freeOrOpp & mask;
//.........这里部分代码省略.........
示例3: GenCaptures
void MoveList::GenCaptures(const Position& pos, bool genChecks)
{
Clear();
COLOR side = pos.Side();
COLOR opp = side ^ 1;
U64 targets = pos.BitsAll(opp);
U64 occ = pos.BitsAll();
U64 free = ~occ;
U64 checksN = 0, checksB = 0, checksR = 0, checksQ = 0;
FLD Kopp = pos.King(opp);
if (genChecks)
{
checksN = BB_KNIGHT_ATTACKS[Kopp] & free;
checksB = BishopAttacks(Kopp, occ) & free;
checksR = RookAttacks(Kopp, occ) & free;
checksQ = checksB | checksR;
}
U64 x, y;
FLD from, to;
PIECE piece, captured;
int fwd = -8 + 16 * side;
int seventh = 1 + 5 * side;
piece = PW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
int row = Row(from);
to = static_cast<FLD>(from + fwd);
if (!pos[to])
{
if (row == seventh)
{
Add(from, to, piece, NOPIECE, QW | side);
Add(from, to, piece, NOPIECE, RW | side);
Add(from, to, piece, NOPIECE, BW | side);
Add(from, to, piece, NOPIECE, NW | side);
}
}
y = BB_PAWN_ATTACKS[from][side] & pos.BitsAll(opp);
while (y)
{
to = PopLSB(y);
captured = pos[to];
if (row == seventh)
{
Add(from, to, piece, captured, QW | side);
Add(from, to, piece, captured, RW | side);
Add(from, to, piece, captured, BW | side);
Add(from, to, piece, captured, NW | side);
}
else
Add(from, to, piece, captured);
}
}
to = pos.Ep();
if (to != NF)
{
y = BB_PAWN_ATTACKS[to][opp] & pos.Bits(PW | side);
while (y)
{
from = PopLSB(y);
Add(from, to, piece, PW | opp);
}
}
piece = NW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
y = BB_KNIGHT_ATTACKS[from] & (targets | checksN);
while (y)
{
to = PopLSB(y);
captured = pos[to];
Add(from, to, piece, captured);
}
}
piece = BW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
y = BishopAttacks(from, occ) & (targets | checksB);
while (y)
{
to = PopLSB(y);
captured = pos[to];
Add(from, to, piece, captured);
//.........这里部分代码省略.........
示例4: GenAllMoves
void MoveList::GenAllMoves(const Position& pos)
{
Clear();
COLOR side = pos.Side();
COLOR opp = side ^ 1;
U64 freeOrOpp = ~pos.BitsAll(side);
U64 occ = pos.BitsAll();
U64 x, y;
FLD from, to;
PIECE piece, captured;
int fwd = -8 + 16 * side;
int second = 6 - 5 * side;
int seventh = 1 + 5 * side;
piece = PW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
int row = Row(from);
to = static_cast<FLD>(from + fwd);
if (!pos[to])
{
if (row == second)
{
Add(from, to, piece);
to = static_cast<FLD>(to + fwd);
if (!pos[to])
Add(from, to, piece);
}
else if (row == seventh)
{
Add(from, to, piece, NOPIECE, QW | side);
Add(from, to, piece, NOPIECE, RW | side);
Add(from, to, piece, NOPIECE, BW | side);
Add(from, to, piece, NOPIECE, NW | side);
}
else
Add(from, to, piece);
}
y = BB_PAWN_ATTACKS[from][side] & pos.BitsAll(opp);
while (y)
{
to = PopLSB(y);
captured = pos[to];
if (row == seventh)
{
Add(from, to, piece, captured, QW | side);
Add(from, to, piece, captured, RW | side);
Add(from, to, piece, captured, BW | side);
Add(from, to, piece, captured, NW | side);
}
else
Add(from, to, piece, captured);
}
}
to = pos.Ep();
if (to != NF)
{
y = BB_PAWN_ATTACKS[to][opp] & pos.Bits(PW | side);
while (y)
{
from = PopLSB(y);
Add(from, to, piece, PW | opp);
}
}
piece = NW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
y = BB_KNIGHT_ATTACKS[from] & freeOrOpp;
while (y)
{
to = PopLSB(y);
captured = pos[to];
Add(from, to, piece, captured);
}
}
piece = BW | side;
x = pos.Bits(piece);
while (x)
{
from = PopLSB(x);
y = BishopAttacks(from, occ) & freeOrOpp;
while (y)
{
to = PopLSB(y);
captured = pos[to];
Add(from, to, piece, captured);
}
//.........这里部分代码省略.........
示例5: GenCheckEvasions
void MoveList::GenCheckEvasions(const Position& pos)
{
Clear();
COLOR side = pos.Side();
COLOR opp = side ^ 1;
U64 freeOrOpp = ~pos.BitsAll(side);
U64 occ = pos.BitsAll();
U64 x, y;
FLD from, to;
PIECE piece, captured;
FLD K = pos.King(side);
U64 attackers = pos.GetAttacks(K, opp, occ);
U64 mask = attackers;
while (attackers)
{
from = Bitboard::PopLSB(attackers);
mask |= Bitboard::Between(from, K);
}
int fwd = -8 + 16 * side;
int second = 6 - 5 * side;
int seventh = 1 + 5 * side;
piece = PW | side;
x = pos.Bits(piece);
while (x)
{
from = Bitboard::PopLSB(x);
int row = Row(from);
to = static_cast<FLD>(from + fwd);
if (!pos[to])
{
if (row == second)
{
if (Bitboard::Single(to) & mask)
Add(from, to, piece);
to = static_cast<FLD>(to + fwd);
if (!pos[to])
{
if (Bitboard::Single(to) & mask)
Add(from, to, piece);
}
}
else if (row == seventh)
{
if (Bitboard::Single(to) & mask)
{
Add(from, to, piece, NOPIECE, QW | side);
Add(from, to, piece, NOPIECE, RW | side);
Add(from, to, piece, NOPIECE, BW | side);
Add(from, to, piece, NOPIECE, NW | side);
}
}
else
{
if (Bitboard::Single(to) & mask)
Add(from, to, piece);
}
}
y = Bitboard::PawnAttacks(from, side) & pos.BitsAll(opp) & mask;
while (y)
{
to = Bitboard::PopLSB(y);
captured = pos[to];
if (row == seventh)
{
Add(from, to, piece, captured, QW | side);
Add(from, to, piece, captured, RW | side);
Add(from, to, piece, captured, BW | side);
Add(from, to, piece, captured, NW | side);
}
else
Add(from, to, piece, captured);
}
}
to = pos.Ep();
if (to != NF)
{
y = Bitboard::PawnAttacks(to, opp) & pos.Bits(PW | side);
while (y)
{
from = Bitboard::PopLSB(y);
Add(from, to, piece, PW | opp);
}
}
piece = NW | side;
x = pos.Bits(piece);
while (x)
{
from = Bitboard::PopLSB(x);
y = Bitboard::KnightAttacks(from) & freeOrOpp & mask;
//.........这里部分代码省略.........