/// <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); }
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); }
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); }
/// <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); }
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); }