连连看算法 Unity版

标签: 连连看
82人阅读 评论(0) 收藏 举报
分类:
连连看算法 Unity环境


[System.Serializable]
public class Point
{
    int x, y;
    bool flag;
    public Point(int _x, int _y)
    {
        x = _x;
        y = _y;
        flag = true;
    }

    public int X
    {
        get
        {
            return x;
        }
    }

    public int Y
    {
        get
        {
            return y;
        }
    }

    /// <summary>
    /// 判断这个点可不可以走
    /// </summary>
    /// <returns></returns>
    public bool IsMove()
    {
        return flag;
    }



    public void SetStatus(bool bol)
    {
        flag = bol;
    }
    public override string ToString()
    {
        return string.Format("x: {0},y:{1} flag:{2}", x, y, flag);
    }
}



public class CardSearch
{
    //0拐角查找
    /// <summary>
    /// 单线查找
    /// </summary>
    /// <param name="sourceArray">查找的数组</param>
    /// <param name="startPoint"> 开始点 </param>
    /// <param name="endPoint"> 结束点 </param>
    /// <returns></returns>
    public static bool SingeSearch(Point[,] sourceArray, Point startPoint, Point endPoint)
    {
        if (startPoint.X != endPoint.X && startPoint.Y != endPoint.Y)
        {
            return false;
        }

        int i;
        //水平
        if (startPoint.X != endPoint.X)
        {
            int min = startPoint.X < endPoint.X ? startPoint.X : endPoint.X;

            int max = startPoint.X > endPoint.X ? startPoint.X : endPoint.X;


            for (i = min + 1; i < max; i++)
            {
                if (!sourceArray[i, startPoint.Y].IsMove())
                {
                    return false;
                }
            }
            return true;
        }

        //竖直

        if (startPoint.Y != endPoint.Y)
        {
            //求Y轴的最小值
            int min = startPoint.Y > endPoint.Y ? endPoint.Y : startPoint.Y;
            //求Y轴的最大值
            int max = startPoint.Y < endPoint.Y ? endPoint.Y : startPoint.Y;

            for (i = min + 1; i < max; i++)
            {
                if (!sourceArray[startPoint.X, i].IsMove())
                {
                    return false;
                }
            }
            return true;
        }

        return false;


    }


    //1拐角查找
    /// <summary>
    /// 双线查找
    /// </summary>
    /// <param name="sourceArray">查找的数组</param>
    /// <param name="startPoint"> 开始点 </param>
    /// <param name="endPoint"> 结束点 </param>
    /// <returns></returns>
    public static Point DoubleSearch(Point[,] sourceArray, Point startPoint, Point endPoint)
    {

        if (startPoint.X == endPoint.X || startPoint.Y == endPoint.Y)
        {
            return null;
        }

        Point pt = sourceArray[startPoint.X, endPoint.Y];
        //开始点在左面的时候
        //这个点能走
        if (pt.IsMove())
        {
            //如果开始点能走到拐角点
            if (SingeSearch(sourceArray, startPoint, pt))
            {
                if (SingeSearch(sourceArray, pt, endPoint))
                {
                    return pt;
                }
            }
        }

        //测试拐角点二
        pt = sourceArray[endPoint.X, startPoint.Y];

        if (pt.IsMove())
        {
            //如果开始点能走到拐角点
            if (SingeSearch(sourceArray, startPoint, pt))
            {
                //如果拐角点能走到结束点
                if (SingeSearch(sourceArray, pt, endPoint))
                {
                    return pt;
                }
            }
        }
        return null;

    }


