版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
核心内容就这些,可能有点难以理解,大家下载源码能更容易理解点,希望这篇博文能给你带来帮助,加油!