Unity中做力扣算法题(Day5 数组跳跃游戏)

Posted Foulove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中做力扣算法题(Day5 数组跳跃游戏)相关的知识,希望对你有一定的参考价值。

基础tips之前博文有。

先看题目:

 

思路:

数组中的数,我们用方块代替,【2,3,1,1,4】就是第一个位置两个方块,第二个位置就是3个方块,以此类推。

题目中的“你”用球代替,也就是球在一个个方块上跳跃的游戏,但是什么时候游戏获胜,什么时候游戏失败呢?

上个问题的关键在于,当你落在0的时候,你永远不可能到达最后一位,也就是你永远不可能获胜,还原成Unity问题就是,当一个球落在没有方块的地面上的时候,游戏失败(返回false),那么我们抓住这点就可以开始做了,因为是只需要达到将算法过程变成更好理解的方式,也就是如果你不想在大脑中想象数组从第0位跳到第1位的过程.

那就打开这个游戏,"原力就会与你同在"(doge)

演示:

获胜:

 

 失败:

源码:

SphereJump类

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

public class SphereJump : MonoBehaviour

    [SerializeField]
    public Transform[] transforms;//记录九个位置的trs组,记得在Unity中赋值

   
    public int step;//输入的步数
    public GameObject Sphere;//球
    public GameObject Text_1;//最大步数文本
    public Button m_QueDingBtn;//确定按钮
    
    private int curSetp;//当前步数
    private int nums_1;//在数组中的位置

    //public bool ground;
    void Awake()
    
        CreateNums();
        curSetp = 0;
        nums_1 = 0;
        //ground = true;
    

    void Start()
    
        
        CaculateMaxStep(0);
        m_QueDingBtn.onClick.AddListener(CaculateStep);//处理确定按钮监听

    

    void Update()
    
        SuccessOrFail();
    

    #region 实现空格控制球体跳跃(需要的可以自己取消注释)
    //public void FixedUpdate()
    //
    //    if (Input.GetKeyDown(KeyCode.Space))
    //    
    //        if (ground == true)
    //        
    //            transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")));
    //            GetComponent<Rigidbody>().velocity += new Vector3(0, 10, 0);
    //            GetComponent<Rigidbody>().AddForce(new Vector3(0, 800, 0));
    //            ground = false;
    //        

    //        DestroyShpere();
    //    
    //

    //void DestroyShpere()
    //
    //    y = Sphere.transform.position.y;
    //    if (y >= 10)
    //    
    //        Destroy(Sphere);
    //    
    //
    #endregion

    /// <summary>
    /// 创建随机数组
    /// </summary>
    public void CreateNums()
    
        
        for (int i = 0; i < NumsManager.nums.Length; i++)
        
            NumsManager.num = UnityEngine.Random.Range(0, 9);//随机数
            NumsManager.numsList.Add(NumsManager.num);//列表存储随机数          
        ;
    
    /// <summary>
    /// 计算步数并实现
    /// </summary>
    public void CaculateStep()
    
        var m_Step = GameObject.Find("InputField").gameObject.transform.GetComponentInChildren<InputField>().text;//获取输入的步数
        step = Convert.ToInt32(m_Step);
        var m_MaxStep = GameObject.Find("01").gameObject.transform.GetComponentInChildren<Text>().text;
        int nums_1 = Convert.ToInt32(m_MaxStep);
        if (step<= nums_1)
        
            gameObject.transform.position = transforms[curSetp + step].position;
            curSetp = curSetp + step;
        
        else
        
            return;
        
        //Text_1.GetComponent<Text>().text = "0";
        CaculateMaxStep(step);
    
    /// <summary>
    /// 计算最大步数
    /// </summary>
    /// <param name="offset"></param>
    public void CaculateMaxStep(int offset)
              
        var text = NumsManager.numsList[nums_1+offset].ToString();//最大步数等于数组位置的数加上偏移量
        nums_1 = nums_1 + offset;//实时更新在数组中的位置
        Text_1.GetComponent<Text>().text = text;


    
    /// <summary>
    /// 判断成功还是失败
    /// </summary>
    public void SuccessOrFail()
    
        float trsY = Sphere.transform.position.y;
        var m_materials = Sphere.GetComponent<MeshRenderer>();//获得当前球的材质
        //如果球的Y值等于0.5就相当于落到地面
        if (trsY == 0.5f)
        
            m_materials.material = (Material)Resources.Load("02");//球变红,游戏获胜
        
        //如果球的位置等于trs数组第8位就变黄
        if (Sphere.transform.position == transforms[8].position)
        
            m_materials.material = (Material)Resources.Load("03");//球变黄,游戏失败
        
    


