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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在五花八门的游戏分类中,益智游戏是不可或缺的一大板块;而在益智游戏这个分类中,除合成类游戏又是当之无愧的No.1。从考古级别的《俄罗斯方块》到现在风靡全国的《开心》,除合成类游戏经久不衰,并且不断地涌现出新的经典作品,带给我们新的启发和趣。作为Unity3D的初级开发者,从头到尾独立完成一款简单的2D棋盘除合成小游戏是你初级实战的最好选择。既能全面而详细的检验你的基础框架能力、C#编程能力、UGUI适配技巧,又可以在此基础上,较为深入的学习协程方法、DoTween插件和除合成类的核心算法,一举数得。一言以蔽之,除合成类游戏不难,但要写好却并不容易。它琐碎的功能逻辑、层出不穷的延时操作以及复杂的状态控制很容易让人顾此失彼,手忙脚乱,最后的结果往往是,费劲九牛二虎之力把功能实现好了,但代码已经乱成一团糟,定位Bug难、扩展新功能难,甚至自己读起来也难。本课程的最大目的,就是帮初级开发者梳理逻辑,写出规范而有条理的代码,避免陷入以上尴尬境地。条理捋清楚了,你就会觉得一切似乎变得简单了,很多地方都会顺理成章。本课程没有什么高深的编程技巧,更没有炫酷的视觉效果,只是一步一步教你如何踏踏实实、稳稳当当的完成一款《简单》。因此,资深大牛你就别进了,想学高深知识的你就别点了,自认为除小case、分分钟搞定的高手你也趁早走人。在这门课程里,你能够学到的,只有以下几点:1、如何使用UGUI搭建棋盘游戏的基础阵列;2、如何快速的实现通用的三逻辑;3、如何使用Dotween插件实现物体的位移、缩放、旋转动画;4、如何熟练的使用协程方法完成延时操作逻辑;5、数组、集合、引用类型、Prefab等基础知识的巩固;6、如何写出规范而有条理的代码;7、益智小游戏的通用模板。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值