Exemple #1
0
 private void ResolveTouchClick(IPuzzle puzzle, IOperation op)
 {
     IQuad quad = puzzle[op.row, op.column];
     if (quad.value == QuadValue.Front || quad.value == QuadValue.Back)
     {
         List<Tween> playings = DOTween.PlayingTweens();
         if (playings != null)
         {
             playings.ForEach((Tween each) =>
             {
                 if (each.id != null && each.id.ToString().StartsWith(Style.QuadUnifiedRotateId))
                 {
                     each.Kill(true);
                 }
             });
         }
         puzzle.touchEnable = false;
         TweenDepot depot = new TweenDepot();
         ResolvePresent(depot, puzzle, op, op, 0);
         Sequence sequence = depot.ToSequence();
         sequence.SetId(Style.QuadUnifiedRotateId);
         sequence.OnComplete(() =>
         {
             ResolveTouchData(puzzle, op);
             if (IsSolved(puzzle))
             {
                 puzzle.solved = true;
             }
             else
             {
                 puzzle.touchEnable = true;
             }
         });
     }
 }
Exemple #2
0
 public void MakePuzzle(QuadValue[,] values)
 {
     _record.Clear();
     _puzzle = new Puzzle(values.GetLength(0), values.GetLength(1));
     for (int i = 0; i < _puzzle.rows; i++)
     {
         for (int j = 0; j < _puzzle.columns; j++)
         {
             _puzzle[i, j] = new Quad(i, j, values[i, j]);
         }
     }
 }
Exemple #3
0
 public void ResolveTouch(IPuzzle puzzle, IOperation op)
 {
     switch (op.type)
     {
         case OpType.TouchClick:
             {
                 ResolveTouchClick(puzzle, op);
                 break;
             }
         case OpType.TouchStart:
             {
                 ResolveTouchStart(puzzle, op);
                 break;
             }
         case OpType.TouchEnd:
             {
                 ResolveTouchEnd(puzzle, op);
                 break;
             }
     }
 }
 public static void PrintPuzzle(IPuzzle puzzle)
 {
     Console.CursorVisible = true;
     Console.Clear();
     Console.SetCursorPosition(0, 0);
     Console.ForegroundColor = ConsoleColor.Yellow;
     var builder = new StringBuilder();
     for (var i = 0; i < Width; i++)
     {
         builder.Append("#");
     }
     Console.WriteLine(builder);
     Console.ForegroundColor = ConsoleColor.Magenta;
     Console.SetCursorPosition(0, 1);
     Console.Write($"Day: {puzzle.Day}\t\t\t Puzzle Index #: {puzzle.PuzzleIndex} ");
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("");
     Console.WriteLine(builder);
     Console.ForegroundColor = ConsoleColor.Magenta;
     Console.WriteLine("Puzzle Intro:");
     Console.ForegroundColor = ConsoleColor.White;
     Console.WriteLine(puzzle.GetPurpose());
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("");
     Console.WriteLine(builder);
     Console.ForegroundColor = ConsoleColor.Magenta;
     Console.WriteLine("Puzzle Result:");
     Console.ForegroundColor = ConsoleColor.White;
     Console.WriteLine(puzzle.GetResult());
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("");
     Console.WriteLine(builder);
     Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine("Press CTRL+C to EXIT");
     Console.WriteLine("");
 }
