Unity實戰篇:實現連連看死局判定(二:具體實現)
阿新 • • 發佈:2018-12-21
要做死局判定,我們要明確在什麼時候檢察地圖是否死局。
- 剛剛初始化地圖
- 每次消除之後
檢查死局前我們也要同步更新有向鄰接表字典和地圖陣列
我們約定,陣列值為-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; }
核心內容就這些,可能有點難以理解,大家下載原始碼能更容易理解點,希望這篇博文能給你帶來幫助,加油!