示例#1
0
    /// <summary>
    /// This function return true if this hexagon can be take desired color id from near neighbours.
    /// </summary>
    /// <param name="targetColorId"></param>
    /// <param name="extractHexagonCoordinates"></param>
    /// <returns></returns>
    public bool CanBeColor(int targetColorId, Coordinate[] extractHexagonCoordinates)
    {
        Coordinate[]             nearNeighboursAdditiveCoordinates = GameUtils.NearNeighbours(GetCoordinate().x % 2 != 0);
        BoardController          boardController = GameManager.Instance.GetBoardController();
        List <HexagonController> nearNeighboursHexagonControllers = new List <HexagonController>();

        foreach (Coordinate additiveCoordinate in nearNeighboursAdditiveCoordinates)
        {
            HexagonController neighboursHexagonController = boardController.GetHexagonControllerByCoordinate(GetCoordinate() + additiveCoordinate, true);

            if (neighboursHexagonController == null)
            {
                continue;
            }

            if (extractHexagonCoordinates.Contains(neighboursHexagonController.GetCoordinate()))
            {
                continue;
            }

            nearNeighboursHexagonControllers.Add(neighboursHexagonController);
        }

        return(nearNeighboursHexagonControllers.Any(x => x.GetColorId() == targetColorId));
    }
示例#2
0
    /// <summary>
    /// This function returns true if there are any moves left.
    /// </summary>
    /// <returns></returns>
    public async UniTask CheckGameOver()
    {
        await UniTask.Yield();

        foreach (HexagonController hexagonController in hexagonControllers)
        {
            bool isAnyColorMatch = false;
            HexagonController otherHexagonController = null;

            foreach (Direction direction in (Direction[])Enum.GetValues(typeof(Direction)))
            {
                List <HexagonController> neighboursHexagonControllers = hexagonController.GetNeighboursHexagonControllers(direction);

                foreach (HexagonController neighboursHexagonController in neighboursHexagonControllers)
                {
                    if (hexagonController.GetColorId() == neighboursHexagonController.GetColorId())
                    {
                        otherHexagonController = neighboursHexagonController;
                        isAnyColorMatch        = true;
                        break;
                    }
                }

                if (isAnyColorMatch)
                {
                    break;
                }
            }

            if (!isAnyColorMatch)
            {
                continue;
            }

            if (otherHexagonController == null)
            {
                continue;
            }

            Coordinate[] extractHexagonCoordinates =
            {
                hexagonController.GetCoordinate(),
                otherHexagonController.GetCoordinate()
            };

            List <HexagonController> possibleHexagonControllers = new List <HexagonController>();

            Coordinate currentHexagonCoordinate = hexagonController.GetCoordinate();
            Coordinate otherHexagonCoordinate   = otherHexagonController.GetCoordinate();

            if (currentHexagonCoordinate.x == otherHexagonCoordinate.x)
            {
                if (currentHexagonCoordinate.x % 2 == 0)
                {
                    HexagonController targetHexagonController = currentHexagonCoordinate.y < otherHexagonCoordinate.y ? hexagonController : otherHexagonController;

                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(1, 0), true));
                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(-1, 0), true));
                }
                else
                {
                    HexagonController targetHexagonController = currentHexagonCoordinate.y > otherHexagonCoordinate.y ? hexagonController : otherHexagonController;

                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(1, 0), true));
                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(-1, 0), true));
                }
            }
            else
            {
                if (currentHexagonCoordinate.y == otherHexagonCoordinate.y)
                {
                    HexagonController evenHexagonController = currentHexagonCoordinate.x % 2 == 0 ? hexagonController : otherHexagonController;
                    HexagonController oddHexagonController  = currentHexagonCoordinate.x % 2 != 0 ? hexagonController : otherHexagonController;

                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(oddHexagonController.GetCoordinate() + new Coordinate(0, -1), true));
                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(evenHexagonController.GetCoordinate() + new Coordinate(0, 1), true));
                }
                else
                {
                    HexagonController smallerYAxisHexagonController = currentHexagonCoordinate.y < otherHexagonCoordinate.y ? hexagonController : otherHexagonController;
                    HexagonController greaterYAxisHexagonController = currentHexagonCoordinate.y > otherHexagonCoordinate.y ? hexagonController : otherHexagonController;

                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(greaterYAxisHexagonController.GetCoordinate() + new Coordinate(0, -1), true));
                    possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(smallerYAxisHexagonController.GetCoordinate() + new Coordinate(0, 1), true));
                }
            }

            possibleHexagonControllers.RemoveAll(x => x == null);

            foreach (HexagonController possibleHexagonController in possibleHexagonControllers)
            {
                if (possibleHexagonController.CanBeColor(hexagonController.GetColorId(), extractHexagonCoordinates))
                {
                    Debug.Log($"Move Caught. Coordinate : {possibleHexagonController.GetCoordinate()}");

                    return;
                }
            }
        }

        Debug.Log("Player Has No More Moves to Play!");
        GameManager.Instance.GameOver(1);
    }
