Esempio n. 1
0
 public void RemovePuzzle(PuzzleModel puzzleModel)
 {
     checkResultModels.Foreach(totalCheckResultModel =>
     {
         if (totalCheckResultModel.CheckPuzzles.Contains(puzzleModel))
         {
             totalCheckResultModel.CheckPuzzles.Remove(puzzleModel);
         }
     });
 }
Esempio n. 2
0
 /// <summary>
 /// 정렬, 이동이 완료됨.
 /// </summary>
 public void CompleteAlignedPuzzles(PuzzleModel puzzleModel)
 {
     Debug.Log($"{puzzleModel} move complete at");
     _predicatedFlowDownPositions.Remove(puzzleModel);
     _predicatedFlowSidePositionDict.Remove(puzzleModel);
     if (_alignedPuzzles.Contains(puzzleModel))
     {
         return;
     }
     _alignedPuzzles.Add(puzzleModel);
 }
Esempio n. 3
0
 /// <summary>
 /// Able to the puzzle move?
 /// </summary>
 public bool CheckMovablePuzzleModel(PuzzleModel puzzleModel)
 {
     /*
      * 퍼즐 모델이 null이 아님.
      * 퍼즐 모델이 삭제예정이 아님.
      * 퍼즐이 이동 예정이 아님.
      * */
     return(puzzleModel != null &&
            !puzzleModel.IsChecked &&
            !_predicatedFlowSidePositionDict.ContainsKey(puzzleModel) &&
            !_predicatedFlowDownPositions.ContainsKey(puzzleModel));
 }
        public void SetModel(PuzzleModel puzzleModel)
        {
            PuzzleModel = puzzleModel;

            PuzzleModel.AddChangePuzzleEvent(ChangeShape);
            PuzzleModel.AddCheckpuzzleEvent(Checked);
            PuzzleModel.AddDownPuzzleEvent(Move);
            PuzzleModel.AddObstacleEvent(CheckObstacle);
            PuzzleModel.AddChangeSpecialTypeEvent(ChangeSpecialType);
            PuzzleModel.AddResetPuzzleEvent(InitializePuzzle);

            ChangeShape(PuzzleModel);
        }
Esempio n. 5
0
        /// <summary>
        /// 퍼즐 생성.
        /// Generate puzzles.
        /// </summary>
        private void CreatePuzzles(ICollection <PositionModel> obsPostition)
        {
            do
            {
                Positioning();
            } while (!CheckMovablePuzzleState());

            void Positioning()
            {
                InitializeModels();

                for (var c = 0; c < AllLineModels.Count; c++)
                {
                    for (var r = 0; r < AllLineModels[c].Count; r++)
                    {
                        var positionModel = new PositionModel(c, r);
                        if (!ContainLineModel(positionModel))
                        {
                            continue;
                        }

                        var puzzleModel = new PuzzleModel();
                        AllPuzzleModels.Add(puzzleModel);

                        puzzleModel.PositionModel = positionModel;
                        puzzleModel.ObstacleTypes =
                            obsPostition.Contains(positionModel) ? ObstacleTypes.Top : ObstacleTypes.None;
                        SetPuzzleColorTypes(puzzleModel);
                    }
                }
            }

            void InitializeModels()
            {
                AllPuzzleModels.Clear();
            }
        }
Esempio n. 6
0
 public void AddCheckedPuzzle(PuzzleModel puzzleModel)
 {
     CheckPuzzles.Add(puzzleModel);
 }
Esempio n. 7
0
 public void SetPickedPuzzle(PuzzleModel puzzleModel)
 {
     PickedPuzzle = puzzleModel;
 }
Esempio n. 8
0
 public void SetOverlapPuzzle(PuzzleModel puzzleModel)
 {
     OverlapPuzzle = puzzleModel;
 }
