连连看核心代码

using UnityEngine;
public class Point
{
    public int x;
    public int y;
    public int v;

    public override string ToString()
    {
        return string.Format("拐点坐标>>({0},{1})拐点坐标值>>{2};", x, y, v);
    }
}
public class LL : MonoBehaviour
{
    /// <summary>
    /// 0代表可走路径
    /// </summary>
    public int[,] graph = new int[4, 4]
    {
        { 1, 2, 0 ,1},
        { 1, 0, 0 ,1},
        { 2, 1, 2 ,1},
        { 2, 1, 2 ,1}
    };
    private int colNumber;
    private int rowNubmer;

    private void Awake()
    {
        rowNubmer = 4;//行数
        colNumber = 4;//列数
    }
    private void Start()
    {
        //直连

        if (NoCornor(GetP(1, 0), GetP(1, 3)))
        {
            print("直连");
        }
        //一拐
        Point p;
        if (OneCornor(GetP(0, 1), GetP(2, 2), out p))
        {
            print("一拐");
            print(p.ToString());
        }
        //两拐
        Point p1, p2;
        if (TwoCornor(GetP(1, 0), GetP(0, 3), out p1, out p2))
        {
            print("两拐");
            print(p1.ToString() + "\n" + p2.ToString());
        }

    }
    /// <summary>
    /// 判断直连的情况
    /// </summary>
    /// <param name="p1">输入点1</param>
    /// <param name="p2">输入点2</param>
    /// <returns>是否走通</returns>
    public bool NoCornor(Point p1, Point p2)
    {
        if (!p1.v.Equals(p2.v))
        {
            return false;
        }

        return NoCornorReal(p1, p2);
    }
    /// <summary>
    /// 判断直连的情况具体实现
    /// </summary>
    /// <param name="p1">输入点1</param>
    /// <param name="p2">输入点2</param>
    /// <returns>是否走通</returns>
    private bool NoCornorReal(Point p1, Point p2)
    {
        if (!p1.x.Equals(p2.x) && !p1.y.Equals(p2.y))
        {
            return false;
        }
        if (p1.x.Equals(p2.x))
        {
            int minindex = Mathf.Min(p1.y, p2.y);
            int maxindex = Mathf.Max(p1.y, p2.y);
            for (int i = minindex + 1; i < maxindex; i++)
            {
                if (graph[p1.x, i] != 0)
                {
                    return false;
                }
            }
        }

        if (p1.y.Equals(p2.y))
        {
            int minindex = Mathf.Min(p1.x, p2.x);
            int maxindex = Mathf.Max(p1.x, p2.x);
            for (int i = minindex + 1; i < maxindex; i++)
            {
                if (graph[i, p1.y] != 0)
                {
                    return false;
                }
            }
        }


        return true;
    }
    /// <summary>
    /// 判断一个拐点的情况
    /// </summary>
    /// <param name="p1">输入点1</param>
    /// <param name="p2">输入点2</param>
    /// <param name="onePoint">返回拐点</param>
    /// <returns>是否走通</returns>
    public bool OneCornor(Point p1, Point p2, out Point onePoint)
    {
        if (!p1.v.Equals(p2.v))
        {
            onePoint = null;
            return false;
        }

        return OneCornorReal(p1, p2, out onePoint);
    }
    /// <summary>
    /// 判断一个拐点的情况具体实现
    /// </summary>
    /// <param name="p1">输入点1</param>
    /// <param name="p2">输入点2</param>
    /// <param name="onePoint">返回拐点</param>
    /// <returns>是否走通</returns>
    private bool OneCornorReal(Point p1, Point p2, out Point onePoint)
    {
        Point cornor1 = GetP(p1.x, p2.y);
        Point cornor2 = GetP(p2.x, p1.y);

        if (cornor1.v == 0 && NoCornorReal(cornor1, p1) && NoCornorReal(cornor1, p2))
        {
            onePoint = cornor1;
            return true;
        }
        if (cornor2.v == 0 && NoCornorReal(cornor2, p1) && NoCornorReal(cornor2, p2))
        {
            onePoint = cornor2;
            return true;
        }
        onePoint = null;
        return false;
    }
    /// <summary>
    /// 判断两个拐点情况
    /// </summary>
    /// <param name="p1">输入点1</param>
    /// <param name="p2">输入点2</param>
    /// <param name="op1">返回第一个拐点</param>
    /// <param name="op2">返回第二个拐点</param>
    /// <returns>是否走通</returns>
    public bool TwoCornor(Point p1, Point p2, out Point op1, out Point op2)
    {
        for (int i = 0; i < colNumber; i++)
        {
            Point po1 = GetP(p1.x, i);
            Point c1;
            if (po1.v == 0 && NoCornorReal(po1, p1) && OneCornorReal(po1, p2, out c1))
            {
                op1 = po1;
                op2 = c1;
                return true;
            }
        }
        for (int i = 0; i < rowNubmer; i++)
        {
            Point po2 = GetP(i, p1.y);
            Point c2;
            if (po2.v == 0 && NoCornorReal(po2, p1) && OneCornorReal(po2, p2, out c2))
            {
                op1 = po2;
                op2 = c2;
                return true;
            }
        }
        op1 = null;
        op2 = null;
        return false;
    }
    /// <summary>
    /// 通过索引的到point对象
    /// </summary>
    /// <param name="i"></param>
    /// <param name="j"></param>
    /// <returns>point对象</returns>
    public Point GetP(int i, int j)
    {
        Point p = new Point();
        p.x = i;
        p.y = j;
        p.v = graph[i, j];
        return p;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值