示例#3
0
    /// <summary>
    /// This function helper for shift some hexagons like gravity..
    /// </summary>
    /// <returns></returns>
    public async UniTask Gravity()
    {
        isGravity = true;
        Debug.Log("Gravity Progress Started.");

        foreach (List <SlotController> verticalSlots in seperateSlotControllers)
        {
            int emptyCount      = 0;
            int interactedCount = 1;

            foreach (SlotController slotController in verticalSlots.AsEnumerable().Reverse().ToList())
            {
                if (slotController.GetHexagonController() == null)
                {
                    emptyCount++;
                    continue;
                }

                if (emptyCount == 0)
                {
                    continue;
                }

                HexagonController hexagonController    = slotController.GetHexagonController();
                SlotController    oldSlotController    = hexagonController.GetSlotController();
                SlotController    targetSlotController = GetSlotControllerByCoordinate(new Coordinate(hexagonController.GetCoordinate().x, hexagonController.GetCoordinate().y + emptyCount));

                if (targetSlotController == null)
                {
                    continue;
                }

                oldSlotController.SetHexagonController(null);
                hexagonController.SetSlotController(targetSlotController);
                ((HexagonView)hexagonController.GetView()).DrawDefaultLayer(true, (float)interactedCount / 10);

                interactedCount++;
            }
        }

        await UniTask.WaitUntil(() => !DOTween.IsTweening(CommonTypes.HEXAGON_GRAVITY_TWEEN_KEY));

        FillEmptySlots();

        await UniTask.WaitUntil(() => !DOTween.IsTweening(CommonTypes.HEXAGON_GRAVITY_TWEEN_KEY));

        await CheckHexagons(hexagonControllers);
        await CheckGameOver();

        isGravity = false;
        Debug.Log("Gravity Progress Completed.");
    }
示例#4
0
    /// <summary>
    /// This function helper for create random Hexagon.
    /// </summary>
    private HexagonController CreateHexagon(Hexagon hexagon, SlotController slotController, bool isOut = false)
    {
        if (hexagon == null)
        {
            bool isBonus = Random.Range(0, 10) == 5;
            int  colorId = Random.Range(0, gameSettings.Colors.Length);

            hexagon = new Hexagon(colorId, gameSettings.Colors[colorId], isBonus);
        }

        HexagonController hexagonController = Instantiate(gameSettings.HexagonPrefab, slotController.transform, false);

        if (isOut)
        {
            hexagonController.transform.position = slotController.transform.TransformVector(new Vector3(slotController.transform.localPosition.x, InterfaceManager.Instance.GetOutScreenYAxis(CommonTypes.HEXAGON_HEIGHT), 0));
        }

        hexagonController.Initialize(hexagon, slotController);
        hexagonControllers.Add(hexagonController);

        Debug.Log($"Hexagon is Created. ColorId : {hexagonController.GetColorId()} Coordinate : {hexagonController.GetCoordinate()}");

        return(hexagonController);
    }