Unity实战篇:实现连连看死局判定(二:具体实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15020543/article/details/84952531

要做死局判定,我们要明确在什么时候检察地图是否死局。

  • 刚刚初始化地图
  • 每次消除之后

 检查死局前我们也要同步更新有向邻接表字典和地图数组

我们约定,数组值为-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;
        }

核心内容就这些,可能有点难以理解,大家下载源码能更容易理解点,希望这篇博文能给你带来帮助,加油!

猜你喜欢

转载自blog.csdn.net/qq_15020543/article/details/84952531
今日推荐