Beispiel #1
0
        private static bool ParseVariation(string command)
        {
            var m = VariationRegex.Match(command);

            if (!m.Success)
            {
                return(false);
            }

            // 変化を棋譜に変換します。
            var variation = VariationInfo.Create(
                Global.ShogiModel.CurrentBoard,
                m.Groups[4].Value);

            if (variation == null)
            {
                return(false);
            }

            // 後手番の時は評価値を反転します。
            var sign = (Global.ShogiModel.MyTurn == BWType.Black ? +1 : -1);

            variation.Value = double.Parse(m.Groups[1].Value) * sign * 100;

            // ノードカウント
            variation.NodeCount = m.Groups[6].Success ?
                                  long.Parse(m.Groups[6].Value) : 0;

            Global.ShogiModel.AddVariation(variation);
            return(true);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <summary>
        /// 新しい変化を追加します。
        /// </summary>
        public void AddVariation(VariationInfo variation)
        {
            if (variation == null || variation.MoveList == null)
            {
                return;
            }

            /*if (variation.MoveList.Count() < 9)
             * {
             *  return;
             * }*/

            WPFUtil.UIProcess(() =>
            {
                // 先後の符号は省略されていることがあります。
                SetMoveColor(variation);

                // 同じ変化があれば登録しません。
                var result = VariationList.FirstOrDefault(
                    _ => variation.MoveList.SequenceEqual(_.MoveList));
                if (result != null)
                {
                    result.Value = Math.Max(result.Value, variation.Value);
                    return;
                }

                // 変化はノード数順+評価値順に並べます。
                // ObservableCollectionはソートがやりにくいので、
                // 挿入ソートを使います。
                var comparer = new Func <VariationInfo, VariationInfo, bool>((x, y) =>
                                                                             (x.NodeCount > y.NodeCount) ||
                                                                             (x.NodeCount == y.NodeCount && x.Value > y.Value));
                var inserted = false;
                for (var i = 0; i < VariationList.Count(); ++i)
                {
                    if (comparer(variation, VariationList[i]))
                    {
                        VariationList.Insert(i, variation);
                        inserted = true;
                        break;
                    }
                }

                if (!inserted)
                {
                    VariationList.Add(variation);
                }
            });
        }
        public void ComplexVariationsOnePath()
        {
            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            CourseDesignator courseDesignator = new CourseDesignator(CourseId(1), variationInfo);
            CheckCourse("topologyformatter\\variations.ppen", courseDesignator, "complexvariations_onepath");
        }
Beispiel #5
0
        public void ComplexVariationsOnePath()
        {
            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            CourseDesignator courseDesignator = new CourseDesignator(CourseId(1), variationInfo);

            CheckCourse("topologyformatter\\variations.ppen", courseDesignator, "complexvariations_onepath");
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        /// <summary>
        /// 受信した変化に符号をつけ足します。
        /// </summary>
        /// <remarks>
        /// 変化の先頭の指し手には符号がついていないことがあります。
        /// 現局面からの変化だと決めつけて処理すると、
        /// たまに間違ってしまうので、ここでは符号付きの変化から
        /// 残りの符号を調べます。
        /// </remarks>
        private void SetMoveColor(VariationInfo variation)
        {
            var i = variation.MoveList.FindIndex(
                _ => _.BWType != BWType.None);

            if (i <= 0)
            {
                // 符号が最初の指し手からついている場合や、
                // 符号付きの指し手が見つからない場合は帰ります。
                return;
            }

            var color = variation.MoveList[i].BWType;

            while (--i >= 0)
            {
                color = color.Flip();
                variation.MoveList[i].BWType = color;
            }
        }
        public void SingleVariation()
        {
            SymbolDB symbolDB = new SymbolDB(Util.GetFileInAppDirectory("symbols.xml"));
            UndoMgr  undomgr  = new UndoMgr(5);
            EventDB  eventDB  = new EventDB(undomgr);

            eventDB.Load(TestUtil.GetTestFile("queryevent\\variations.ppen"));
            eventDB.Validate();

            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            CourseDesignator courseDesignator = new CourseDesignator(CourseId(1), variationInfo);

            CheckCourseBothAppearances("queryevent\\variations.ppen", courseDesignator, false, "singlevariation", new RectangleF(-15, -100, 230, 230));
        }
        public void SingleVariation()
        {
            SymbolDB symbolDB = new SymbolDB(Util.GetFileInAppDirectory("symbols.xml"));
            UndoMgr undomgr = new UndoMgr(5);
            EventDB eventDB = new EventDB(undomgr);

            eventDB.Load(TestUtil.GetTestFile("queryevent\\variations.ppen"));
            eventDB.Validate();

            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            CourseDesignator courseDesignator = new CourseDesignator(CourseId(1), variationInfo);

            CheckCourseBothAppearances("queryevent\\variations.ppen", courseDesignator, false, "singlevariation", new RectangleF(-15, -100, 230, 230));
        }
Beispiel #10
0
        protected override void WriteCourseStart(CourseView courseView, string courseName, int courseNumber, string[] classNames, bool isScore, int variationNumber, VariationInfo variationInfo)
        {
            xmlWriter.WriteStartElement("CourseVariation");
            xmlWriter.WriteElementString("CourseVariationId", XmlConvert.ToString(variationNumber));

            if (variationInfo != null)
            {
                xmlWriter.WriteElementString("Name", variationInfo.CodeString);
            }

            if (!isScore)
            {
                xmlWriter.WriteElementString("CourseLength", XmlConvert.ToString(Math.Round(courseView.MaxTotalLength / 100F) * 100F));   // round to nearest 100m
                if (courseView.TotalClimb > 0)
                {
                    xmlWriter.WriteElementString("CourseClimb", XmlConvert.ToString(Math.Round(courseView.TotalClimb / 5, MidpointRounding.AwayFromZero) * 5.0));  // round to nearest 5m
                }
            }
        }
Beispiel #11
0
        protected override void WriteCourseStart(CourseView courseView, string courseName, int courseNumber, string[] classNames, bool isScore, int variationNumber, VariationInfo variationInfo)
        {
            string outputCourseName;
            string outputFamilyName;

            if (variationInfo != null)
            {
                outputCourseName = courseName + " " + variationInfo.CodeString;
                outputFamilyName = courseName;
            }
            else
            {
                outputCourseName = courseName;
                outputFamilyName = null;
            }


            xmlWriter.WriteStartElement("Course");

            xmlWriter.WriteElementString("Name", outputCourseName);
            if (outputFamilyName != null)
            {
                xmlWriter.WriteElementString("CourseFamily", outputFamilyName);
            }

            if (!isScore)
            {
                xmlWriter.WriteElementString("Length", XmlConvert.ToString(Math.Round(courseView.MaxTotalLength / 100F) * 100F));   // round to nearest 100m
                if (courseView.TotalClimb > 0)
                {
                    xmlWriter.WriteElementString("Climb", XmlConvert.ToString(Math.Round(courseView.TotalClimb / 5, MidpointRounding.AwayFromZero) * 5.0));  // round to nearest 5m
                }
            }

            if (classNames != null && classNames.Length > 0)
            {
                // Save the class names for later output.
                foreach (string className in classNames)
                {
                    pendingClassAssignments.Add(new PendingClassAssignment()
                    {
                        className = className, courseName = outputCourseName, courseFamily = outputFamilyName
                    });
                }
            }
        }
Beispiel #12
0
 protected abstract void WriteCourseStart(CourseView courseView, string courseName, int courseNumber, string[] classNames, bool isScore, int variationNumber, VariationInfo variationInfo);
Beispiel #13
0
        void WriteSingleCourseVariation(CourseDesignator courseDesignator, string courseName, int courseNumber, string[] classNames, bool isScore, int variationNumber, VariationInfo variationInfo)
        {
            float distanceThisLeg = 0;
            int   sequenceNumber  = 1;  // score courses need sequence #'s, even though there is no sequence.

            CourseView courseView = CourseView.CreateViewingCourseView(eventDB, courseDesignator);

            WriteCourseStart(courseView, courseName, courseNumber, classNames, isScore, variationNumber, variationInfo);

            // Go through the control views.
            int controlViewIndex = 0;

            while (controlViewIndex >= 0 && controlViewIndex < courseView.ControlViews.Count)
            {
                CourseView.ControlView controlView = courseView.ControlViews[controlViewIndex];
                ControlPointKind       kind        = eventDB.GetControl(controlView.controlId).kind;

                WriteCourseControl(kind, controlView, isScore, ref sequenceNumber, ref distanceThisLeg);

                if (controlView.legLength != null)
                {
                    distanceThisLeg += controlView.legLength[0];
                }

                if (isScore)
                {
                    ++controlViewIndex;
                }
                else
                {
                    controlViewIndex = courseView.GetNextControl(controlViewIndex);
                }
            }

            WriteCourseEnd();
        }
Beispiel #14
0
        public void CanAddVariation()
        {
            Setup("queryevent\\variations.ppen");

            bool result = QueryEvent.CanAddVariation(eventDB, CourseDesignator.AllControls, CourseControlId(2));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(3));
            Assert.IsTrue(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(2));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(11));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(4));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(25));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(19));
            Assert.IsTrue(result);

            result = QueryEvent.CanAddVariation(eventDB, Designator(1), CourseControlId(1));
            Assert.IsTrue(result);

            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            CourseDesignator designator = new CourseDesignator(CourseId(1), variationInfo);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(3));
            Assert.IsTrue(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(2));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(11));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(4));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(25));
            Assert.IsFalse(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(19));
            Assert.IsTrue(result);

            result = QueryEvent.CanAddVariation(eventDB, designator, CourseControlId(1));
            Assert.IsTrue(result);
        }
