void AutoPlay_Stopped(object sender, EventArgs e) { Board = CurrentBoard.Clone(); EvaluationValue = CurrentEvaluationValue; this.lastPlayedTime = DateTime.Now; }
/// <summary> /// 可能なら変化の自動再生を開始します。 /// </summary> /// <remarks> /// GUIスレッドで呼んでください。 /// </remarks> private void PlayVariation(VariationInfo variation, IEnumerable <BoardMove> bmoveList) { if (true) { return; } var shogi = Global.ShogiControl; if (shogi == null || shogi.AutoPlayState == AutoPlayState.Playing) { return; } // 引数にBoardを渡すことで、Boardそのものを変えながら // 自動再生を行うようにします。 var board = CurrentBoard.Clone(); var autoPlay = new AutoPlay(board, bmoveList) { IsChangeBackground = true, EndingInterval = TimeSpan.FromSeconds(0.1), }; autoPlay.Stopped += AutoPlay_Stopped; // 評価値を表示している変化に合わせます。 EvaluationValue = variation.Value; // 再生済みフラグを立ててしまいます。 variation.IsShowed = true; Board = board; shogi.StartAutoPlay(autoPlay); }
/// <summary> /// 現局面の指し手を進めます。 /// </summary> public void DoMove(BoardMove bmove, int seconds) { var prevCurrentBoard = CurrentBoard.Clone(); // 符号は設定されていないことがあります。 //csaMove.Side = CurrentBoard.Turn; /*var bmove = CurrentBoard.ConvertCsaMove(csaMove); * if (bmove == null || !bmove.Validate()) * { * Log.Error("{0}手目 {1}を変換できませんでした。", * CurrentBoard.MoveCount, * csaMove.ToPersonalString()); * return; * }*/ if (!CurrentBoard.DoMove(bmove)) { Log.Error("{0}手目 {1}を指せませんでした。", CurrentBoard.MoveCount, bmove); return; } // 手番側の残り時間を減らしたのち、手番を入れ替えます。 DecBaseLeaveTime(CurrentTurn, seconds); InitBoard(CurrentBoard, false, false); WPFUtil.UIProcess(() => { // 実際に指した手と一致する変化は残します。 var list = VariationList .Where(_ => _.MoveList.Count() >= 2) .Where(_ => bmove.Equals(_.MoveList[0])) .Select(_ => new VariationInfo { IsShowed = false, MoveList = _.MoveList.Skip(1).ToList(), Value = _.Value, NodeCount = _.NodeCount, }) .ToList(); VariationList.Clear(); list.ForEach(_ => VariationList.Add(_)); // 指し手の再生を行います。 AddDoMoveAutoPlay(prevCurrentBoard, bmove); }); }
public void MakeMove(ChessMove move) { PreviousMove = move; PreviousBoard = CurrentBoard.Clone(); CurrentBoard.MakeMove(move); if (CurrentPlayerColor == ChessColor.White) { CurrentPlayerColor = ChessColor.Black; } else { CurrentPlayerColor = ChessColor.White; } }
private IEnumerable <BoardMove> GetVariationMoveList(VariationInfo variation) { var board = CurrentBoard.Clone(); var bmoveList = new List <BoardMove>(); foreach (var bmove in variation.MoveList) { if (!board.DoMove(bmove)) { break; } bmoveList.Add(bmove); } // 7手以下の場合は、再生しません。 return(bmoveList.Count < 7 ? null : bmoveList); }