public KifuMove(Move nextMove_, KifuNode nextNode_, TimeSpan thinkingTime_, TimeSpan totalTime_) { nextMove = nextMove_; nextNode = nextNode_; thinkingTime = thinkingTime_; totalTime = totalTime_; }
/// <summary> /// 初期化する。new KifuTree()した状態に戻る。 /// </summary> public void Init() { position.InitBoard(); // root nodeを作る currentNode = rootNode = new KifuNode(null); pliesFromRoot = 0; rootBoardType = BoardType.NoHandicap; rootSfen = Position.SFEN_HIRATE; // rootSfenのsetterで初期化されているのでここではKifuList、UsiMoveListの初期化はしない //KifuList = new List<string>(); //UsiMoveList = new List<string>(); // 対局情報などを保存するためにここを確保する。 rootKifuMove = new KifuMove(Move.NONE, rootNode, KifuMoveTimes.Zero); kifuWindowMoves = new List <KifuMove>(); KifuTimeSettings = KifuTimeSettings.TimeLimitless; KifuBranch = -1; // mutableなオブジェクトのraiseは、raiseする側でClone()してimmutableにしておかないと駄目。 RaisePropertyChanged("Position", position.Clone()); }
/// <summary> /// posを1手前の局面に移動する /// </summary> public void UndoMove() { // rootNode以上に遡ることはできない。 Debug.Assert(currentNode != rootNode); // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。 if (!IsSpecialNode()) { position.UndoMove(); // これ、RemoveKifu()で棋譜リストの更新を行うならばKifuListSelectedIndexが変化するので // 再度このイベントが発生する。無駄と言えば無駄だが…。 RaisePropertyChanged("Position", position.Clone()); } --pliesFromRoot; // ここに引っかかるならcurrentNode.prevNodeの設定忘れ。 Debug.Assert(currentNode.prevNode != null); currentNode = currentNode.prevNode; // 棋譜の更新 RemoveKifu(); }
// ------------------------------------------------------------------------- // 局面に対する操作子 // ------------------------------------------------------------------------- // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い /// <summary> /// posの現在の局面から指し手mで進める。 /// mは、currentNodeのもつ指し手の一つであるものとする /// </summary> /// <param name="m"></param> public void DoMove(KifuMove m) { Debug.Assert(m != null); position.DoMove(m.nextMove); currentNode = m.nextNode; // UsiMoveStringList.Add(m.nextMove.ToUsi()); }
/// <summary> /// 初期化する。new KifuTree()した状態に戻る。 /// </summary> public void Init() { position.InitBoard(); currentNode = rootNode = new KifuNode(null); // UsiMoveStringList.Clear(); rootBoardType = BoardType.NoHandicap; rootSfen = Position.SFEN_HIRATE; RaisePropertyChanged("Position", position); }
/// <summary> /// 初期化する。new KifuTree()した状態に戻る。 /// </summary> public void Init() { Debug.Assert(position != null, "Bind(Position)を呼び出してからInit()を呼ぶようにしてください。"); position.InitBoard(); currentNode = rootNode = new KifuNode(null); // UsiMoveStringList.Clear(); rootBoardType = BoardType.NoHandicap; rootSfen = Position.SFEN_HIRATE; }
/// <summary> /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。 /// すでに存在しているなら、その指し手は追加しない。 /// /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。 /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる) /// /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に /// thinkingTimeを秒単位に繰り上げたものが入る。 /// /// moveがspecial moveもありうる。 /// </summary> /// <param name="move"></param> /// <param name="thinkingTime"></param> public void AddNode(Move move, KifuMoveTimes kifuMoveTimes) { var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move); if (m == null) { // -- 見つからなかったので次のnodeを追加してやる KifuNode nextNode = new KifuNode(currentNode); currentNode.moves.Add(new KifuMove(move, nextNode, kifuMoveTimes)); } }
/// <summary> /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。 /// すでに存在しているなら、その指し手は追加しない。 /// /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。 /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる) /// /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に /// thinkingTimeを秒単位に繰り上げたものが入る。 /// </summary> /// <param name="move"></param> /// <param name="thinkingTime"></param> public void Add(Move move, TimeSpan thinkingTime, TimeSpan?totalTime = null) { var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move); if (m == null) { // -- 見つからなかったので次のnodeを追加してやる KifuNode nextNode = new KifuNode(currentNode); currentNode.moves.Add(new KifuMove(move, nextNode, thinkingTime , totalTime ?? TotalConsumptionTime() + RoundTime(thinkingTime))); } }
/// <summary> /// posを1手前の局面に移動する /// </summary> public void UndoMove() { // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。 if (!IsSpecialNode()) { position.UndoMove(); RaisePropertyChanged("Position", position); } --pliesFromRoot; currentNode = currentNode.prevNode; // 棋譜の更新 RemoveKifu(); }
/// <summary> /// posを1手前の局面に移動する /// </summary> public void UndoMove() { // 棋譜の末端にspecial moveを積んでいたのであればそれを取り除く。 if (currentNode.moves.Count != 0 && currentNode.moves[0].nextMove.IsSpecial()) { RemoveKifu(true); } position.UndoMove(); RaisePropertyChanged("Position", position); currentNode = currentNode.prevNode; // 棋譜の更新 RemoveKifu(); }
// ------------------------------------------------------------------------- // 局面に対する操作子 // ------------------------------------------------------------------------- // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い // CurrentNodeが設定されていないと局面を進められない。 /// <summary> /// posの現在の局面から指し手mで進める。 /// mは、currentNodeのもつ指し手の一つであるものとする /// </summary> /// <param name="m"></param> public void DoMove(KifuMove m) { Debug.Assert(m != null); // 棋譜の更新 AddKifu(m.nextMove, m.thinkingTime); position.DoMove(m.nextMove); RaisePropertyChanged("Position", position); currentNode = m.nextNode; // もし次がSpecialMoveの局面に到達したのであれば、棋譜に積む。 if (currentNode.moves.Count != 0 && currentNode.moves[0].nextMove.IsSpecial()) { AddKifuSpecialMove(currentNode.moves[0].nextMove, TimeSpan.Zero); } }
/// <summary> /// 初期化する。new KifuTree()した状態に戻る。 /// ただし、EnableKifuList == falseだと棋譜リストの初期化されないので、リセットしたいならResetKifuList()を明示的に呼び出す必要がある。 /// </summary> public void Init() { // root nodeを作る currentNode = rootNode = new KifuNode(null); pliesFromRoot = 0; SetRootBoardType(BoardType.NoHandicap); // rootSfenのsetterで初期化されているのでここではKifuList、UsiMoveListの初期化はしない //KifuList = new List<string>(); //UsiMoveList = new List<string>(); // 対局情報などを保存するためにここを確保する。 rootKifuMove = new KifuMove(Move.NONE, rootNode, KifuMoveTimes.Zero); kifuWindowMoves = new List <KifuMove>(); KifuTimeSettings = KifuTimeSettings.TimeLimitless; KifuBranch = -1; }
/// <summary> /// posを1手前の局面に移動する /// </summary> public void UndoMove() { // speical moveでこの局面に来たのであればPosition.UndoMove()は呼び出さない。 if (!IsSpecialNode()) { position.UndoMove(); // これ、RemoveKifu()で棋譜リストの更新を行うならばKifuListSelectedIndexが変化するので // 再度このイベントが発生する。無駄と言えば無駄だが…。 RaisePropertyChanged("Position", position.Clone()); } --pliesFromRoot; currentNode = currentNode.prevNode; // 棋譜の更新 RemoveKifu(); }
/// <summary> /// 現在の局面(currentMove)に対して、指し手moveが登録されていないなら、その指し手を追加する。 /// すでに存在しているなら、その指し手は追加しない。 /// /// thinkingTimeは考慮に要した時間。新たにnodeを追加しないときは、この値は無視される。 /// ミリ秒まで計測して突っ込んでおいて良い。(棋譜出力時には秒単位で繰り上げられる) /// /// totalTimeは総消費時間。nullを指定した場合は、ここまでの総消費時間(TotalConsumptionTime()で取得できる)に /// thinkingTimeを秒単位に繰り上げたものが入る。 /// </summary> /// <param name="move"></param> /// <param name="thinkingTime"></param> public void AddNode(Move move, TimeSpan thinkingTime, TimeSpan?totalTime = null) { var m = currentNode.moves.FirstOrDefault((x) => x.nextMove == move); if (m == null) { // -- 見つからなかったので次のnodeを追加してやる KifuNode nextNode = new KifuNode(currentNode); currentNode.moves.Add(new KifuMove(move, nextNode, thinkingTime , totalTime ?? TotalConsumptionTime() + RoundTime(thinkingTime))); // 特殊な指し手であるなら、この時点で棋譜の終端にその旨を記録しておく。 if (move.IsSpecial()) { AddKifuSpecialMove(move, thinkingTime); } } }
// ------------------------------------------------------------------------- // 局面に対する操作子 // ------------------------------------------------------------------------- // DoMove(),UndoMove()以外はcurrentNode.movesに自分で足すなり引くなりすれば良い // CurrentNodeが設定されていないと局面を進められない。 /// <summary> /// posの現在の局面から指し手mで進める。 /// mは、currentNodeのもつ指し手の一つであるものとする /// /// speical moveの時は、Position.DoMove()は呼び出さないが次のnodeに到達できることは保証される。 /// (そうしないとcurrentNodeが更新されないため) /// </summary> /// <param name="m"></param> public void DoMove(KifuMove m) { Debug.Assert(m != null); // 棋譜の更新 var stm = position.sideToMove; var thinkingTime = m.kifuMoveTimes.Player(stm).ThinkingTime; AddKifu(m, thinkingTime); // special moveに対してはDoMove()を行わない。(行っても良いが盤面が変わらないのでやるだけ無駄である) if (!m.nextMove.IsSpecial()) { position.DoMove(m.nextMove); RaisePropertyChanged("Position", position); } ++pliesFromRoot; currentNode = m.nextNode; }
/// <summary> /// currentNode(現在のnode)から、次のnodeがnextNodeである枝を削除する。 /// 対局時の待ったの処理用。 /// </summary> /// <param name="nextNode"></param> public void Remove(KifuNode nextNode) { currentNode.moves.RemoveAll((x) => x.nextNode == nextNode); }
public KifuNode(KifuNode prevNode_) { prevNode = prevNode_; }
/// <summary> /// posを1手前の局面に移動する /// </summary> public void UndoMove() { position.UndoMove(); currentNode = currentNode.prevNode; // UsiMoveStringList.RemoveAt(UsiMoveStringList.Count-1); // RemoveLast() }
public KifuMove(Move nextMove_, KifuNode nextNode_, KifuMoveTimes kifuMoveTimes_) { nextMove = nextMove_; nextNode = nextNode_; kifuMoveTimes = kifuMoveTimes_; }