NumsManager静态类:

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

public static class NumsManager 

    public static int value01;
    public static int value02;
    //九个位置
    public static Vector3 trs01 = new Vector3(94.5f, 12.0f, 10);
    public static Vector3 trs02 = new Vector3(95.5f, 12.0f, 10);
    public static Vector3 trs03 = new Vector3(96.5f, 12.0f, 10);
    public static Vector3 trs04 = new Vector3(97.5f, 12.0f, 10);
    public static Vector3 trs05 = new Vector3(98.5f, 12.0f, 10);
    public static Vector3 trs06 = new Vector3(99.5f, 12.0f, 10);
    public static Vector3 trs07 = new Vector3(100.5f, 12.0f, 10);
    public static Vector3 trs08 = new Vector3(101.5f, 12.0f, 10);
    public static Vector3 trs09 = new Vector3(102.5f, 12.0f, 10);
    public static int[] nums = new int[10];
    public static int num;
    public static List<int> numsList = new List<int>();
    
    

    

NumsJump类

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


public class NumsJump : MonoBehaviour

    public GameObject Cube;

    public int a;
    public float m_trsY;

    private Vector3 m_trs;
    
    void Awake()
    
        m_trs = gameObject.transform.position;
    
    void Start()
    
        //根据gameobject的名字拿数组的值
        string name = gameObject.name;
        switch (name)
        
            case "0":
                GetNumsValue(0);
                break;
            case "1":
                GetNumsValue(1);
                break;
            case "2":
                GetNumsValue(2);
                break;
            case "3":
                GetNumsValue(3);
                break;
            case "4":
                GetNumsValue(4);
                break;
            case "5":
                GetNumsValue(5);
                break;
            case "6":
                GetNumsValue(6);
                break;
            case "7":
                GetNumsValue(7);
                break;
            case "8":
                GetNumsValue(8);
                break;
            case "9":
                GetNumsValue(9);
                break;


        
        NewSphere(NumsManager.value02);
        a = NumsManager.value02;
    


    
    /// <summary>
    /// 实例化方块
    /// </summary>
    /// <param name="index"></param>
    void NewSphere(int index)
    
        for (int i = 0; i < index; i++)
            
            GameObject.Instantiate(Cube, m_trs, Quaternion.identity);           
            m_trs.y += 2;
        
    
    /// <summary>
    /// 拿到数组的值
    /// </summary>
    /// <param name="index"></param>
    void GetNumsValue(int index)
    
        NumsManager.value02 = NumsManager.numsList[index];
    



项目部分截图:

具体实现逻辑,代码中的注释打的很详细了,项目完整资源已经上传,目前还在审核中,不想努力的同学可以直接下载哈,具体有什么问题可在下方评论区留言,博主空闲时间一般在周末,回复的缓慢还望见谅。

 

以上是关于Unity中做力扣算法题(Day5 数组跳跃游戏)的主要内容,如果未能解决你的问题,请参考以下文章

力扣hot100 55题跳跃游戏打卡

力扣Leetcode 45. 跳跃游戏 II - 贪心思想

力扣Leetcode 55. 跳跃游戏

微软算法面试高频题跳跃游戏

#yyds干货盘点# leetcode算法题:跳跃游戏

力扣 | 55. 跳跃游戏