Пример #1
0
        private void TrySwapElements(Element source, Element target)
        {
            int sourceIndex;
            int targetIndex;

            try
            {
                sourceIndex = int.Parse(source.name);
                targetIndex = int.Parse(target.name);
            }
            catch (Exception e)
            {
    #if UNITY_EDITOR
                print(PrettyLog.GetMessage($"Swap object name parse error: {e.Message}"));
    #endif
                return;
            }

            var canSwap = _playground.CanSwap(sourceIndex, targetIndex);

            if (canSwap)
            {
                StartCoroutine(MakeSwap(sourceIndex, targetIndex));
            }

    #if UNITY_EDITOR
            print(PrettyLog.GetMessage($"Opportunity to swap {sourceIndex} with {targetIndex} is {canSwap}"));
    #endif
        }
Пример #2
0
        private void OnMouseUp()
        {
            if (!_isDragging)
            {
                return;
            }

            var upPosition = transform.position;

            transform.position = _startPosition;

    #if UNITY_EDITOR
            print(PrettyLog.GetMessage(OnMouseUp, $"transform.position = {transform.position}"));
    #endif

            if (OnTrySwap != null)
            {
                if (Input.GetMouseButtonDown(0))
                {
                    return;
                }

                RaycastHit hit;
                Physics.Raycast(upPosition, new Vector3(0f, 0f, 1f), out hit);
                var selectedItem = hit.transform?.gameObject.GetComponent <Element>();

    #if UNITY_EDITOR
                print(PrettyLog.GetMessage(OnMouseUp, $"selectedItem: {selectedItem}"));
    #endif
                if (this != selectedItem)
                {
                    OnTrySwap(this, selectedItem);
                }
            }
        }
Пример #3
0
     private void Start()
     {
 #if UNITY_EDITOR
         print(PrettyLog.GetMessage(Start));
 #endif
         _mainMenu.Init(StartGame);
         _ingameMenu.Init(EndGame);
         _ingameMenu.gameObject.SetActive(false);
     }
Пример #4
0
        private void OnMouseDown()
        {
            _startPosition      = transform.position;
            transform.position -= new Vector3(0f, 0f, 1f);
            _screenPoint        = Camera.main.WorldToScreenPoint(gameObject.transform.position);

    #if UNITY_EDITOR
            print(PrettyLog.GetMessage(OnMouseDown, $"_startPosition = {_startPosition}"));
    #endif
        }
Пример #5
0
        public void Rearrange()
        {
            var rearrangedElements = new List <Tuple <int, byte> >();

            for (var i = 0; i < Width; i++)
            {
                rearrangedElements.AddRange(GetSortedColumn(i));
            }

            OnPlaygroundUpdated?.Invoke(rearrangedElements);

    #if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(Rearrange), rearrangedElements));
    #endif
        }
Пример #6
0
        public Playground(byte n, byte m, byte elementTypesCount)
        {
            Width             = n;
            Height            = m;
            ElementTypesCount = elementTypesCount;

            _elements = new List <byte>();
            for (var i = 0; i < n * m; i++)
            {
                Add((byte)new Random().Next(1, new Random().Next(1, new Random().Next(1, elementTypesCount))));
            }

#if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), "Ctor", _elements));
#endif
        }
Пример #7
0
        public void StartGame(byte n, byte m, byte count)
        {
            Assert.IsTrue(count < n * m, "Element types count higher than n * m!");

            var nValue          = n != 0 ? n : _n;
            var mValue          = m != 0 ? m : _m;
            var typesCountValue = count != 0 ? count : _elementTypesCount;

            _playground     = new Playground(nValue, mValue, typesCountValue);
            _playgroundView = new GameObject(nameof(PlaygroundView)).AddComponent <PlaygroundView>();
            _playgroundView.Init(_playground);

            _mainCamera.orthographicSize = Math.Max(n, m);
            _ingameMenu.gameObject.SetActive(true);
    #if UNITY_EDITOR
            print(PrettyLog.GetMessage(nameof(App), nameof(StartGame), $"n = {n}, m = {m}, count = {count}"));
    #endif
        }
Пример #8
0
        public void CleanAt(int index)
        {
    #if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(CleanAt), $"{index}"));
    #endif

            var list = GetRemovableElements(index);

            if (list.Count == 1)
            {
                return;
            }
            list.ForEach(RemoveAt);

            var result = list.Select(element => Tuple.Create(element, (byte)0)).ToList();
            OnPlaygroundUpdated?.Invoke(result);

    #if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(CleanAt), result));
    #endif
        }
Пример #9
0
        public void Fill()
        {
            var filledElements = new List <Tuple <int, byte> >();
            var i = 0;

            _elements.ForEach(element =>
            {
                if (element == 0)
                {
                    filledElements.Add(Tuple.Create(i,
                                                    (byte)new Random().Next(1, new Random().Next(1, ElementTypesCount))));
                }
                i++;
            });

            filledElements.ForEach(element => _elements[element.Item1] = element.Item2);
            OnPlaygroundUpdated?.Invoke(filledElements);

    #if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(Fill), filledElements));
    #endif
        }
Пример #10
0
        private List <int> GetRemovableElements(int index)
        {
            var result = new List <int>()
            {
                index
            };

            while (true)
            {
                var elements = GetAllAvailableElements(result);
                if (!elements.Any())
                {
                    break;
                }
                result.AddRange(elements);
            }

    #if UNITY_EDITOR
            Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(GetRemovableElements), result));
    #endif

            return(result.Distinct().ToList());
        }
Пример #11
0
        public void Init(Playground playground)
        {
    #if UNITY_EDITOR
            print(PrettyLog.GetMessage(typeof(PlaygroundView).GetMethod(nameof(Init)), playground.ToString())); // =)
    #endif

            _playground = playground;
            _playground.OnPlaygroundUpdated += UpdatePlaygroundView;

            // Initialization background
            _backgroundPlane = GameObject.CreatePrimitive(PrimitiveType.Plane);
            _backgroundPlane.transform.SetParent(transform);
            _backgroundPlane.transform.localScale = new Vector3(playground.Width, 1, playground.Height);
            _backgroundPlane.transform.rotation   = new Quaternion(0, -90, 90, 0);
            _backgroundPlane.GetComponent <MeshRenderer>().material =
                new Material(Shader.Find(Defaults.BackgroundPlaneShader))
            {
                color = Color.black
            };

            // Initialization game elements pallete
            _colors = new List <Color>();
            _colors.Add(Color.black);

    #if UNITY_EDITOR
            print(PrettyLog.GetMessage(Color.white, "is color of empty element 0"));
    #endif

            for (var i = 1; i <= playground.ElementTypesCount; i++)
            {
                var color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
                _colors.Add(color);

    #if UNITY_EDITOR
                print(PrettyLog.GetMessage(color, $"is color of element {i}"));
    #endif
            }

            // Initialization game elements
            _elements = new GameObject(Defaults.ElementsGameObjectName);
            _elements.transform.SetParent(transform);

            int index;
            playground.ToList().ForEach(element =>
            {
                var @object          = GameObject.CreatePrimitive(PrimitiveType.Cube);
                var elementComponent = @object.AddComponent <Element>();

                elementComponent.OnTrySwap += TrySwapElements;
                @object.transform.SetParent(_elements.transform);
                index = @object.transform.GetSiblingIndex();
                @object.GetComponent <MeshRenderer>().material =
                    new Material(Shader.Find(Defaults.BackgroundPlaneShader))
                {
                    color = _colors[playground[index]]
                };

                var x = (index * 2) % (2 * playground.Width) - playground.Width;
                var y = playground.Height - (index / playground.Width * 2) % (playground.Height * 2);

                @object.name = $"{index}";
                @object.transform.localPosition = new Vector3(x, y, -1);
            });
        }