Beispiel #15
0
        public void EnumLegsVariations()
        {
            Setup("queryevent\\variations.ppen");

            List<QueryEvent.LegInfo> result;

            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            VariationInfo variationInfo = new VariationInfo("AEFDCI", variationPath);

            result = QueryEvent.EnumLegs(eventDB, new CourseDesignator(CourseId(1), variationInfo)).ToList();

            CollectionAssert.AreEqual(result, new[] {
                new QueryEvent.LegInfo(CourseControlId(1), CourseControlId(2)),
                new QueryEvent.LegInfo(CourseControlId(2), CourseControlId(3)),
                new QueryEvent.LegInfo(CourseControlId(3), CourseControlId(27)),
                new QueryEvent.LegInfo(CourseControlId(27), CourseControlId(19)),
                new QueryEvent.LegInfo(CourseControlId(19), CourseControlId(30)),
                new QueryEvent.LegInfo(CourseControlId(30), CourseControlId(20)),
                new QueryEvent.LegInfo(CourseControlId(20), CourseControlId(23)),
                new QueryEvent.LegInfo(CourseControlId(23), CourseControlId(26)),
                new QueryEvent.LegInfo(CourseControlId(26), CourseControlId(17)),
                new QueryEvent.LegInfo(CourseControlId(17), CourseControlId(18)),
                new QueryEvent.LegInfo(CourseControlId(18), CourseControlId(25)),
                new QueryEvent.LegInfo(CourseControlId(25), CourseControlId(15)),
                new QueryEvent.LegInfo(CourseControlId(15), CourseControlId(16)),
                new QueryEvent.LegInfo(CourseControlId(16), CourseControlId(4)),
                new QueryEvent.LegInfo(CourseControlId(4), CourseControlId(5)),
                new QueryEvent.LegInfo(CourseControlId(5), CourseControlId(6)),
                new QueryEvent.LegInfo(CourseControlId(6), CourseControlId(7)),
                new QueryEvent.LegInfo(CourseControlId(7), CourseControlId(8)),
                new QueryEvent.LegInfo(CourseControlId(8), CourseControlId(28)),
                new QueryEvent.LegInfo(CourseControlId(28), CourseControlId(13)),
                new QueryEvent.LegInfo(CourseControlId(13), CourseControlId(10)),
                new QueryEvent.LegInfo(CourseControlId(10), CourseControlId(11))
            });
        }
