|  | @@ -0,0 +1,313 @@
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Collections.Generic;
 | 
	
		
			
				|  |  | +using ET;
 | 
	
		
			
				|  |  | +using FairyGUI;
 | 
	
		
			
				|  |  | +using UI.MiniGame;
 | 
	
		
			
				|  |  | +using UnityEngine;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace GFGGame
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    public class FlipGameView : BaseView
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        private UI_FlipGameUI _ui;
 | 
	
		
			
				|  |  | +        //卡牌数量(配置)
 | 
	
		
			
				|  |  | +        private int cardNum = 16;
 | 
	
		
			
				|  |  | +        //当前卡牌数量
 | 
	
		
			
				|  |  | +        private int currentCardNum = 16;
 | 
	
		
			
				|  |  | +        //当前翻开卡牌
 | 
	
		
			
				|  |  | +        //"state" 0:未翻开,1:已翻开,2:已消除
 | 
	
		
			
				|  |  | +        private List<Dictionary<string, int>> cardList = new List<Dictionary<string, int>>();
 | 
	
		
			
				|  |  | +        //消除所需数量(配置)
 | 
	
		
			
				|  |  | +        private int needNum;
 | 
	
		
			
				|  |  | +        //游戏结束时长(配置)
 | 
	
		
			
				|  |  | +        private int gameTime = 120;
 | 
	
		
			
				|  |  | +        //游戏当前时长
 | 
	
		
			
				|  |  | +        private int currentGameTime = 120;
 | 
	
		
			
				|  |  | +        //行数
 | 
	
		
			
				|  |  | +        private int rows = 0;
 | 
	
		
			
				|  |  | +        //列数
 | 
	
		
			
				|  |  | +        private int columns = 4;
 | 
	
		
			
				|  |  | +        System.Random rand;
 | 
	
		
			
				|  |  | +        //通关评价
 | 
	
		
			
				|  |  | +        private List<int> CustemsNum = new List<int>()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            10,
 | 
	
		
			
				|  |  | +            30,
 | 
	
		
			
				|  |  | +            60,
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        private List<string> CustemsName = new List<string>()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            "良好",
 | 
	
		
			
				|  |  | +            "优秀",
 | 
	
		
			
				|  |  | +            "卓越"
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //假数据
 | 
	
		
			
				|  |  | +        private int[] cardArray = new int[] { 1,1, 2,2,  3, 3 , 4, 4 ,  5, 5 ,  6, 6 ,  8, 8 , 8, 8  };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Card _c1 = new Card();
 | 
	
		
			
				|  |  | +        private float waitTime = 0.6f;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public override void Dispose()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            if (_ui != null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _ui.Dispose();
 | 
	
		
			
				|  |  | +                _ui = null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            base.Dispose();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        protected override void OnInit()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            base.OnInit();
 | 
	
		
			
				|  |  | +            packageName = UI_FlipGameUI.PACKAGE_NAME;
 | 
	
		
			
				|  |  | +            _ui = UI_FlipGameUI.Create();
 | 
	
		
			
				|  |  | +            this.viewCom = _ui.target;
 | 
	
		
			
				|  |  | +            isfullScreen = true;
 | 
	
		
			
				|  |  | +            _ui.m_cardList.itemRenderer = ListCardItem;
 | 
	
		
			
				|  |  | +            _ui.m_back.onClick.Add(OnClickBtnBack);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            UIObjectFactory.SetPackageItemExtension("ui://MiniGame/CardComponent", typeof(Card));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        protected override void OnShown()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            base.OnShown();
 | 
	
		
			
				|  |  | +            UpdateView();
 | 
	
		
			
				|  |  | +            UpdateList();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        protected override void OnHide()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _ui.m_cardList.RemoveChildrenToPool();
 | 
	
		
			
				|  |  | +            base.OnHide();
 | 
	
		
			
				|  |  | +            cardList.Clear();
 | 
	
		
			
				|  |  | +            Timers.inst.Remove(UpdateTime);
 | 
	
		
			
				|  |  | +            Timers.inst.Remove(canTouch);
 | 
	
		
			
				|  |  | +            Timers.inst.Remove(UpdateCard);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void OnClickBtnBack()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Timers.inst.Remove(UpdateTime);
 | 
	
		
			
				|  |  | +            AlertUI.Show("是否退出游戏")
 | 
	
		
			
				|  |  | +            .SetLeftButton(true, "取消", (object data) =>
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Timers.inst.Add(1.0f, 0, UpdateTime);
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +            .SetRightButton(true, "确定", (object data) =>
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                this.Hide();
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void ListCardItem(int index, GObject item)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            UI_cardItem cardItem = UI_cardItem.Proxy(item);
 | 
	
		
			
				|  |  | +            Dictionary<string, int> itemInfo = new Dictionary<string, int>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            //备注的后续都读表
 | 
	
		
			
				|  |  | +            //cardItem.m_icon.url = "";
 | 
	
		
			
				|  |  | +            if (cardItem.target.data == null)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                cardItem.target.onClick.Add(OnClickCardItem);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            _c1 = (Card)cardItem.m_card;
 | 
	
		
			
				|  |  | +            _c1.opened = false;
 | 
	
		
			
				|  |  | +            _c1.SetPerspective();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            itemInfo.Add("index", index);
 | 
	
		
			
				|  |  | +            itemInfo.Add("id", cardArray[index]);
 | 
	
		
			
				|  |  | +            itemInfo.Add("state", 0);
 | 
	
		
			
				|  |  | +            cardItem.m_id.text = itemInfo["id"].ToString();
 | 
	
		
			
				|  |  | +            cardItem.target.data = itemInfo;
 | 
	
		
			
				|  |  | +            UI_cardItem.ProxyEnd();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        private void UpdateView()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            currentGameTime = gameTime;
 | 
	
		
			
				|  |  | +            currentCardNum = cardNum;
 | 
	
		
			
				|  |  | +            needNum = 2;
 | 
	
		
			
				|  |  | +            rand = new System.Random();
 | 
	
		
			
				|  |  | +            //洗牌
 | 
	
		
			
				|  |  | +            RandomCardList(cardArray, cardArray.Length);
 | 
	
		
			
				|  |  | +            //
 | 
	
		
			
				|  |  | +            _ui.m_timeText.text = string.Format("倒计时:{0}", currentGameTime);
 | 
	
		
			
				|  |  | +            _ui.m_ScareBar.max = gameTime;
 | 
	
		
			
				|  |  | +            _ui.m_ScareBar.min = 0;
 | 
	
		
			
				|  |  | +            _ui.m_ScareBar.value = gameTime;
 | 
	
		
			
				|  |  | +            _ui.m_star1.SetPosition(((float)CustemsNum[0]/(float)gameTime)*_ui.m_ScareBar.width,_ui.m_star1.position.y, _ui.m_star1.position.z);
 | 
	
		
			
				|  |  | +            _ui.m_star2.SetPosition(((float)CustemsNum[1] / (float)gameTime) * _ui.m_ScareBar.width, _ui.m_star1.position.y, _ui.m_star1.position.z);
 | 
	
		
			
				|  |  | +            _ui.m_star3.SetPosition(((float)CustemsNum[2] / (float)gameTime) * _ui.m_ScareBar.width, _ui.m_star1.position.y, _ui.m_star1.position.z);
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +            //计时器
 | 
	
		
			
				|  |  | +            Timers.inst.Add(1.0f, 0, UpdateTime);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void UpdateList()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _ui.m_cardList.columnCount = columns;
 | 
	
		
			
				|  |  | +            _ui.m_cardList.numItems = cardNum;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        private void OnClickCardItem(EventContext context)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            GObject cardItem = context.sender as GObject;
 | 
	
		
			
				|  |  | +            Dictionary<string, int> cardInfo = (Dictionary<string, int>)cardItem.data;
 | 
	
		
			
				|  |  | +            UI_cardItem item = UI_cardItem.Proxy(_ui.m_cardList.GetChildAt(cardInfo["index"]));
 | 
	
		
			
				|  |  | +            Card card = (Card)item.m_card;
 | 
	
		
			
				|  |  | +            if (cardList.Count == 0)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                //当前翻开列表为空,直接处理翻开,添加
 | 
	
		
			
				|  |  | +                cardInfo["state"] = 1;
 | 
	
		
			
				|  |  | +                //翻牌
 | 
	
		
			
				|  |  | +                card.Turn();
 | 
	
		
			
				|  |  | +                _ui.m_cardList.touchable = false;
 | 
	
		
			
				|  |  | +                Timers.inst.Add(waitTime, 1, canTouch);
 | 
	
		
			
				|  |  | +                //
 | 
	
		
			
				|  |  | +                cardList.Add(cardInfo);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                bool isLast = false;
 | 
	
		
			
				|  |  | +                for (int i = 0; i < cardList.Count; i++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    //点击到已翻开的就翻回去,
 | 
	
		
			
				|  |  | +                    if (cardInfo["index"] == cardList[i]["index"])
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        //翻牌
 | 
	
		
			
				|  |  | +                        card.Turn();
 | 
	
		
			
				|  |  | +                        _ui.m_cardList.touchable = false;
 | 
	
		
			
				|  |  | +                        Timers.inst.Add(waitTime, 1, canTouch);
 | 
	
		
			
				|  |  | +                        //
 | 
	
		
			
				|  |  | +                        cardList.RemoveAt(i);
 | 
	
		
			
				|  |  | +                        isLast = true;
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    }  
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (!isLast)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    //翻牌
 | 
	
		
			
				|  |  | +                    card.Turn();
 | 
	
		
			
				|  |  | +                    _ui.m_cardList.touchable = false;
 | 
	
		
			
				|  |  | +                    cardInfo["state"] = 1;
 | 
	
		
			
				|  |  | +                    cardList.Add(cardInfo);
 | 
	
		
			
				|  |  | +                    Timers.inst.Add(waitTime, 1, UpdateCard);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            UI_cardItem.ProxyEnd();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //这里是处理已翻开的数量
 | 
	
		
			
				|  |  | +        private void UpdateCard(object param = null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            bool isClear = true;
 | 
	
		
			
				|  |  | +            for (int i = 1; i < cardList.Count; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if(cardList[0]["id"] != cardList[i]["id"])
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    isClear = false;
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                isClear = true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if(isClear)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (cardList.Count == needNum)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    for (int i = 0; i < cardList.Count; i++)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        cardList[i]["state"] = 2;
 | 
	
		
			
				|  |  | +                        //消除
 | 
	
		
			
				|  |  | +                        _ui.m_cardList.GetChildAt(cardList[i]["index"]).visible = false;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    currentCardNum -= cardList.Count;
 | 
	
		
			
				|  |  | +                    cardList.Clear();
 | 
	
		
			
				|  |  | +                    if(currentCardNum <= 0)
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        Gameover(true);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                _ui.m_cardList.touchable = true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                _ui.m_cardList.touchable = false;
 | 
	
		
			
				|  |  | +                //= UI_cardItem.Proxy(_ui.m_cardList.GetChildAt(cardList[0]["index"]));
 | 
	
		
			
				|  |  | +                for (int i = 0; i < cardList.Count; i++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    UI_cardItem item = UI_cardItem.Proxy(_ui.m_cardList.GetChildAt(cardList[i]["index"]));
 | 
	
		
			
				|  |  | +                    //翻回去
 | 
	
		
			
				|  |  | +                    Card card = (Card)item.m_card;
 | 
	
		
			
				|  |  | +                    card.Turn();
 | 
	
		
			
				|  |  | +                    //card = null;
 | 
	
		
			
				|  |  | +                    UI_cardItem.ProxyEnd();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                Timers.inst.Add(waitTime, 1, canTouch);
 | 
	
		
			
				|  |  | +                cardList.Clear(); 
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        private void UpdateTime(object param = null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            currentGameTime--;
 | 
	
		
			
				|  |  | +            _ui.m_ScareBar.value = currentGameTime;
 | 
	
		
			
				|  |  | +            _ui.m_timeText.text = string.Format ("倒计时:{0}", currentGameTime);
 | 
	
		
			
				|  |  | +            if(currentGameTime <= 0)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Timers.inst.Remove(UpdateTime);
 | 
	
		
			
				|  |  | +                Gameover(false);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void canTouch(object param = null)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _ui.m_cardList.touchable = true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void Gameover(bool isPass = false)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Timers.inst.Remove(UpdateTime);
 | 
	
		
			
				|  |  | +            if (!isPass)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                AlertUI.Show("游戏时间到")
 | 
	
		
			
				|  |  | +                .SetLeftButton(false)
 | 
	
		
			
				|  |  | +                .SetRightButton(true, "确定", (object data) =>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    this.Hide();
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                string custemsName = "";
 | 
	
		
			
				|  |  | +                for(int i = CustemsNum.Count - 1; i>=0; i--)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    if(currentGameTime >= CustemsNum[i])
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        custemsName = CustemsName[i];
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                AlertUI.Show(string.Format("恭喜通过,所用时长:{0},通关评价:{1}", currentGameTime, custemsName))
 | 
	
		
			
				|  |  | +                .SetLeftButton(false)
 | 
	
		
			
				|  |  | +                .SetRightButton(true, "确定", (object data) =>
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    this.Hide();
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //洗牌
 | 
	
		
			
				|  |  | +        private void RandomCardList(int[] array, int length)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            int index;
 | 
	
		
			
				|  |  | +            int value;
 | 
	
		
			
				|  |  | +            for (int i = length - 1; i >= 0; i--)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                index = rand.Next(0, i + 1);
 | 
	
		
			
				|  |  | +                value = array[i];
 | 
	
		
			
				|  |  | +                array[i] = array[index];
 | 
	
		
			
				|  |  | +                array[index] = value;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |