1. 程式人生 > >Unity實戰篇:實現連連看死局判定(二:具體實現)

Unity實戰篇:實現連連看死局判定(二:具體實現)

要做死局判定,我們要明確在什麼時候檢察地圖是否死局。

  • 剛剛初始化地圖
  • 每次消除之後

 檢查死局前我們也要同步更新有向鄰接表字典和地圖陣列

我們約定,陣列值為-1代表此處為空

  • 遍歷字典,找到要去除的元素,從字典刪除
  • 避免異常,刪除元素後即退出函式
        /// <summary>
        /// 改變鄰接表
        /// </summary>
        /// <param name="x1"></param>
        /// <param name="y1"></param>
        /// <param name="x2"></param>
        /// <param name="y2"></param>
        public void ChangeLinkMap(int x, int y)
        {
            if(x==-1&&y==-1) return;
            foreach (int value in MapManager.MapCollect.Keys)
            {
                LinkedListNode<FruitNode> tempNode = MapManager.MapCollect[value].First;
                while (tempNode != null)
                {
                    if ((tempNode.Value.X == x && tempNode.Value.Y == y))
                    {
                        MapManager.MapCollect[value].Remove(tempNode);
                        return;
                    }
                    else
                    {
                        tempNode = tempNode.Next;
                    }
                }
            }
        }
    /// <summary>
    /// 消除符合條件的兩張牌
    /// </summary>
    /// <param name="x1"></param>
    /// <param name="y1"></param>
    /// <param name="x2"></param>
    /// <param name="y2"></param>
    /// <returns></returns>
    private IEnumerator Destory(int x1, int y1, int x2, int y2)
    {
        //畫線
        DrawLine.Instance.DrawLinkLine(G1, G2, LinkType, Z1, Z2);
        yield return new WaitForSeconds(0.2f);
        Destroy(G1);
        Destroy(G2);
        MapManager.TestMap[x1, y1] = -1; //置空
        MapManager.TestMap[x2, y2] = -1; //置空
        JudgeManager.Instance.CheckMap(x1, y1, x2, y2);
        x1 = x2 = y1 = y2 = Value1 = Value2 = 0;
    }

 

檢查死局

  • 將引數先從字典去除
    • 檢測字典各個單鏈表是否有非死局的情況
        /// <summary>
        /// 檢測是否死局(分為遊戲結束和遊戲未結束兩種情況)
        /// </summary>
        public bool CheckMap(int x1,int y1,int x2,int y2)
        {
            ChangeLinkMap(x1,y1);
            ChangeLinkMap(x2,y2);
            foreach (int value in MapManager.MapCollect.Keys)
            {
                LinkedListNode<FruitNode> tempNode = MapManager.MapCollect[value].First;
                while (tempNode != null)
                {
                    LinkedListNode<FruitNode> tempNodeNext = tempNode.Next;
                    while (tempNodeNext != null)
                    {
                        if (IsLink(tempNode.Value.X, tempNode.Value.Y, tempNodeNext.Value.X, tempNodeNext.Value.Y))
                        {
                            Debug.Log("不是死局,遊戲繼續");
                            return false;
                        }

                        tempNodeNext = tempNodeNext.Next;
                    }

                    tempNode = tempNode.Next;
                }
            }
            Debug.Log("遊戲結束,恭喜過關");
            GameManager.IsOver = true;
            return true;
        }

核心內容就這些,可能有點難以理解,大家下載原始碼能更容易理解點,希望這篇博文能給你帶來幫助,加油!