public void RemovePuzzle(PuzzleModel puzzleModel) { checkResultModels.Foreach(totalCheckResultModel => { if (totalCheckResultModel.CheckPuzzles.Contains(puzzleModel)) { totalCheckResultModel.CheckPuzzles.Remove(puzzleModel); } }); }
/// <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); }
/// <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); }
/// <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(); } }
public void AddCheckedPuzzle(PuzzleModel puzzleModel) { CheckPuzzles.Add(puzzleModel); }
public void SetPickedPuzzle(PuzzleModel puzzleModel) { PickedPuzzle = puzzleModel; }
public void SetOverlapPuzzle(PuzzleModel puzzleModel) { OverlapPuzzle = puzzleModel; }
/// <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(); } }
/// <summary> /// 해당 enum 타입 방향에 있는 바로 옆 퍼즐의 키 값을 리턴. /// </summary> public PositionModel GetPositionByDirectionType(PuzzleModel model, CheckDirectionTypes checkDirectionTypes) { return(GetKeyByAngle(model.PositionModel, (float)checkDirectionTypes)); }
public PuzzleModel GetBesideModel(PuzzleModel target, CheckDirectionTypes checkDirectionTypes) { var targetPosition = GetPositionByDirectionType(target, checkDirectionTypes); return(GetContainPuzzleModel(targetPosition)); }