Example #1
0
        /// <summary>
        /// Fコード値を譜情報に変換する
        /// </summary>
        /// <param name="stepValues">Fコード値リスト</param>
        /// <returns>譜情報</returns>
        private List <PairPuyo> ConvertValuesToSteps(List <int> stepValues)
        {
            List <PairPuyo> steps = new List <PairPuyo>();

            foreach (int value in stepValues)
            {
                int v1 = value >> 9;
                if (v1 == 7)
                {
                    // お邪魔ぷよ
                    OjamaPairPuyo ojama = new OjamaPairPuyo();
                    ojama.OjamaRow = (value >> 6) & 0x7;
                    ojama.OjamaBit = DecimalToBinary(value & 0x3f);

                    steps.Add(ojama);
                }
                else
                {
                    // 色ぷよ
                    ColorPairPuyo pp = new ColorPairPuyo();

                    int v2 = value & 0x3f;
                    int p2 = v2 % 5;
                    int p1 = (v2 - p2) / 5;
                    pp.Pivot     = PUYO_TYPE_CONV[p1];
                    pp.Satellite = PUYO_TYPE_CONV[p2];
                    pp.Dir       = DIR_CONV[((value >> 7) & 0x3)];
                    pp.Pos       = v1;

                    steps.Add(pp);
                }
            }

            return(steps);
        }
Example #2
0
        public void ぷよ名称で設定したぷよ種別が取得できること()
        {
            ColorPairPuyo pp = new ColorPairPuyo();

            pp.Pivot     = PuyoType.KI;
            pp.Satellite = PuyoType.MURASAKI;
            Assert.AreEqual(PuyoType.KI, pp[0]);
            Assert.AreEqual(PuyoType.MURASAKI, pp[1]);
            Assert.AreEqual(PuyoType.KI, pp.Pivot);
            Assert.AreEqual(PuyoType.MURASAKI, pp.Satellite);
        }
Example #3
0
        public void ぷよ番号で設定したぷよ種別が取得できること()
        {
            ColorPairPuyo pp = new ColorPairPuyo();

            pp[0] = PuyoType.AKA;
            pp[1] = PuyoType.MIDORI;
            Assert.AreEqual(PuyoType.AKA, pp[0]);
            Assert.AreEqual(PuyoType.MIDORI, pp[1]);
            Assert.AreEqual(PuyoType.AKA, pp.Pivot);
            Assert.AreEqual(PuyoType.MIDORI, pp.Satellite);
        }
Example #4
0
        /// <summary>
        /// 等価判定を行う
        /// </summary>
        /// <param name="obj">比較対象</param>
        /// <returns>オブジェクトの内容が等しいかどうか</returns>
        public override bool Equals(object obj)
        {
            if (obj == null || this.GetType() != obj.GetType())
            {
                return(false);
            }

            ColorPairPuyo pp = (ColorPairPuyo)obj;

            return(Pivot == pp.Pivot &&
                   Satellite == pp.Satellite &&
                   Dir == pp.Dir &&
                   Pos == pp.Pos);
        }
Example #5
0
        public void お邪魔ぷよと判定されないこと()
        {
            ColorPairPuyo pp = new ColorPairPuyo();

            Assert.IsFalse(pp.IsOjama);
        }
        /// <summary>
        /// 初手の配色パターンを取得する
        /// </summary>
        /// <param name="steps">譜情報</param>
        /// <param name="stepNum">解析手数</param>
        /// <returns>初手の配色パターン</returns>
        public string GetPattern(List <PairPuyo> steps, int stepNum)
        {
            string pattern = "";
            char   mapChar = 'A';
            IDictionary <PuyoType, char> mapping = new Dictionary <PuyoType, char>();

            List <List <PuyoType> > candidates = new List <List <PuyoType> >();

            for (int i = 0; i < stepNum; i++)
            {
                ColorPairPuyo   cpp           = (ColorPairPuyo)steps[i];
                List <PuyoType> priorList     = new List <PuyoType>();
                List <PuyoType> posteriorList = new List <PuyoType>();

                // まずはまだパターン文字が決定していない色を
                // 優先順にごとに分類された候補リストに追加する。
                // 既に前の譜情報で出現している色は優先順位が高い。

                List <PuyoType> list;
                if (candidates.Count == 0)
                {
                    list = new List <PuyoType>();
                }
                else
                {
                    list = candidates[0];
                }

                char dummy;
                if (!mapping.TryGetValue(cpp.Pivot, out dummy))
                {
                    if (list.Contains(cpp.Pivot))
                    {
                        list.Remove(cpp.Pivot);
                        priorList.Add(cpp.Pivot);
                    }
                    else
                    {
                        posteriorList.Add(cpp.Pivot);
                    }
                }

                if (!mapping.TryGetValue(cpp.Satellite, out dummy) && cpp.Pivot != cpp.Satellite)
                {
                    if (list.Contains(cpp.Satellite))
                    {
                        list.Remove(cpp.Satellite);
                        priorList.Add(cpp.Satellite);
                    }
                    else
                    {
                        posteriorList.Add(cpp.Satellite);
                    }
                }

                candidates.Insert(0, priorList);
                candidates.Add(posteriorList);

                List <List <PuyoType> > removeTargets = new List <List <PuyoType> >();
                foreach (List <PuyoType> candidate in candidates)
                {
                    if (candidate.Count >= 2)
                    {
                        // マッピングが未確定のため、以降は処理しない
                        break;
                    }
                    else if (candidate.Count == 1)
                    {
                        if (!mapping.ContainsKey(candidate[0]))
                        {
                            // マッピングが確定
                            mapping[candidate[0]] = mapChar;
                            mapChar++;
                        }
                        removeTargets.Add(candidate);
                    }
                }

                candidates.RemoveAll((candidate) => candidate.Count == 0 || removeTargets.Contains(candidate));
            }

            // ここでも未確定の情報が残っていれば、出現順に文字を割り振る
            foreach (List <PuyoType> candidate in candidates)
            {
                foreach (PuyoType p in candidate)
                {
                    if (!mapping.ContainsKey(p))
                    {
                        mapping[p] = mapChar;
                        mapChar++;
                    }
                }
            }


            // パターン文字を組み立てる
            for (int i = 0; i < stepNum; i++)
            {
                ColorPairPuyo cpp = (ColorPairPuyo)steps[i];
                char          c1  = mapping[cpp.Pivot];
                char          c2  = mapping[cpp.Satellite];

                if (c1 < c2)
                {
                    pattern += ("" + c1 + c2);
                }
                else
                {
                    pattern += ("" + c2 + c1);
                }
            }

            return(pattern);
        }