Exemple #5
0
 private void ResolvePresent(TweenDepot depot, IPuzzle puzzle, IOperation origin, IOperation op, float delay)
 {
     IQuad[] rowQuads = puzzle.GetRowQuads(op.row);
     if ((op.direction & QuadValue.Left) > 0)
     {
         for (int i = op.column - 1; i >= 0; i--)
         {
             // 左舷依次翻转
             IQuad quad   = rowQuads[i];
             float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                         .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string    tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt  = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, Style.QuadRollAngle, 0), Style.QuadRollDuration)
                                 .SetId(tid)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     if ((op.direction & QuadValue.Right) > 0)
     {
         for (int i = op.column + 1, len = rowQuads.Length; i < len; i++)
         {
             // 右舷依次翻转
             IQuad quad   = rowQuads[i];
             float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                         .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string    tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt  = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, -Style.QuadRollAngle, 0), Style.QuadRollDuration)
                                 .SetId(tid)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     IQuad[] columnQuads = puzzle.GetColumnQuads(op.column);
     if ((op.direction & QuadValue.Up) > 0)
     {
         for (int i = op.row - 1; i >= 0; i--)
         {
             // 上侧依次翻转
             IQuad quad   = columnQuads[i];
             float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                         .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string    tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt  = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(-Style.QuadRollAngle, 0, 0), Style.QuadRollDuration)
                                 .SetId(tid)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     if ((op.direction & QuadValue.Down) > 0)
     {
         for (int i = op.row + 1, len = columnQuads.Length; i < len; i++)
         {
             // 下侧依次翻转
             IQuad quad   = columnQuads[i];
             float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                 .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                         .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string    tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt  = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(Style.QuadRollAngle, 0, 0), Style.QuadRollDuration)
                                 .SetId(tid)
                                 .SetEase(Ease.OutBack)
                                 .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
 }
Exemple #6
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split('\n'))
 {
     _patternWidth = Input[0].Length;
 }
Exemple #7
0
 private void DisablePuzzle(IPuzzle puzzle)
 {
     puzzle.DeactivatePuzzle();
     LeanTween.moveLocal(puzzle.GetGameObject(), Vector3.down * 5f, puzzleTweenDuration).setEase(puzzleTweenOutType).destroyOnComplete = true;
 }
Exemple #8
0
    public void MakePuzzle(PuzzleParams pp)
    {
        _record.Clear();
        _puzzle = new Puzzle(pp.rows, pp.columns);
        int i = 0;
        for (i = 0; i < _puzzle.rows; i++)
        {
            for (int j = 0; j < _puzzle.columns; j++)
            {
                _puzzle[i, j] = new Quad(i, j, QuadValue.Front);
            }
        }

        System.Random random = new System.Random();

        i = pp.block;
        while (i > 0)
        {
            int row = random.Next(_puzzle.rows);
            int column = random.Next(_puzzle.columns);
            _puzzle[row, column].value = QuadValue.Block;
            i--;
        }

        if (pp.arrow > 0)
        {
            // QuadValue.Left | QuadValue.Up, QuadValue.Right | QuadValue.Up, QuadValue.Left | QuadValue.Down, QuadValue.Right | QuadValue.Down
            QuadValue[] diretions = new QuadValue[] { QuadValue.Left, QuadValue.Right, QuadValue.Up, QuadValue.Down };
            do
            {
                for (i = 0; i < _puzzle.rows; i++)
                {
                    for (int j = 0; j < _puzzle.columns; j++)
                    {
                        if ((_puzzle[i, j].value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
                        {
                            _puzzle[i, j] = new Quad(i, j, QuadValue.Front);
                        }
                    }
                }
                i = pp.arrow;
                while (i > 0)
                {
                    int row = random.Next(_puzzle.rows);
                    int column = random.Next(_puzzle.columns);
                    if (_puzzle[row, column].value == QuadValue.Front || _puzzle[row, column].value == QuadValue.Back)
                    {
                        _puzzle[row, column].value = diretions[random.Next(diretions.Length)];
                        i--;
                    }
                }
            }
            while (_resolver.ResolveIsLoop(puzzle));
        }

        i = 10;
        while (i > 0 || _resolver.IsSolved(_puzzle))
        {
            IOperation op = new Operation(OpType.TouchClick, random.Next(_puzzle.rows), random.Next(_puzzle.columns));
            _record.Push(op);
            _resolver.ResolveTouchData(_puzzle, op);
            i--;
        }
    }
Exemple #9
0
 private void ResolvePresent(TweenDepot depot, IPuzzle puzzle, IOperation origin, IOperation op, float delay)
 {
     IQuad[] rowQuads = puzzle.GetRowQuads(op.row);
     if ((op.direction & QuadValue.Left) > 0)
     {
         for (int i = op.column - 1; i >= 0; i--)
         {
             // 左舷依次翻转
             IQuad quad = rowQuads[i];
             float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                                   .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration)
                                        .SetEase(Ease.OutBack)
                                        .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, Style.QuadRollAngle, 0), Style.QuadRollDuration)
                                     .SetId(tid)
                                     .SetEase(Ease.OutBack)
                                     .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     if ((op.direction & QuadValue.Right) > 0)
     {
         for (int i = op.column + 1, len = rowQuads.Length; i < len; i++)
         {
             // 右舷依次翻转
             IQuad quad = rowQuads[i];
             float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                                   .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration)
                                        .SetEase(Ease.OutBack)
                                        .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, -Style.QuadRollAngle, 0), Style.QuadRollDuration)
                                    .SetId(tid)
                                    .SetEase(Ease.OutBack)
                                    .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     IQuad[] columnQuads = puzzle.GetColumnQuads(op.column);
     if ((op.direction & QuadValue.Up) > 0)
     {
         for (int i = op.row - 1; i >= 0; i--)
         {
             // 上侧依次翻转
             IQuad quad = columnQuads[i];
             float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                                   .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration)
                                        .SetEase(Ease.OutBack)
                                        .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(-Style.QuadRollAngle, 0, 0), Style.QuadRollDuration)
                                    .SetId(tid)
                                    .SetEase(Ease.OutBack)
                                    .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
     if ((op.direction & QuadValue.Down) > 0)
     {
         for (int i = op.row + 1, len = columnQuads.Length; i < len; i++)
         {
             // 下侧依次翻转
             IQuad quad = columnQuads[i];
             float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay;
             if (quad.value == QuadValue.Block)
             {
                 DOTween.Sequence().AppendInterval(delay + qdelay)
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f))
                                   .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f)
                                   .SetEase(Ease.OutBack));
                 break;
             }
             else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle);
                 spark.delay = delay + qdelay;
                 quad.Spark(spark);
                 ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration);
                 break;
             }
             else
             {
                 string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column;
                 TweenInfo lt = depot.GetFirst(tid);
                 if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration)
                 {
                     lt.Kill();
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration)
                                        .SetEase(Ease.OutBack)
                                        .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
                 else
                 {
                     Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(Style.QuadRollAngle, 0, 0), Style.QuadRollDuration)
                                    .SetId(tid)
                                    .SetEase(Ease.OutBack)
                                    .SetRelative();
                     depot.Add(delay + qdelay, t);
                 }
             }
         }
     }
 }
Exemple #10
0
 private bool IsLoopLine(List<IQuad> arrows, IPuzzle puzzle, IQuad[] quads, int from, int to, int step)
 {
     bool result = false;
     // from闭to开
     for (int i = from; i != to; i += step)
     {
         if (quads[i].value == QuadValue.Block)
         {
             break;
         }
         else if ((quads[i].value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
         {
             if (arrows.IndexOf(quads[i]) == -1)
             {
                 arrows.Add(quads[i]);
                 result = IsLoop(arrows, puzzle, new Operation(OpType.TouchClick, quads[i].row, quads[i].column, quads[i].value));
             }
             else
             {
                 result = true;
             }
             break;
         }
     }
     return result;
 }
Exemple #11
0
 public bool ResolveIsLoop(IPuzzle puzzle)
 {
     bool result = false;
     for (int i = 0; i < puzzle.rows; i++)
     {
         for (int j = 0; j < puzzle.columns; j++)
         {
             if ((puzzle[i, j].value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
             {
                 if (IsLoop(new List<IQuad>(), puzzle, new Operation(OpType.TouchClick, i, j, puzzle[i, j].value)))
                 {
                     result = true;
                     break;
                 }
             }
         }
     }
     return result;
 }
Exemple #12
0
 private static bool IsWithinPuzzle(this int dimension, IPuzzle puzzle)
 {
     return
         (dimension >= 0 &&
          dimension < puzzle.CubeSize);
 }
Exemple #13
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split("\n").Select(int.Parse).ToArray())
 {
 }
Exemple #14
0
 private static bool IsWithinPuzzle(this PlacedPiece placedPiece, IPuzzle puzzle)
 {
     return(placedPiece.OccupiedSquares.All(sq => sq.IsWithinPuzzle(puzzle)));
 }
Exemple #15
0
        private void btnGO_Click(object sender, EventArgs e)
        {
            IPuzzle engine = DayProvider.GetPuzzle(int.Parse(cboDay.SelectedItem.ToString()), (rbOne.Checked) ? rbOne.Text : rbTwo.Text);

            lblResults.Text = engine.Solve();
        }
 protected BaseSolution(IPuzzle puzzle, Func <string, T> inputSelector) =>
Exemple #17
0
 public HardCodeBuilder()
 {
     Puzzle = new Puzzle();
 }
Exemple #18
0
 private void ResolveData(IPuzzle puzzle, IOperation origin, IOperation op)
 {
     IQuad[] rowQuads = puzzle.GetRowQuads(op.row);
     if ((op.direction & QuadValue.Left) > 0)
     {
         ResolveDataLine(puzzle, origin, rowQuads, op.column - 1, -1, -1);
     }
     if ((op.direction & QuadValue.Right) > 0)
     {
         ResolveDataLine(puzzle, origin, rowQuads, op.column + 1, rowQuads.Length, 1);
     }
     IQuad[] columnQuads = puzzle.GetColumnQuads(op.column);
     if ((op.direction & QuadValue.Up) > 0)
     {
         ResolveDataLine(puzzle, origin, columnQuads, op.row - 1, -1, -1);
     }
     if ((op.direction & QuadValue.Down) > 0)
     {
         ResolveDataLine(puzzle, origin, columnQuads, op.row + 1, columnQuads.Length, 1);
     }
 }
Exemple #19
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x)
 {
 }
Exemple #20
0
 private void ResolveDataLine(IPuzzle puzzle, IOperation origin, IQuad[] quads, int from, int to, int step)
 {
     // from闭to开
     for (int i = from; i != to; i += step)
     {
         if (quads[i].value == QuadValue.Block)
         {
             break;
         }
         else if ((quads[i].value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0)
         {
             ResolveData(puzzle, origin, new Operation(OpType.TouchClick, quads[i].row, quads[i].column, quads[i].value));
             break;
         }
         else
         {
             quads[i].value = (QuadValue)(QuadValue.Back - quads[i].value);
         }
     }
 }
Exemple #21
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split("-").Select(int.Parse).ToArray())
 {
 }
Exemple #22
0
 private bool IsLoop(List<IQuad> arrows, IPuzzle puzzle, IOperation op)
 {
     IQuad[] rowQuads = puzzle.GetRowQuads(op.row);
     if ((op.direction & QuadValue.Left) > 0)
     {
         if (IsLoopLine(arrows, puzzle, rowQuads, op.column - 1, -1, -1))
         {
             return true;
         }
     }
     if ((op.direction & QuadValue.Right) > 0)
     {
         if (IsLoopLine(arrows, puzzle, rowQuads, op.column + 1, rowQuads.Length, 1))
         {
             return true;
         }
     }
     IQuad[] columnQuads = puzzle.GetColumnQuads(op.column);
     if ((op.direction & QuadValue.Up) > 0)
     {
         if (IsLoopLine(arrows, puzzle, columnQuads, op.row - 1, -1, -1))
         {
             return true;
         }
     }
     if ((op.direction & QuadValue.Down) > 0)
     {
         if (IsLoopLine(arrows, puzzle, columnQuads, op.row + 1, columnQuads.Length, 1))
         {
             return true;
         }
     }
     return false;
 }
Exemple #23
0
 public Solution(IPuzzle puzzle) : base(
         puzzle, x => x.Trim('\n').ToCharArray().Select(c => int.Parse(c.ToString())).ToArray())
 {
 }
Exemple #24
0
 public bool IsSolved(IPuzzle puzzle)
 {
     bool pass = true;
     QuadValue value = QuadValue.Block;
     for (int i = 0; i < puzzle.rows; i++)
     {
         for (int j = 0; j < puzzle.columns; j++)
         {
             if (value == QuadValue.Block && 
                 (puzzle[i, j].value == QuadValue.Front || puzzle[i, j].value == QuadValue.Back))
             {
                 value = puzzle[i, j].value;
             }
             if ((value == QuadValue.Front || value == QuadValue.Back) &&
                 (puzzle[i, j].value == QuadValue.Front || puzzle[i, j].value == QuadValue.Back) &&
                 value != puzzle[i, j].value)
             {
                 pass = false;
                 break;
             }
         }
     }
     return pass;
 }
Exemple #25
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split(',').Select(BigInteger.Parse).ToArray())
 {
 }
Exemple #26
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split("\n").Select(y => new Reaction(y)).ToList())
 {
 }
 private void Awake()
 {
     puzzle     = GameObject.Find(PuzzleName).GetComponent <IPuzzle>();
     keyStorage = GameObject.Find("GameManager").GetComponent <KeyStorage>();
 }