    public static List<Point> MulSearch(Point[,] sourceArray, Point startPoint, Point endPoint)
    {
        if (sourceArray == null || sourceArray.Length == 0)
        {
            Debug.LogError("原数组为空");
            return null;
        }

        if (startPoint.X == endPoint.X && endPoint.Y == startPoint.Y)
        {
            //开始点和结束点相同
            Debug.Log("开始点和结束点相同");
            return null;
        }


        //判断开始点和结束点是否符合越界
        if (startPoint.X < 0 || startPoint.Y >= sourceArray.Length || endPoint.X < 0 || startPoint.Y >= sourceArray.Length)
        {

            Debug.Log("数组越界" + sourceArray.GetLength(0) + "    ");
            return null;
        }
        int i;
        List<Point> path = new List<Point>();

        path.Add(startPoint);

        //在结束点的x轴(水平方向)查找一个点 //Y轴相同
        for (i = 0; i < sourceArray.GetLength(0); i++)
        {
            //获取到水平方向上的点
            Point point = sourceArray[i, endPoint.Y];
            Debug.Log("取到的临时拐角点:" + point);
            //如果这个点不是结束点
            if (point.X != endPoint.X)
            {
                //如果这个点可以走
                if (point.IsMove())
                {
                    //然后以这个点为开始点,单线查找 到结束点
                    if (SingeSearch(sourceArray, point, endPoint))
                    {
                        //如果单线查找成功  判断双线查找
                        Point singlePoint = DoubleSearch(sourceArray, startPoint, point);
                        if (singlePoint != null)
                        {
                            //如果双线查找成功,查找路径成功 将路径列表返回
                            path.Add(singlePoint);
                            path.Add(point);
                            path.Add(endPoint);

                            return path;
                        }

                    }
                }
            }
        }


        //判断竖直轴
        //在结束点的Y轴(竖直方向)查找一个点 //X轴相同
        for (i = 0; i < sourceArray.GetLength(1); i++)
        {
            //在竖直方向上取一个点
            Point point = sourceArray[endPoint.X, i];
            //如果点不是结束点
            if (point.Y != endPoint.Y)
            {
                //如果这个点能走
                if (point.IsMove())
                {
                    //如果单线查找成功
                    if (SingeSearch(sourceArray, point, endPoint))
                    {
                        //从开始点查找到这个点 
                        Point singlePoint = DoubleSearch(sourceArray, startPoint, point);
                        //查找成功
                        if (singlePoint != null)
                        {
                            path.Add(singlePoint);
                            path.Add(point);
                            path.Add(endPoint);
                            return path;
                        }
                    }
                }
            }
        }



        return null;
    }
}


查看评论

大学生中走出的“不就业族”

大学生中走出的“不就业族”  大学生中不急于就业者增多  在绝大多数大学毕业生为找到一份合适的工作而奔波苦恼时,上海高校的毕业生就业市场上却出现了奇怪的一幕:一些毕业生对就业说“不”。  据了解,这些...
  • stanely
  • stanely
  • 2001-06-04 16:56:00
  • 1406

unity连连看

  • 2014年12月11日 12:20
  • 7.29MB
  • 下载

Unity3D脚本:Unity制作连连看脚本

Unity3D教程:Unity制作连连看教程 GameManager.cs  游戏的核心代码,产生图片,判断是否可以销毁等。 [color=#008ef1][font=宋体]using Uni...
  • yang7474020
  • yang7474020
  • 2013-02-01 09:50:20
  • 958

连连看Unity源代码

  • 2015年03月31日 12:37
  • 13.25MB
  • 下载

unity教程之制作连连看小教程

哈哈,周末了总算有时间完善一下做的连连看了,顺便写个小教程分享给大家,哇哈哈~ 文章出处【狗刨学习网】 开始正题: 连连看的规则大家应该都知道,选中的两个图片相同,并且不...
  • Carl180
  • Carl180
  • 2015-01-27 20:28:00
  • 1090

unity制作连连看小教程

连连看的规则大家应该都知道,选中的两个图片相同,并且不能多于两个拐点能连在一块,这两个图片就可以消掉; 连通的类型: 1 直线型; 2 一个拐点; 3 两个拐点; 下面开...
  • kepoon
  • kepoon
  • 2013-04-26 08:59:26
  • 4772

unity连连看小程序

  • 2018年03月01日 11:51
  • 605KB
  • 下载

连连看--详解及实现

虽然使用C#写的,但是其设计思路及核心的消除算法可借鉴并由其他语言轻松实现。解释也尽量详细,希望能帮到大家。 代码中解释也十分详细,嫌文章太长可直接看代码。...
  • likaixin28
  • likaixin28
  • 2016-08-22 12:05:35
  • 2206

自己做的一个可以更换图片的连连看游戏(源码)

  • 2012年05月16日 21:51
  • 4.21MB
  • 下载

连连看算法 Unity版

连连看算法 Unity环境 [System.Serializable] public class Point { int x, y; bool flag; public P...
  • qq_38257182
  • qq_38257182
  • 2018-04-15 11:45:02
  • 82
    个人资料
    等级:
    访问量: 902
    积分: 78
    排名: 155万+
    文章存档