本文整理汇总了C#中Portfish.Position.material_key方法的典型用法代码示例。如果您正苦于以下问题:C# Position.material_key方法的具体用法?C# Position.material_key怎么用?C# Position.material_key使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Portfish.Position
的用法示例。
在下文中一共展示了Position.material_key方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: probe
/// MaterialTable::material_info() takes a position object as input,
/// computes or looks up a MaterialInfo object, and returns a pointer to it.
/// If the material configuration is not already present in the table, it
/// is stored there, so we don't have to recompute everything when the
/// same material configuration occurs again.
internal void probe(Position pos, out MaterialEntry e)
{
var key = pos.material_key();
e = this.entries[((uint)key) & Constants.MaterialTableMask];
// If mi->key matches the position's material hash key, it means that we
// have analysed this material configuration before, and we can simply
// return the information we found the last time instead of recomputing it.
if (e.key == key)
{
return;
}
// Initialize MaterialInfo entry
var npm = pos.non_pawn_material(ColorC.WHITE) + pos.non_pawn_material(ColorC.BLACK);
e.value = 0;
e.scalingFunctionWHITE = null;
e.scalingFunctionBLACK = null;
e.spaceWeight = 0;
e.key = key;
e.factorWHITE = e.factorBLACK = ScaleFactorC.SCALE_FACTOR_NORMAL;
e.gamePhase = npm >= MidgameLimit
? PhaseC.PHASE_MIDGAME
: npm <= EndgameLimit
? PhaseC.PHASE_ENDGAME
: (((npm - EndgameLimit) * 128) / (MidgameLimit - EndgameLimit));
// Let's look if we have a specialized evaluation function for this
// particular material configuration. First we look for a fixed
// configuration one, then a generic one if previous search failed.
if ((e.evaluationFunction = Endgame.probeValue(key, out e.evaluationFunctionColor)) != null)
{
return;
}
if (is_KXK(ColorC.WHITE, pos))
{
e.evaluationFunction = Endgame.Endgame_KXK;
e.evaluationFunctionColor = ColorC.WHITE;
return;
}
if (is_KXK(ColorC.BLACK, pos))
{
e.evaluationFunction = Endgame.Endgame_KXK;
e.evaluationFunctionColor = ColorC.BLACK;
return;
}
if ((pos.pieces_PT(PieceTypeC.PAWN) == 0) && (pos.pieces_PT(PieceTypeC.ROOK) == 0)
&& (pos.pieces_PT(PieceTypeC.QUEEN) == 0))
{
// Minor piece endgame with at least one minor piece per side and
// no pawns. Note that the case KmmK is already handled by KXK.
Debug.Assert(
(pos.pieces_PTC(PieceTypeC.KNIGHT, ColorC.WHITE) | pos.pieces_PTC(PieceTypeC.BISHOP, ColorC.WHITE))
!= 0);
Debug.Assert(
(pos.pieces_PTC(PieceTypeC.KNIGHT, ColorC.BLACK) | pos.pieces_PTC(PieceTypeC.BISHOP, ColorC.BLACK))
!= 0);
if (pos.piece_count(ColorC.WHITE, PieceTypeC.BISHOP) + pos.piece_count(ColorC.WHITE, PieceTypeC.KNIGHT)
<= 2
&& pos.piece_count(ColorC.BLACK, PieceTypeC.BISHOP)
+ pos.piece_count(ColorC.BLACK, PieceTypeC.KNIGHT) <= 2)
{
e.evaluationFunction = Endgame.Endgame_KmmKm;
e.evaluationFunctionColor = pos.sideToMove;
return;
}
}
// OK, we didn't find any special evaluation function for the current
// material configuration. Is there a suitable scaling function?
//
// We face problems when there are several conflicting applicable
// scaling functions and we need to decide which one to use.
EndgameScaleFactor sf;
int c;
if ((sf = Endgame.probeScaleFactor(key, out c)) != null)
{
if (c == ColorC.WHITE)
{
e.scalingFunctionWHITE = sf;
}
else
{
e.scalingFunctionBLACK = sf;
}
return;
}
// Generic scaling functions that refer to more then one material
// distribution. Should be probed after the specialized ones.
// Note that these ones don't return after setting the function.
//.........这里部分代码省略.........
示例2: uci_loop
/// Wait for a command from the user, parse this text string as an UCI command,
/// and call the appropriate functions. Also intercepts EOF from stdin to ensure
/// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI
/// commands, the function also supports a few debug commands.
internal static void uci_loop(string args)
{
for (int i = 0; i < 102; i++)
{
StateRingBuf[i] = new StateInfo();
}
Position pos = new Position(StartFEN, false, Threads.main_thread()); // The root position
string cmd, token = string.Empty;
while (token != "quit")
{
if (args.Length > 0)
{
cmd = args;
}
else if (String.IsNullOrEmpty(cmd = Plug.ReadLine())) // Block here waiting for input
{
cmd = "quit";
}
Stack<string> stack = Utils.CreateStack(cmd);
token = stack.Pop();
if (token == "quit" || token == "stop")
{
Search.SignalsStop = true;
Threads.wait_for_search_finished(); // Cannot quit while threads are running
}
else if (token == "ponderhit")
{
// The opponent has played the expected move. GUI sends "ponderhit" if
// we were told to ponder on the same move the opponent has played. We
// should continue searching but switching from pondering to normal search.
Search.Limits.ponder = false;
if (Search.SignalsStopOnPonderhit)
{
Search.SignalsStop = true;
Threads.main_thread().wake_up(); // Could be sleeping
}
}
else if (token == "go")
{
go(pos, stack);
}
else if (token == "ucinewgame")
{ /* Avoid returning "Unknown command" */ }
else if (token == "isready")
{
Plug.Write("readyok");
Plug.Write(Constants.endl);
}
else if (token == "position")
{
set_position(pos, stack);
}
else if (token == "setoption")
{
set_option(stack);
}
else if (token == "validmoves")
{
Search.validmoves(pos, stack);
}
else if (token == "d")
{
pos.print(0);
}
else if (token == "flip")
{
pos.flip();
}
else if (token == "eval")
{
Plug.Write(Evaluate.trace(pos));
Plug.Write(Constants.endl);
}
else if (token == "bench")
{
Benchmark.benchmark(pos, stack);
}
else if (token == "key")
{
Plug.Write("key: ");
Plug.Write(String.Format("{0:X}", pos.key()));
Plug.Write("\nmaterial key: ");
Plug.Write(pos.material_key().ToString());
Plug.Write("\npawn key: ");
Plug.Write(pos.pawn_key().ToString());
Plug.Write(Constants.endl);
}
else if (token == "uci")
{
Plug.Write("id name "); Plug.Write(Utils.engine_info(true));
Plug.Write("\n"); Plug.Write(OptionMap.Instance.ToString());
//.........这里部分代码省略.........
示例3: loop
/// Wait for a command from the user, parse this text string as an UCI command,
/// and call the appropriate functions. Also intercepts EOF from stdin to ensure
/// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI
/// commands, the function also supports a few debug commands.
internal static void loop(string args)
{
for (var i = 0; i < 102; i++)
{
StateRingBuf[i] = new StateInfo();
}
var pos = new Position(StartFEN, false, Threads.main_thread()); // The root position
string cmd, token = string.Empty;
while (token != "quit")
{
if (args.Length > 0)
{
cmd = args;
}
else if (string.IsNullOrEmpty(cmd = Plug.ReadLine())) // Block here waiting for input
{
cmd = "quit";
}
var stack = Utils.CreateStack(cmd);
token = stack.Pop();
if (token == "quit" || token == "stop" || token == "ponderhit")
{
// GUI sends 'ponderhit' to tell us to ponder on the same move the
// opponent has played. In case Signals.stopOnPonderhit is set we are
// waiting for 'ponderhit' to stop the search (for instance because we
// already ran out of time), otherwise we should continue searching but
// switching from pondering to normal search.
if (token != "ponderhit" || Search.SignalsStopOnPonderhit)
{
Search.SignalsStop = true;
Threads.main_thread().notify_one(); // Could be sleeping
}
else
{
Search.Limits.ponder = false;
}
}
else if (token == "go")
{
go(pos, stack);
}
else if (token == "ucinewgame")
{
TT.clear();
}
else if (token == "isready")
{
Plug.Write("readyok");
Plug.Write(Constants.endl);
}
else if (token == "position")
{
set_position(pos, stack);
}
else if (token == "setoption")
{
set_option(stack);
}
else if (token == "validmoves")
{
Search.validmoves(pos, stack);
}
else if (token == "d")
{
pos.print(0);
}
else if (token == "flip")
{
pos.flip();
}
else if (token == "eval")
{
Plug.Write(Evaluate.trace(pos));
Plug.Write(Constants.endl);
}
else if (token == "bench")
{
Benchmark.benchmark(pos, stack);
}
else if (token == "key")
{
Plug.Write("key: ");
Plug.Write(string.Format("{0:X}", pos.key()));
Plug.Write("\nmaterial key: ");
Plug.Write(pos.material_key().ToString());
Plug.Write("\npawn key: ");
Plug.Write(pos.pawn_key().ToString());
Plug.Write(Constants.endl);
}
else if (token == "uci")
{
//.........这里部分代码省略.........