/// <summary> /// Gikouの指し手に変換する /// </summary> /// <param name="move"></param> /// <returns></returns> private static GikouMove ConvertGikouMove(this SBookMove move) { GikouMove gikouMove = new GikouMove(); if (move.Turn == PlayerColor.White) { gikouMove.to = (uint)((move.To.FileOf() * 9) + (8 - move.To.RankOf())); gikouMove.from = (uint)((move.From.FileOf() * 9) + (8 - move.From.RankOf())); gikouMove.promotion = move.Promotion ? 1U : 0; gikouMove.drop = move.MoveType.HasFlag(MoveType.DropFlag) ? 1U : 0; gikouMove.piece = (uint)move.Piece.Opp(); gikouMove.capture = (uint)move.CapturePiece.Opp(); } else { gikouMove.to = (uint)((8 - move.To.FileOf()) * 9 + move.To.RankOf()); gikouMove.from = (uint)((8 - move.From.FileOf()) * 9 + move.From.RankOf()); gikouMove.promotion = move.Promotion ? 1U : 0; gikouMove.drop = move.MoveType.HasFlag(MoveType.DropFlag) ? 1U : 0; gikouMove.piece = (uint)move.Piece; gikouMove.capture = (uint)move.CapturePiece; } return(gikouMove); }
public SBookMove(MoveData movedata, SBookState state) { this.NextState = state; this.Move = SBookMove.MoveFromMoveData(movedata); this.Evalution = SBookMoveEvalution.None; this.Weight = 1; }
/// <summary> /// 局面追加 /// </summary> public void Add(SPosition pos, MoveData moveData, int weight, int value, int depth) { string key = pos.PositionToString(1); SBookState state = this.GetBookState(key); if (state == null) { // 現在の局面がない場合 state = new SBookState(); state.Games = 1; state.WonBlack = 0; state.WonWhite = 0; state.Position = key; this.books.Add(key, state); this.BookStates.Add(state); } if (moveData != null) { pos.Move(moveData); string next_key = pos.PositionToString(1); SBookState next_state = this.GetBookState(next_key); pos.UnMove(moveData, null); if (next_state == null) { next_state = new SBookState(); next_state.Games = 1; next_state.WonBlack = 0; next_state.WonWhite = 0; next_state.Position = next_key; this.books.Add(next_key, next_state); this.BookStates.Add(next_state); } SBookMove m = new SBookMove(moveData, next_state); SBookMove move = state.GetMove(m); if (move == null) { // 指し手が無い場合は追加 m.Weight = weight; m.Value = value; m.Depth = depth; state.AddMove(m); // next_stateのPositionをクリアする next_state.Position = string.Empty; move = m; } } }
private static SBookMove GetNextMove(SBookState bookstate) { if (bookstate == null) { return(null); } int weight = 0; SBookMove next = null; foreach (SBookMove move in bookstate.Moves) { if (move.Weight > weight) { next = move; weight = move.Weight; } } return(next); }
/// <summary> /// Aperyの指し手に変換する /// </summary> /// <param name="move"></param> /// <returns></returns> private static ushort ConvFromToPro(this SBookMove move) { int fromToPro = 0; fromToPro = ((int)MakeSquare(move.To) << AperyBook.ToShift); if (move.MoveType.HasFlag(MoveType.DropFlag)) { fromToPro |= (AperyBook.DropOfs + (int)move.Piece.TypeOf().ConvAperyPieceType()) << AperyBook.FromShift; } else { fromToPro |= (int)MakeSquare(move.From) << AperyBook.FromShift; if (move.MoveType.HasFlag(MoveType.Promotion)) { fromToPro |= AperyBook.PromoBit; } } return((ushort)fromToPro); }
// 指し手があるかどうか public bool IsContainsMoves(SBookMove move) { return this.Moves.Exists(x => x.Move == move.Move); }
public SBookMove GetMove(SBookMove move) { return this.Moves.Find(x => x.Move == move.Move); }
public void AddMove(SBookMove move) { this.Moves.Add(move); }
/// <summary> /// 指し手の出力 /// </summary> /// <param name="bookstate"></param> /// <param name="position"></param> /// <param name="aperyBook"></param> private static void WriteMoves(SBookState bookstate, SPosition position, StreamWriter wr, int depth) { if (bookstate == null) { return; } if (bookstate.Count != 0) { return; // 既に出力した } int count = 0; foreach (SBookMove move in bookstate.Moves) { if (move.Weight != 0) { count++; } } bookstate.Count++; if (count != 0) { // 局面の出力 wr.WriteLine("sfen " + position.PositionToString(depth)); foreach (SBookMove move in bookstate.Moves) { if (move.Weight != 0) { // 指し手の出力 MoveData moveData = move.GetMoveData(); string next_str = "none"; SBookMove next_move = GetNextMove(move.NextState); if (next_move != null) { MoveData nextMoveData = next_move.GetMoveData(); next_str = Sfen.MoveToString(nextMoveData); } wr.WriteLine("{0} {1} {3} {4} {2}", Sfen.MoveToString(moveData), next_str, move.Weight, move.Value, move.Depth); } } } foreach (SBookMove move in bookstate.Moves) { // 指し手の出力 MoveData moveData = move.GetMoveData(); if (position.Move(moveData)) { // 再帰呼び出し WriteMoves(move.NextState, position, wr, depth + 1); position.UnMove(moveData, null); } } }
public SBookMove GetMove(SBookMove move) { return(this.Moves.Find(x => x.Move == move.Move)); }
// 指し手があるかどうか public bool IsContainsMoves(SBookMove move) { return(this.Moves.Exists(x => x.Move == move.Move)); }