Exemple #28
0
 public Solution(IPuzzle puzzle) : base(puzzle, int.Parse)
 {
 }
Exemple #29
0
 public Solution(IPuzzle puzzle) : base(puzzle, inputSelector)
 {
 }
Exemple #30
0
 public Solution(IPuzzle puzzle) : base(puzzle, StringArraySelector)
 {
 }
Exemple #31
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split("\n"))
 {
 }
Exemple #32
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split("\n").Select(i => new Moon(i)).ToList())
 {
 }
Exemple #33
0
 private void ResolveTouchEnd(IPuzzle puzzle, IOperation op)
 {
     IQuad quad = puzzle[op.row, op.column];
     string tid = Style.QuadUnifiedScaleId + "_" + quad.row + "_" + quad.column;
     List<Tween> playings = DOTween.TweensById(tid, true);
     if (playings != null)
     {
         playings.ForEach((Tween each) => each.Kill(true));
     }
     DOTween.To(
         () => quad.localScale,
         x => quad.localScale = x,
         Vector3.one,
         Style.QuadTouchScaleDuration
     ).SetId(tid);
 }
Exemple #34
0
 public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split('\n'))
 {
 }
Exemple #35
0
 public void ResolveTouchData(IPuzzle puzzle, IOperation op)
 {
     IQuad quad = puzzle[op.row, op.column];
     if (quad.value == QuadValue.Front || quad.value == QuadValue.Back)
     {
         ResolveData(puzzle, op, op);
     }
 }
Exemple #36
0
        private void InitializePuzzleList()
        {
            this.m_PuzzleList.Size = new Size(350, 24);
            this.m_PuzzleList.Location = new Point(this.Width - this.m_PuzzleList.Width - 20,
                this.Height - this.m_PuzzleList.Height - 40);
            this.m_PuzzleList.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            this.m_PuzzleList.DropDownStyle = ComboBoxStyle.DropDownList;

            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (var type in assembly.GetTypes())
                {
                    if (typeof(IPuzzle).IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface)
                    {
                        this.m_PuzzleList.Items.Add(type);
                    }
                }
            }

            this.m_PuzzleList.SelectedValueChanged += (sender, e) =>
            {
                if (this.m_PuzzleList.SelectedItem == null)
                    this.m_Puzzle = null;
                else
                    this.m_Puzzle = Activator.CreateInstance((Type)this.m_PuzzleList.SelectedItem) as IPuzzle;
            };
            this.m_PuzzleList.SelectedIndex = 0;
        }
Exemple #37
0
 /// <summary>
 /// Executes a puzzle victory condition
 /// </summary>
 /// <param name="puzzle">Puzzle to execute victory</param>
 protected void ExecuteVictory(IPuzzle puzzle)
 {
     puzzle.Victory();
 }