本文整理汇总了C#中Position.is_chess960方法的典型用法代码示例。如果您正苦于以下问题:C# Position.is_chess960方法的具体用法?C# Position.is_chess960怎么用?C# Position.is_chess960使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Position
的用法示例。
在下文中一共展示了Position.is_chess960方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: pv
/// UCI::pv() formats PV information according to the UCI protocol. UCI requires
/// that all (if any) unsearched PV lines are sent using a previous search score.
internal static string pv(Position pos, Depth depth, ValueT alpha, ValueT beta)
{
var ss = new StringBuilder();
var elapsed = TimeManagement.elapsed() + 1;
var multiPV = Math.Min(int.Parse(OptionMap.Instance["MultiPV"].v), Search.RootMoves.Count);
var selDepth = ThreadPool.threads.Select(th => th.maxPly).Concat(new[] {0}).Max();
for (var i = 0; i < multiPV; ++i)
{
var updated = (i <= Search.PVIdx);
if (depth == Depth.ONE_PLY && !updated)
{
continue;
}
var d = updated ? depth : depth - Depth.ONE_PLY;
var v = updated ? Search.RootMoves[i].score : Search.RootMoves[i].previousScore;
var tb = Tablebases.RootInTB && Math.Abs(v) < Value.VALUE_MATE - _.MAX_PLY;
v = tb? Tablebases.Score : v;
ss.Append($"info depth {d/Depth.ONE_PLY} seldepth {selDepth} multipv {i + 1} score {value(v)}");
if (!tb && i == Search.PVIdx)
{
ss.Append(v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : "");
}
ss.Append($" nodes {pos.nodes_searched()} nps {pos.nodes_searched()*1000/elapsed}");
if (elapsed > 1000) // Earlier makes little sense
ss.Append($" hashfull {TranspositionTable.hashfull()}");
ss.Append($" tbhits {Tablebases.Hits} time {elapsed} pv");
foreach (var m in Search.RootMoves[i].pv)
{
ss.Append($" {move(m, pos.is_chess960())}");
}
}
return ss.ToString();
}
示例2: to_move
/// UCI::to_move() converts a string representing a move in coordinate notation
/// (g1f3, a7a8q) to the corresponding legal Move, if any.
private static MoveT to_move(Position pos, string str)
{
if (str.Length == 5) // Junior could send promotion piece in uppercase
{
var chars = str.ToCharArray();
chars[4] = Position.tolower(str[4]);
str = new string(chars);
}
var ml = new MoveList(GenType.LEGAL, pos);
for (var index = ml.begin(); index < ml.end(); index++)
{
var extMove = ml.moveList.table[index];
if (str == move(extMove, pos.is_chess960()))
{
return extMove;
}
}
return Move.MOVE_NONE;
}
示例3: search
//.........这里部分代码省略.........
// Loop through all pseudo-legal moves until no moves remain or a beta cutoff occurs
while ((move = mp.next_move(SpNode)) != Move.MOVE_NONE)
{
Utils.WriteToLog($"mp.next_move = {(int) move}");
Debug.Assert(Move.is_ok(move));
if (move == excludedMove)
continue;
// At root obey the "searchmoves" option and skip moves not listed in Root
// Move List. As a consequence any illegal move is also skipped. In MultiPV
// mode we also skip PV moves which have been already searched.
if (RootNode && RootMoves.All(rootMove => rootMove.pv[0] != move))
continue;
if (SpNode)
{
// Shared counter cannot be decremented later if the move turns out to be illegal
if (!pos.legal(move, ci.pinned))
continue;
stack.moveCount = moveCount = ++splitPoint.moveCount;
ThreadHelper.lock_release(splitPoint.spinLock);
}
else
stack.moveCount = ++moveCount;
if (RootNode)
{
Signals.firstRootMove = (moveCount == 1);
if (thisThread == ThreadPool.main() && TimeManagement.elapsed() > 3000)
Output.WriteLine(
$"info depth {depth/Depth.ONE_PLY} currmove {UCI.move(move, pos.is_chess960())} currmovenumber {moveCount + PVIdx}");
}
if (PvNode)
stackPlus1.pv = new List<MoveT>();
var extension = Depth.DEPTH_ZERO;
var captureOrPromotion = pos.capture_or_promotion(move);
var givesCheck = Move.type_of(move) == MoveType.NORMAL && ci.dcCandidates == 0
? Bitboard.AndWithSquare(ci.checkSquares[Piece.type_of(pos.piece_on(Move.from_sq(move)))], Move.to_sq(move))!=0
: pos.gives_check(move, ci);
// Step 12. Extend checks
if (givesCheck && pos.see_sign(move) >= Value.VALUE_ZERO)
extension = Depth.ONE_PLY;
// Singular extension search. If all moves but one fail low on a search of
// (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
// is singular and should be extended. To verify this we do a reduced search
// on all the other moves but the ttMove and if the result is lower than
// ttValue minus a margin then we extend the ttMove.
if (singularExtensionNode
&& move == ttMove
&& extension == 0
&& pos.legal(move, ci.pinned))
{
var rBeta = ttValue - 2*depth/Depth.ONE_PLY;
stack.excludedMove = move;
stack.skipEarlyPruning = true;
value = search(NodeType.NonPV, false, pos, ss, rBeta - 1, rBeta, depth/2, cutNode);
stack.skipEarlyPruning = false;
stack.excludedMove = Move.MOVE_NONE;
示例4: perft
/// Search::perft() is our utility to verify move generation. All the leaf nodes
/// up to the given depth are generated and counted and the sum returned.
internal static long perft(bool Root, Position pos, Depth depth)
{
var st = new StateInfo();
long nodes = 0;
var ci = new CheckInfo(pos);
var leaf = (depth == 2*Depth.ONE_PLY);
var ml = new MoveList(GenType.LEGAL, pos);
for (var index = ml.begin(); index < ml.end(); index++)
{
var m = ml.moveList.table[index];
long cnt;
if (Root && depth <= Depth.ONE_PLY_C)
{
cnt = 1;
nodes++;
}
else
{
pos.do_move(m, st, pos.gives_check(m, ci));
cnt = leaf ? new MoveList(GenType.LEGAL, pos).size() : perft(false, pos, depth - Depth.ONE_PLY);
nodes += cnt;
pos.undo_move(m);
}
if (Root)
{
Output.WriteLine($"{UCI.move(m, pos.is_chess960())}: {cnt}");
}
}
return nodes;
}
示例5: generate_all
internal static ExtMoveArrayWrapper generate_all(
ColorT Us,
GenType Type,
Position pos,
ExtMoveArrayWrapper moveList,
BitboardT target,
CheckInfo ci = null)
{
var Checks = Type == GenType.QUIET_CHECKS;
moveList = generate_pawn_moves(Us, Type, pos, moveList, target, ci);
moveList = generate_moves(PieceType.KNIGHT, Checks, pos, moveList, Us, target, ci);
moveList = generate_moves(PieceType.BISHOP, Checks, pos, moveList, Us, target, ci);
moveList = generate_moves(PieceType.ROOK, Checks, pos, moveList, Us, target, ci);
moveList = generate_moves(PieceType.QUEEN, Checks, pos, moveList, Us, target, ci);
if (Type != GenType.QUIET_CHECKS && Type != GenType.EVASIONS)
{
var ksq = pos.square(PieceType.KING, Us);
var b = pos.attacks_from_PtS(PieceType.KING, ksq) & target;
while (b != 0)
{
(moveList).Add(Move.make_move(ksq, Utils.pop_lsb(ref b)));
}
}
if (Type != GenType.CAPTURES && Type != GenType.EVASIONS && pos.can_castle(Us) != 0)
{
if (pos.is_chess960())
{
moveList = generate_castling(
MakeCastling(Us, CastlingSide.KING_SIDE),
Checks,
true,
pos,
moveList,
Us,
ci);
moveList = generate_castling(
MakeCastling(Us, CastlingSide.QUEEN_SIDE),
Checks,
true,
pos,
moveList,
Us,
ci);
}
else
{
moveList = generate_castling(
MakeCastling(Us, CastlingSide.KING_SIDE),
Checks,
false,
pos,
moveList,
Us,
ci);
moveList = generate_castling(
MakeCastling(Us, CastlingSide.QUEEN_SIDE),
Checks,
false,
pos,
moveList,
Us,
ci);
}
}
return moveList;
}
示例6: evaluate_pieces
// evaluate_pieces() assigns bonuses and penalties to the pieces of a given color
private static ScoreT evaluate_pieces(
PieceTypeT pieceType,
ColorT Us,
bool DoTrace,
Position pos,
EvalInfo ei,
ScoreT[] mobility,
BitboardT[] mobilityArea)
{
int Pt = pieceType;
if (Pt == PieceType.KING)
{
return Score.SCORE_ZERO;
}
var score = Score.SCORE_ZERO;
var NextPt = (Us == Color.WHITE ? pieceType : pieceType + 1);
var Them = (Us == Color.WHITE ? Color.BLACK : Color.WHITE);
ei.attackedBy[Us, Pt] = Bitboard.Create(0);
for(var idx=0; idx<16;idx++)
{
var s = pos.square(pieceType, Us, idx);
if (s == Square.SQ_NONE)
{
break;
}
// Find attacked squares, including x-ray attacks for bishops and rooks
var b = Pt == PieceType.BISHOP
? Utils.attacks_bb_PtSBb(PieceType.BISHOP, s, pos.pieces() ^ pos.pieces_CtPt(Us, PieceType.QUEEN))
: Pt == PieceType.ROOK
? Utils.attacks_bb_PtSBb(
PieceType.ROOK,
s,
pos.pieces() ^ pos.pieces_CtPtPt(Us, PieceType.ROOK, PieceType.QUEEN))
: pos.attacks_from_PtS(pieceType, s);
if (Bitboard.AndWithSquare(ei.pinnedPieces[Us], s)!=0)
{
b &= Utils.LineBB[pos.square(PieceType.KING, Us), s];
}
ei.attackedBy[Us, PieceType.ALL_PIECES] |= ei.attackedBy[Us, Pt] |= b;
if ((b & ei.kingRing[Them])!=0)
{
ei.kingAttackersCount[Us]++;
ei.kingAttackersWeight[Us] += KingAttackWeights[Pt];
var bb = b & ei.attackedBy[Them, PieceType.KING];
if (bb!=0)
{
ei.kingAdjacentZoneAttacksCount[Us] += Bitcount.popcount_Max15(bb);
}
}
if (Pt == PieceType.QUEEN)
{
b &=
~(ei.attackedBy[Them, PieceType.KNIGHT] | ei.attackedBy[Them, PieceType.BISHOP]
| ei.attackedBy[Them, PieceType.ROOK]);
}
var mob = Pt == PieceType.QUEEN
? Bitcount.popcount_Full(b & mobilityArea[Us])
: Bitcount.popcount_Max15(b & mobilityArea[Us]);
mobility[Us] += MobilityBonus[Pt][mob];
if (Pt == PieceType.BISHOP || Pt == PieceType.KNIGHT)
{
// Bonus for outpost square
if (Rank.relative_rank_CtSt(Us, s) >= Rank.RANK_4 && Rank.relative_rank_CtSt(Us, s) <= Rank.RANK_6
&& (pos.pieces_CtPt(Them, PieceType.PAWN) & Utils.pawn_attack_span(Us, s))==0)
{
score +=
Outpost[Pt == PieceType.BISHOP ? 1 : 0][Bitboard.AndWithSquare(ei.attackedBy[Us, PieceType.PAWN], s)!=0 ? 1 : 0];
}
// Bonus when behind a pawn
if (Rank.relative_rank_CtSt(Us, s) < Rank.RANK_5 && Bitboard.AndWithSquare(pos.pieces_Pt(PieceType.PAWN), (s + Square.pawn_push(Us)))!=0)
{
score += MinorBehindPawn;
}
// Penalty for pawns on same color square of bishop
if (Pt == PieceType.BISHOP)
{
score -= BishopPawns*ei.pi.pawns_on_same_color_squares(Us, s);
}
// An important Chess960 pattern: A cornered bishop blocked by a friendly
// pawn diagonally in front of it is a very serious problem, especially
// when that pawn is also blocked.
if (Pt == PieceType.BISHOP && pos.is_chess960()
&& (s == Square.relative_square(Us, Square.SQ_A1) || s == Square.relative_square(Us, Square.SQ_H1)))
{
var d = Square.pawn_push(Us) + (Square.file_of(s) == File.FILE_A ? Square.DELTA_E : Square.DELTA_W);
//.........这里部分代码省略.........