Unity3D 消消乐 三消乐回朔递归算法实现

Unity3D 消消乐 三消乐回朔递归算法实现

无意中看见很久以前的代码, 在这记录一下 ,新建一个空场景,把脚本挂摄像机上运行就行了,思路是四个方向去递归, 具体都写代码里,末尾有下载链接,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class C624llk : MonoBehaviour
{

    GameObject goal; //意义不大
    HashSet<GameObject> arr = new HashSet<GameObject>(); //需要删除的集合
    public string text; //无意义变量
    int sum = 0;  //无意义变量
    int Dsum = 0; //无意义变量
    GameObject[,] cube; 
    GameObject f; //意义不大

    void Start()
    {
        UnityEditorInternal.InternalEditorUtility.AddTag("NPC");  //***只能在unity编译器使用的类,不能打包出去
                                                                  

        AddCube();

    }
    /// <summary>
    /// 游戏准备
    /// </summary>
    void AddCube()
    {
    
            Camera.main.transform.position = new Vector3(0, 4, -35);
        Camera.main.transform.localEulerAngles = Vector3.zero;
   

        GameObject diban = GameObject.CreatePrimitive(PrimitiveType.Plane);
        diban.name = "地板";
        diban.transform.position = new Vector3(0, -2, 0);
        diban.transform.localScale= new Vector3(20, 20,20);

        f = new GameObject();
        f.name = "游戏画板";

        cube = new GameObject[10, 21];
        for (int i = 1; i <= 10; i++)
        {
            for (int j = -10; j <= 10; j++)
            {



                GameObject b = GameObject.CreatePrimitive(PrimitiveType.Cube);
                b.transform.position = new Vector3(j, i, -20);

                b.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
                b.transform.tag = "NPC";
                b.name = i + "," + j + "";
                b.transform.parent = f.transform;
                int k = Random.Range(1, 6);
                switch (k)
                {
                    case 1: b.GetComponent<MeshRenderer>().material.color = Color.blue; break;
                    case 2: b.GetComponent<MeshRenderer>().material.color = Color.white; break;
                    case 3: b.GetComponent<MeshRenderer>().material.color = Color.red; break;
                    case 4: b.GetComponent<MeshRenderer>().material.color = Color.yellow; break;
                    case 5: b.GetComponent<MeshRenderer>().material.color = Color.grey; break;
                }
                //b.AddComponent<Rigidbody>();
                //b.GetComponent<Rigidbody>().constraints = ~RigidbodyConstraints.FreezePositionY;
                // b.GetComponent<Rigidbody>().constraints = ~RigidbodyConstraints.FreezeRotation;


                // b.GetComponent<Rigidbody>().useGravity = false;

                cube[i - 1, j + 10] = b;
            }
        }
    }

    // Update is called once per frame
    void Update()
    {

        sum += arr.Count;
        if (sum >= Dsum)
        {
            Dsum = sum;
        }

        Endpd();

        
       
        text = "计分 " + sum;
        arr.Clear();
        if (Input.GetMouseButtonDown(0))
        {
            goal = MouseObject();
            if (goal != null)
            {
                Des(goal);
                print(arr.Count + "***");
                foreach (var item in arr)
                {

                    Decline(item);
                    DestroyImmediate(item);
                }
            }



        }
    }
    /// <summary>
    /// 鼠标点击发射线返回对象
    /// </summary>
    /// <returns></returns>
    GameObject MouseObject()
    {
        Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit a;
        if (Physics.Raycast(r, out a) && a.collider.gameObject.tag == "NPC")
        {
            return a.collider.gameObject;
        }


        return null;
    }
    /// <summary>
    /// 四向递归,找到就存起来
    /// </summary>
    /// <param name="s"></param>
    void Des(GameObject s)
    {
        Ray r = new Ray(s.transform.position, Vector3.up);
        Ray r2 = new Ray(s.transform.position, Vector3.down);
        Ray r3 = new Ray(s.transform.position, Vector3.left);
        Ray r4 = new Ray(s.transform.position, Vector3.right);

        RaycastHit temp;

        if (Physics.Raycast(r, out temp, 1f) && s.GetComponent<MeshRenderer>().material.color == temp.collider.GetComponent<MeshRenderer>().material.color
         && !arr.Contains(temp.collider.gameObject))
        {

            arr.Add(s);
            arr.Add(temp.collider.gameObject);
            Des(temp.collider.gameObject);

        }
        if (Physics.Raycast(r2, out temp, 1f) && s.GetComponent<MeshRenderer>().material.color == temp.collider.GetComponent<MeshRenderer>().material.color
         && !arr.Contains(temp.collider.gameObject))
        {
            arr.Add(s);
            arr.Add(temp.collider.gameObject);
            Des(temp.collider.gameObject);
        }
        if (Physics.Raycast(r3, out temp, 1f) && s.GetComponent<MeshRenderer>().material.color == temp.collider.GetComponent<MeshRenderer>().material.color
        && !arr.Contains(temp.collider.gameObject))
        {
            arr.Add(s);
            arr.Add(temp.collider.gameObject);
            Des(temp.collider.gameObject);
        }
        if (Physics.Raycast(r4, out temp, 1f) && s.GetComponent<MeshRenderer>().material.color == temp.collider.GetComponent<MeshRenderer>().material.color
        && !arr.Contains(temp.collider.gameObject))
        {
            arr.Add(s);
            arr.Add(temp.collider.gameObject);
            Des(temp.collider.gameObject);
        }
        else
        {
            //没有找到
        }

    }//回朔消除算法
    /// <summary>
    /// 计算需不需要移动
    /// </summary>
    /// <param name="s"></param>
    void Decline(GameObject s)
    {
        Ray down = new Ray(s.transform.position, Vector3.down);
        Ray up = new Ray(s.transform.position, Vector3.up);
        RaycastHit [] up_;
        RaycastHit[] down_;

        up_ = Physics.RaycastAll(up, 20);
        down_ = Physics.RaycastAll(down, 20);
        //print(s.name + "*-*");
        if (up_.Length == 0&& down_.Length == 1)
        {
            Zouyidong(s);
            return;
        }
        if (up_.Length == 0)
        {
            return;
        }
        else
        {
            for (int i = 0; i < up_.Length; i++)
            {
                up_[i].collider.gameObject.transform.position += Vector3.down;//整列向下移动

            }
        }
    }
    /// <summary>
    /// 整列向左移动
    /// </summary>
    /// <param name="s"></param>
    void Zouyidong(GameObject s)
    {
                                    
        for (int i = 1; i <=10; i++)
        {
            Vector3 t = new Vector3(s.transform.position.x, i, s.transform.position.z);
             Ray r = new Ray(t, Vector3.right);
             RaycastHit[] temp;
             temp = Physics.RaycastAll(r,30);


            for (int j = 0; j < temp.Length; j++)
            {
                temp[j].collider.gameObject.transform.position += Vector3.left;
            }
        }


    }
    /// <summary>
    /// 结束判断
    /// </summary>
    void Endpd()
    {
        

        for (int i = 0; i < cube.GetLength(0); i++)
        {
            for (int j = 0; j<cube.GetLength(1); j++)
            {
               // print(cube[i, j].name);
                if (cube[i, j] == null)
                {
                    continue;
                }
                Ray r = new Ray(cube[i, j].transform.position, Vector3.right);//向右发出射线
                RaycastHit cube2;
                if (Physics.Raycast(r,out cube2,1f)&& cube[i, j].GetComponent<MeshRenderer>().material.color == cube2.collider.GetComponent<MeshRenderer>().material.color)
                {
                    return; //如果找到相邻的并且颜色相同,跳出此方法
                }
                r.direction = Vector3.up; //向上发出射线
                if (Physics.Raycast(r, out cube2, 1f) && cube[i, j].GetComponent<MeshRenderer>().material.color == cube2.collider.GetComponent<MeshRenderer>().material.color)
                {
                    return;
                }
            }

        }
     
        
            print("游戏结束");

            bool a=  UnityEditor.EditorUtility.DisplayDialog("游戏结束,本次得分:"+sum+"历史最高分:"+Dsum, "是否重新开始", "继续", "取消"); //***只能在unity编译器使用的类,不能打包出去
        if (a)
            {
                sum = 0;
                arr.Clear();
                DestroyImmediate(f);
                Start();
            }
            else
            {
                print("关闭游戏");
            }
        

    }
 
}


第一次在这写博客, 好紧张 !
//download.csdn.net/download/xiehailiang_/12251536

发布了1 篇原创文章 · 获赞 1 · 访问量 28

猜你喜欢

转载自blog.csdn.net/xiehailiang_/article/details/104897308