Beispiel #16
0
        public void EnumCourseControlIdsVariation()
        {
            Setup("queryevent\\variations.ppen");
            List<Id<CourseControl>> result;

            result = QueryEvent.EnumCourseControlIds(eventDB, Designator(1)).ToList();
            CollectionAssert.AreEquivalent(result, new[] {
                CourseControlId(1), CourseControlId(2), CourseControlId(3), CourseControlId(4), CourseControlId(5),
                CourseControlId(6), CourseControlId(7), CourseControlId(8), CourseControlId(9), CourseControlId(10),
                CourseControlId(11), CourseControlId(12), CourseControlId(13), CourseControlId(14), CourseControlId(15),
                CourseControlId(16), CourseControlId(17), CourseControlId(18), CourseControlId(19), CourseControlId(20),
                CourseControlId(21), CourseControlId(22), CourseControlId(23), CourseControlId(24), CourseControlId(25),
                CourseControlId(26), CourseControlId(27), CourseControlId(28), CourseControlId(29), CourseControlId(30),
            });

            /////////////////////////////////////////////////////////////////

            VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(24)
            });
            VariationInfo variationInfo = new VariationInfo("B", variationPath);

            result = QueryEvent.EnumCourseControlIds(eventDB, new CourseDesignator(CourseId(1), variationInfo)).ToList();
            CollectionAssert.AreEqual(result, new[] {
                CourseControlId(1), CourseControlId(24), CourseControlId(12), CourseControlId(10), CourseControlId(11)
            });

            /////////////////////////////////////////////////////////////////

            variationPath = new VariationInfo.VariationPath(new[] {
                CourseControlId(2),
                CourseControlId(27),
                CourseControlId(30),
                CourseControlId(26),
                CourseControlId(25),
                CourseControlId(4),
                CourseControlId(28),
            });
            variationInfo = new VariationInfo("AEFDCI", variationPath);

            // TODO VARIATIONS
            result = QueryEvent.EnumCourseControlIds(eventDB, new CourseDesignator(CourseId(1), variationInfo)).ToList();
            CollectionAssert.AreEqual(result, new[] {
                CourseControlId(1), CourseControlId(2), CourseControlId(3), CourseControlId(27), CourseControlId(19),
                CourseControlId(30), CourseControlId(20), CourseControlId(23), CourseControlId(26), CourseControlId(17),
                CourseControlId(18), CourseControlId(25), CourseControlId(15), CourseControlId(16), CourseControlId(4),
                CourseControlId(5), CourseControlId(6), CourseControlId(7), CourseControlId(8), CourseControlId(28),
                CourseControlId(13), CourseControlId(10), CourseControlId(11)
            });
        }