Beispiel #1
0
        public int AmountOfOpenRoadEnds(PuzzleRoad puzzleRoad)
        {
            int amount           = 0;
            var usingPuzzleIndex = puzzleRoad.StartPuzzleIndex;

            if (puzzleRoad.DefinitiveEndingRoad(usingPuzzleIndex))
            {
                return(0);
            }

            switch (usingPuzzleIndex)
            {
            case 1:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(2) && !Initiator.SubmittedPuzzleTilesIndices.Contains(4))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(4))
                {
                    if (puzzleRoad.StartsAt(Orientation.Bottom))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Bottom);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(2))
                {
                    if (puzzleRoad.StartsAt(Orientation.Right))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Right);
                }
                break;

            case 2:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(1) && !Initiator.SubmittedPuzzleTilesIndices.Contains(3) && !Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(1))
                {
                    if (puzzleRoad.StartsAt(Orientation.Left))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Left);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(3))
                {
                    if (puzzleRoad.StartsAt(Orientation.Right))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Right);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    if (puzzleRoad.StartsAt(Orientation.Bottom))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Bottom);
                }
                break;

            case 3:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(2) && !Initiator.SubmittedPuzzleTilesIndices.Contains(6))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(2))
                {
                    if (puzzleRoad.StartsAt(Orientation.Left))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Left);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(6))
                {
                    if (puzzleRoad.StartsAt(Orientation.Bottom))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Bottom);
                }
                break;

            case 4:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(1) && !Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(1))
                {
                    if (puzzleRoad.StartsAt(Orientation.Top))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Top);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    if (puzzleRoad.StartsAt(Orientation.Right))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Right);
                }
                break;

            case 5:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(4) && !Initiator.SubmittedPuzzleTilesIndices.Contains(6) && !Initiator.SubmittedPuzzleTilesIndices.Contains(2))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(4))
                {
                    if (puzzleRoad.StartsAt(Orientation.Left))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Left);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(6))
                {
                    if (puzzleRoad.StartsAt(Orientation.Right))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Right);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(2))
                {
                    if (puzzleRoad.StartsAt(Orientation.Top))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Top);
                }
                break;

            case 6:
                if (!Initiator.SubmittedPuzzleTilesIndices.Contains(3) && !Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    return(0);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(3))
                {
                    if (puzzleRoad.StartsAt(Orientation.Top))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Top);
                }
                if (Initiator.SubmittedPuzzleTilesIndices.Contains(5))
                {
                    if (puzzleRoad.StartsAt(Orientation.Left))
                    {
                        puzzleRoad.SwitchStartToEnd();
                    }

                    amount += puzzleRoad.StartsOrEndsAtAmount(Orientation.Left);
                }
                break;
            }

            return(amount);
        }
        public bool IsEndingRoad(ref PuzzleRoad puzzleRoad, int?customStartPuzzleIndex)
        {
            bool?endingRoad       = null;
            var  usingPuzzleIndex = customStartPuzzleIndex.HasValue ? customStartPuzzleIndex.Value : puzzleRoad.StartPuzzleIndex;

            if (puzzleRoad.DefinitiveEndingRoad(usingPuzzleIndex))
            {
                endingRoad = true;
                puzzleRoad.EndPuzzleIndex = puzzleRoad.StartPuzzleIndex;
                return(endingRoad.Value);
            }



            switch (usingPuzzleIndex)
            {
            case 1:
                if (!UsedPuzzleTilesIndices.Contains(2) && !UsedPuzzleTilesIndices.Contains(4))
                {
                    endingRoad = true;
                    break;
                }
                if (UsedPuzzleTilesIndices.Contains(4) && puzzleRoad.StartsOrEndsAt(Orientation.Bottom))
                {
                    break;
                }
                if (UsedPuzzleTilesIndices.Contains(2) && puzzleRoad.StartsOrEndsAt(Orientation.Right))
                {
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(2))
                {
                    if (!puzzleRoad.StartsOrEndsAt(Orientation.Bottom))
                    {
                        endingRoad = true;
                        break;
                    }
                }

                if (!UsedPuzzleTilesIndices.Contains(4))
                {
                    if (!puzzleRoad.StartsOrEndsAt(Orientation.Right))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;

            case 2:
                if (!UsedPuzzleTilesIndices.Contains(1) && !UsedPuzzleTilesIndices.Contains(3) && !UsedPuzzleTilesIndices.Contains(5))
                {
                    endingRoad = true;
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(1))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Left) ||
                        (puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Left))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(3))
                {
                    if ((puzzleRoad.EndPosition == 1 && puzzleRoad.EndOrientation == Orientation.Right) ||
                        (puzzleRoad.EndPosition == 3 && puzzleRoad.EndOrientation == Orientation.Right))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(5))
                {
                    if ((puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Bottom) ||
                        (puzzleRoad.EndPosition == 3 && puzzleRoad.EndOrientation == Orientation.Bottom))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;

            case 3:
                if (!UsedPuzzleTilesIndices.Contains(2) && !UsedPuzzleTilesIndices.Contains(6))
                {
                    endingRoad = true;
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(2))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Left) ||
                        (puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Left))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(6))
                {
                    if ((puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Bottom) ||
                        (puzzleRoad.EndPosition == 3 && puzzleRoad.EndOrientation == Orientation.Bottom))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;

            case 4:
                if (!UsedPuzzleTilesIndices.Contains(1) && !UsedPuzzleTilesIndices.Contains(5))
                {
                    endingRoad = true;
                    break;
                }
                if (UsedPuzzleTilesIndices.Contains(1) && puzzleRoad.StartsOrEndsAt(Orientation.Top))
                {
                    break;
                }
                if (UsedPuzzleTilesIndices.Contains(5) && puzzleRoad.StartsOrEndsAt(Orientation.Right))
                {
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(1))
                {
                    if (puzzleRoad.StartsOrEndsAt(Orientation.Top))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(5))
                {
                    if (puzzleRoad.StartsOrEndsAt(Orientation.Right))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;

            case 5:
                if (!UsedPuzzleTilesIndices.Contains(4) && !UsedPuzzleTilesIndices.Contains(6) && !UsedPuzzleTilesIndices.Contains(2))
                {
                    endingRoad = true;
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(4))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Left) ||
                        (puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Left))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(6))
                {
                    if ((puzzleRoad.EndPosition == 1 && puzzleRoad.EndOrientation == Orientation.Right) ||
                        (puzzleRoad.EndPosition == 3 && puzzleRoad.EndOrientation == Orientation.Right))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(2))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Top) ||
                        (puzzleRoad.EndPosition == 1 && puzzleRoad.EndOrientation == Orientation.Top))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;

            case 6:
                if (!UsedPuzzleTilesIndices.Contains(3) && !UsedPuzzleTilesIndices.Contains(5))
                {
                    endingRoad = true;
                    break;
                }
                if (!UsedPuzzleTilesIndices.Contains(3))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Top) ||
                        (puzzleRoad.EndPosition == 1 && puzzleRoad.EndOrientation == Orientation.Top))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                if (!UsedPuzzleTilesIndices.Contains(5))
                {
                    if ((puzzleRoad.EndPosition == 0 && puzzleRoad.EndOrientation == Orientation.Left) ||
                        (puzzleRoad.EndPosition == 2 && puzzleRoad.EndOrientation == Orientation.Left))
                    {
                        endingRoad = true;
                        break;
                    }
                }
                break;
            }

            if (endingRoad.HasValue && endingRoad.Value)
            {
                puzzleRoad.EndPuzzleIndex = usingPuzzleIndex;
            }

            return(endingRoad.HasValue ? endingRoad.Value : false);
        }