|  | @@ -0,0 +1,305 @@
 | 
	
		
			
				|  |  | +using System.Collections;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using UnityEngine;
 | 
	
		
			
				|  |  | +using UI.ActivityHuaRongDao;
 | 
	
		
			
				|  |  | +using FairyGUI;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace GFGGame
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    public class ActivityHuaRongDaoView : BaseWindow
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        private UI_ActivityHuaRongDaoUI _ui;
 | 
	
		
			
				|  |  | +        public class Grid
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            public Vector2 pos;
 | 
	
		
			
				|  |  | +            public int num;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private Grid[,] gridArr;
 | 
	
		
			
				|  |  | +        private int gridNum = 3;
 | 
	
		
			
				|  |  | +        private List<GObject> items;
 | 
	
		
			
				|  |  | +        private bool firstInit;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public override void Dispose()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (_ui != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _ui.Dispose();
 | 
	
		
			
				|  |  | +                _ui = null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            base.Dispose();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        protected override void OnInit()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            base.OnInit();
 | 
	
		
			
				|  |  | +            packageName = UI_ActivityHuaRongDaoUI.PACKAGE_NAME;
 | 
	
		
			
				|  |  | +            _ui = UI_ActivityHuaRongDaoUI.Create();
 | 
	
		
			
				|  |  | +            viewCom = _ui.target;
 | 
	
		
			
				|  |  | +            viewCom.Center();
 | 
	
		
			
				|  |  | +            modal = true;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            _ui.m_item.target.visible = false;
 | 
	
		
			
				|  |  | +            _ui.m_btnClose.onClick.Add(Hide);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            firstInit = true;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            InitGridInfo();
 | 
	
		
			
				|  |  | +            CreateItems();
 | 
	
		
			
				|  |  | +            InitItems();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        protected override void OnShown()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            base.OnShown();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (!firstInit)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                SetGridInfo();
 | 
	
		
			
				|  |  | +                InitItems();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                firstInit = false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        protected override void OnHide()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            base.OnHide();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// 初始化所有格子的信息
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        private void InitGridInfo()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            gridArr = new Grid[gridNum, gridNum];
 | 
	
		
			
				|  |  | +            items = new List<GObject>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    gridArr[i, j] = new Grid();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            SetGridInfo();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void SetGridInfo()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            List<int> numList = GetRandomArr(1, 8);
 | 
	
		
			
				|  |  | +            //List<int> numList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 0, 8 };
 | 
	
		
			
				|  |  | +            Vector2 originPos = _ui.m_item.target.position;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    gridArr[i, j].num = numList[i * gridNum + j];
 | 
	
		
			
				|  |  | +                    gridArr[i, j].pos = originPos + new Vector2(j * _ui.m_item.target.width, i * _ui.m_item.target.height);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// 随机排序 min~max 连续的数字
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        /// <param name="min"></param>
 | 
	
		
			
				|  |  | +        /// <param name="max"></param>
 | 
	
		
			
				|  |  | +        /// <returns></returns>
 | 
	
		
			
				|  |  | +        private List<int> GetRandomArr(int min, int max)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            List<int> list = new List<int>();
 | 
	
		
			
				|  |  | +            for (int i = min; i <= max; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                list.Add(i);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            System.Random r = new System.Random();
 | 
	
		
			
				|  |  | +            for (int i = 0; i < list.Count; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                int index = r.Next(list.Count);
 | 
	
		
			
				|  |  | +                int temp = list[index];
 | 
	
		
			
				|  |  | +                list[index] = list[i];
 | 
	
		
			
				|  |  | +                list[i] = temp;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 最后一个是空的
 | 
	
		
			
				|  |  | +            list.Add(0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return list;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void InitItems()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            int itemIndex = 0;
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    // 空格不用放item
 | 
	
		
			
				|  |  | +                    if (gridArr[i, j].num == 0)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        continue;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    items[itemIndex].position = gridArr[i, j].pos;
 | 
	
		
			
				|  |  | +                    UI_item item = UI_item.Proxy(items[itemIndex]);
 | 
	
		
			
				|  |  | +                    item.m_index.text = gridArr[i, j].num.ToString();
 | 
	
		
			
				|  |  | +                    items[itemIndex].data = gridArr[i, j].num;
 | 
	
		
			
				|  |  | +                    UI_item.ProxyEnd();
 | 
	
		
			
				|  |  | +                    ++itemIndex;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /// <summary>
 | 
	
		
			
				|  |  | +        /// 创建可移动的实体
 | 
	
		
			
				|  |  | +        /// </summary>
 | 
	
		
			
				|  |  | +        private void CreateItems()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            for (int i = 1; i <= gridNum * gridNum - 1; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                GObject gObject = UIPackage.CreateObject("ActivityHuaRongDao", "item");
 | 
	
		
			
				|  |  | +                gObject.name = "item" + i;
 | 
	
		
			
				|  |  | +                gObject.onClick.Add(OnItemClick);
 | 
	
		
			
				|  |  | +                _ui.m_items.target.AddChild(gObject);
 | 
	
		
			
				|  |  | +                items.Add(gObject);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void OnItemClick(EventContext eventContext)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            GObject obj = eventContext.sender as GObject;
 | 
	
		
			
				|  |  | +            int num = (int)obj.data;
 | 
	
		
			
				|  |  | +            Grid newGrid = CheckCanMove(num);
 | 
	
		
			
				|  |  | +            if (newGrid != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _ui.m_items.target.touchable = false;
 | 
	
		
			
				|  |  | +                obj.TweenMove(newGrid.pos, 0.3f).OnComplete(()=>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _ui.m_items.target.touchable = true;
 | 
	
		
			
				|  |  | +                    CheckWin();
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private Grid CheckCanMove(int num)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            int indexX = 0;
 | 
	
		
			
				|  |  | +            int indexY = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 找到格子
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    if (gridArr[i, j].num == num)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        indexX = i;
 | 
	
		
			
				|  |  | +                        indexY = j;
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 判断格子四个方向是否有空格
 | 
	
		
			
				|  |  | +            if (CheckHaveNullGrid(indexX - 1, indexY) || CheckHaveNullGrid(indexX, indexY - 1)
 | 
	
		
			
				|  |  | +                || CheckHaveNullGrid(indexX + 1, indexY) || CheckHaveNullGrid(indexX, indexY + 1))
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return UpdateGridInfo(num);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private bool CheckHaveNullGrid(int indexX, int indexY)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (indexX >= 0 && indexX < gridNum)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (indexY >= 0 && indexY < gridNum)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    return gridArr[indexX, indexY].num == 0;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private Grid UpdateGridInfo(int num)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Vector2 nullGridindex = new Vector2(-1, 0);
 | 
	
		
			
				|  |  | +            Vector2 numGridindex = new Vector2(-1, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    if (gridArr[i, j].num == num)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        numGridindex = new Vector2(i, j);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    else if (gridArr[i, j].num == 0)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        nullGridindex = new Vector2(i, j);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    if (numGridindex.x != -1 && nullGridindex.x != -1)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            gridArr[(int)numGridindex.x, (int)numGridindex.y].num = 0;
 | 
	
		
			
				|  |  | +            gridArr[(int)nullGridindex.x, (int)nullGridindex.y].num = num;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            return gridArr[(int)nullGridindex.x, (int)nullGridindex.y];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void CheckWin()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            int num = 0;
 | 
	
		
			
				|  |  | +            for (int i = 0; i < gridNum; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                for (int j = 0; j < gridNum; j++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    if (i == 0 && j == 0)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        num = gridArr[i, j].num;
 | 
	
		
			
				|  |  | +                        if(num != 1)
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            return;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    else
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        // 不连续 没有胜利
 | 
	
		
			
				|  |  | +                        if (gridArr[i, j].num != num + 1)
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            return;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        // 继续检测
 | 
	
		
			
				|  |  | +                        else
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            ++num;
 | 
	
		
			
				|  |  | +                            // 胜利
 | 
	
		
			
				|  |  | +                            if (num == gridNum * gridNum - 1)
 | 
	
		
			
				|  |  | +                            {
 | 
	
		
			
				|  |  | +                                Debug.Log("You Win!!");
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |