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 数组跳跃游戏)的主要内容,如果未能解决你的问题,请参考以下文章