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 readonly int _gridNum = 3; private List _items; private bool _gameStart; private HuarongRoadGame cfg; 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(); isReturnView = true; modal = true; _ui.m_item.target.visible = false; _ui.m_btnBack.onClick.Add(OnBtnBackClick); InitGridInfo(); CreateItems(); } protected override void OnShown() { base.OnShown(); cfg = (HuarongRoadGame)viewData; SetGridInfo(); InitItems(); _gameStart = false; ResetCountdown(); Countdown(null); Timers.inst.Add(1, 0, Countdown); } 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(); } } } private void SetGridInfo() { //List numList = GetRandomArr(1, 8); List numList = GetArrByConfigStep(cfg.step); 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 List GetArrByConfigStep(int configStep) { List list = new List(); for (int i = 1; i <= 8; i++) { list.Add(i); } // 最后一个是空的 list.Add(0); int num = 0; Vector2 zeroPos = new Vector2(2, 2); Vector2[] dirArr = { new Vector2(-1, 0), new Vector2(1, 0), new Vector2(0, -1), new Vector2(0, 1) }; Vector2 lastPos = zeroPos; while (num < configStep) { int n = Random.Range(0, 4); Vector2 tempPos = zeroPos + dirArr[n]; if (tempPos != lastPos && tempPos.x >= 0 && tempPos.y >= 0 && tempPos.x < _gridNum && tempPos.y < _gridNum) { list[(int)zeroPos.x * _gridNum + (int)zeroPos.y] = list[(int)tempPos.x * _gridNum + (int)tempPos.y]; list[(int)tempPos.x * _gridNum + (int)tempPos.y] = 0; lastPos = zeroPos; zeroPos = tempPos; } ++num; } 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.1f).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) { // 关卡推进 int passLevel = cfg.resArr[0]; ActivityHuaRongDaoEntryView.curLevel = Mathf.Max(passLevel, ActivityHuaRongDaoEntryView.curLevel); EventAgent.DispatchEvent(ConstMessage.ACTIVITY_HUARONGDAO_UPDATE); // 弹出成功界面 ViewManager.Show(cfg); } } } } } } private int countDownNum; private void Countdown(object param) { _ui.m_seconds.text = countDownNum.ToString(); --countDownNum; if (countDownNum < 0) { _ui.m_tips.visible = false; Timers.inst.Remove(Countdown); _gameStart = true; return; } } private void ResetCountdown() { countDownNum = 3; _ui.m_tips.visible = true; Timers.inst.Remove(Countdown); } private void OnBtnBackClick() { if (_gameStart) { AlertUI.Show("退出游戏不保存进度,不扣除任何次数和道具,是否退出?") .SetLeftButton(true, "返回游戏") .SetRightButton(true, "仍要退出", (obj) => { Hide(); }); } else { Hide(); } } } }