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 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(); } /// /// 初始化所有格子的信息 /// private void InitGridInfo() { gridArr = new Grid[gridNum, gridNum]; items = new List(); for (int i = 0; i < gridNum; i++) { for (int j = 0; j < gridNum; j++) { gridArr[i, j] = new Grid(); } } SetGridInfo(); } private void SetGridInfo() { List numList = GetRandomArr(1, 8); //List numList = new List() { 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); } } } /// /// 随机排序 min~max 连续的数字 /// /// /// /// private List GetRandomArr(int min, int max) { List list = new List(); 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; } } } /// /// 创建可移动的实体 /// 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!!"); } } } } } } } }