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; } }); } }
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]); } } }
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(""); }
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); } } } } }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split('\n')) { _patternWidth = Input[0].Length; }
private void DisablePuzzle(IPuzzle puzzle) { puzzle.DeactivatePuzzle(); LeanTween.moveLocal(puzzle.GetGameObject(), Vector3.down * 5f, puzzleTweenDuration).setEase(puzzleTweenOutType).destroyOnComplete = true; }
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--; } }
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; }
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; }
private static bool IsWithinPuzzle(this int dimension, IPuzzle puzzle) { return (dimension >= 0 && dimension < puzzle.CubeSize); }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split("\n").Select(int.Parse).ToArray()) { }
private static bool IsWithinPuzzle(this PlacedPiece placedPiece, IPuzzle puzzle) { return(placedPiece.OccupiedSquares.All(sq => sq.IsWithinPuzzle(puzzle))); }
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) =>
public HardCodeBuilder() { Puzzle = new Puzzle(); }
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); } }
public Solution(IPuzzle puzzle) : base(puzzle, x => x) { }
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); } } }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split("-").Select(int.Parse).ToArray()) { }
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; }
public Solution(IPuzzle puzzle) : base( puzzle, x => x.Trim('\n').ToCharArray().Select(c => int.Parse(c.ToString())).ToArray()) { }
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; }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split(',').Select(BigInteger.Parse).ToArray()) { }
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>(); }
public Solution(IPuzzle puzzle) : base(puzzle, int.Parse) { }
public Solution(IPuzzle puzzle) : base(puzzle, inputSelector) { }
public Solution(IPuzzle puzzle) : base(puzzle, StringArraySelector) { }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Split("\n")) { }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split("\n").Select(i => new Moon(i)).ToList()) { }
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); }
public Solution(IPuzzle puzzle) : base(puzzle, x => x.Trim('\n').Split('\n')) { }
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); } }
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; }
/// <summary> /// Executes a puzzle victory condition /// </summary> /// <param name="puzzle">Puzzle to execute victory</param> protected void ExecuteVictory(IPuzzle puzzle) { puzzle.Victory(); }