Esempio n. 9
0
        /// <summary>
        /// 특수 퍼즐 영역에 맞는 퍼즐들을 찾음.
        /// </summary>
        private void ProcessSpecialPuzzle(TotalCheckResultModel totalCheckResultModel, PuzzleModel puzzleModel)
        {
            if (totalCheckResultModel.PuzzleMatchingTypes == PuzzleMatchingTypes.Pick)
            {
                var targetPuzzleColorTypes =
                    totalCheckResultModel.PickedPuzzle?.PuzzleColorTypes ?? GetRandomPuzzleColorTypes();

                if (_playerControlModel.IsPlayerControl)
                {
                    var foundedPuzzles = new List <PuzzleModel> ();

                    switch (totalCheckResultModel.PickedPuzzle?.PuzzleSpecialTypes)
                    {
                    case PuzzleSpecialTypes.None:
                        foundedPuzzles = GetPuzzles(x => x.PuzzleColorTypes.Equals(targetPuzzleColorTypes))
                                         .ToList();
                        break;

                    case PuzzleSpecialTypes.ToVertical:
                    case PuzzleSpecialTypes.ToUpLeftDownRight:
                    case PuzzleSpecialTypes.ToUpRightDownLeft:
                        foundedPuzzles = GetPuzzles(x => x.PuzzleColorTypes.Equals(targetPuzzleColorTypes))
                                         .ToList();
                        foundedPuzzles.Foreach(x => x.ChangeSpecialPuzzle(GetRandomLineSpecialTypes()));
                        break;

                    case PuzzleSpecialTypes.Bomb:
                        foundedPuzzles = GetPuzzles(x => x.PuzzleColorTypes.Equals(targetPuzzleColorTypes))
                                         .ToList();
                        foundedPuzzles.Foreach(x => x.ChangeSpecialPuzzle(PuzzleSpecialTypes.Bomb));
                        break;

                    case PuzzleSpecialTypes.PickColors:
                        foundedPuzzles = AllPuzzleModels.ToList();
                        break;
                    }

                    totalCheckResultModel.AddRangeMatchPuzzle(foundedPuzzles);
                }

                IEnumerable <PuzzleModel> GetPuzzles(Func <PuzzleModel, bool> predicate = null)
                {
                    return(AllPuzzleModels.Where(predicate));
                }

                PuzzleSpecialTypes GetRandomLineSpecialTypes()
                {
                    var rand = Random.Range(0, (int)PuzzleSpecialTypes.ToUpRightDownLeft);

                    return((PuzzleSpecialTypes)rand);
                }
            }

            switch (puzzleModel.PuzzleSpecialTypes)
            {
            case PuzzleSpecialTypes.ToVertical:
                totalCheckResultModel.AddRangeMatchPuzzle(AllPuzzleModels.Where(x =>
                                                                                x.Column == puzzleModel.Column));
                break;

            case PuzzleSpecialTypes.ToUpLeftDownRight:
                AllPuzzleFindCheckDir(totalCheckResultModel, puzzleModel, CheckDirectionTypes.ToUpLeft,
                                      CheckDirectionTypes.ToDownRight);
                break;

            case PuzzleSpecialTypes.ToUpRightDownLeft:
                AllPuzzleFindCheckDir(totalCheckResultModel, puzzleModel, CheckDirectionTypes.ToUpRight,
                                      CheckDirectionTypes.ToDownLeft);
                break;

            case PuzzleSpecialTypes.Bomb:
                var aroundPositions = GetAroundPositionModel(puzzleModel.PositionModel);
                totalCheckResultModel.AddRangeMatchPuzzle(aroundPositions.Select(GetContainPuzzleModel));
                break;

            case PuzzleSpecialTypes.PickColors:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 10
0
 /// <summary>
 /// 해당 enum 타입 방향에 있는 바로 옆 퍼즐의 키 값을 리턴.
 /// </summary>
 public PositionModel GetPositionByDirectionType(PuzzleModel model, CheckDirectionTypes checkDirectionTypes)
 {
     return(GetKeyByAngle(model.PositionModel, (float)checkDirectionTypes));
 }
Esempio n. 11
0
        public PuzzleModel GetBesideModel(PuzzleModel target, CheckDirectionTypes checkDirectionTypes)
        {
            var targetPosition = GetPositionByDirectionType(target, checkDirectionTypes);

            return(GetContainPuzzleModel(targetPosition));
        }