抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

枚举算法

image-20221025135058941

打印结果:

image-20221025135114001

递推算法

有一只大兔子,一个月生一只小兔子,过一个月小兔子变大兔子。以此求第几个月,有几个大兔子。

namespace AlgorithmTest
{
class Program
{
static void Main(string[] args)
{
//费波拉契数列,一个数等于前两个数之和。
//根据输入数,展示到这个数之前的所有数。
Console.WriteLine("请输入一个0~21之间的数");
int i = int.Parse(Console.ReadLine());
int[] array = new int[20];//定义有20个空的数组
array[0] = 1;
array[1] = 1;
if (i == 1)
{
Console.WriteLine(array[0]);
}
else if (i == 2)
{
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
}
else if (i >= 3 && i < 21)
{
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
for (int j = 3; j <= i; j++)
{
array[j - 1] = array[j - 2] + array[j - 3];
Console.WriteLine(array[j - 1]);
}
}
else
{
Console.WriteLine("数字超过范围");
}
Console.ReadKey();
}
}
}

打印结果:

最近打算恶补数据结构,在学校的时候对数据结构与算法一直是一知半解,懵懵懂懂的样子。特开此贴记录一下过程,希望能有所收获。打算看过c#基本的数据结构之后,各种类型算法题多刷刷。

算法与数据结构的关系

  • 数据结构可以认为是数据在程序中的存储结构,和基本数据操作
  • 算法可以认为是用来解决问题的方法,算法基于数据结构
  • 数据结构是问题的核心,是算法的基础

算法(Algorithm)的评价标准

在给任务轨迹Trail找安放位置的时候我发现:这个模型还有好多武器之类的cube,于是打算做个笔记,以后也许能用到。

另外有一个想法:吃到蓝色超级跳宝石时给角色换双鞋子,将这个超能力设定改为装备赋予,给鞋子加一个Trail短一点的轨迹,应该很酷。

这样的话就需要学一下换装了。干脆在开始页面来一个自定义装扮场景。

刚开始我设想是点击图标然后隐藏/显示角色身上对应的衣服,看了视频的开头才知道,可以给角色换骨骼和mesh,确实比直接开关gameobject合理得多,更省资源。国庆几天尝试一下。

C#中? 、?? 、?. 、??= 的用法和说明(转载)

一、可空类型修饰符< ? >

引用类型能用空引用来表示一个表示一个不存在的值,但是值类型不能。例如:

string str = null;
int i = null;//编译报错

ready动画结束后游戏开始,开始计时,直到死亡或者胜利再暂停计时。

新建ClearTime脚本用来更新时间文本,开始动画过后再计时

public class ClearTime : MonoBehaviour
{
[SerializeField] Text timeText;
[SerializeField] VoidEventChannel levelStartedEventChannel;//开始游戏
[SerializeField] VoidEventChannel levelClearedEventChannel;//玩家过关
[SerializeField] StringEventChannel cleardTimeTextEventChannel;//带string参数的频道
[SerializeField] VoidEventChannel playerDefeatedEventChannel;//玩家失败
float clearTime;//时间
bool stop = true;//计时停止

private void OnEnable()
{
//游戏开始
levelStartedEventChannel.AddListener(LevelStart);
//玩家通关
levelClearedEventChannel.AddListener(levelCleared);
//玩家失败
playerDefeatedEventChannel.AddListener(HideUI);
}
private void OnDisable()
{
//游戏开始
levelStartedEventChannel.RemoveListener(LevelStart);
//玩家通关
levelClearedEventChannel.RemoveListener(levelCleared);
//玩家失败
playerDefeatedEventChannel.RemoveListener(HideUI);
}
private void FixedUpdate()
{//当计时停止时 返回.
if (stop)
return;
clearTime += Time.fixedDeltaTime;
//将clearTime转化为秒,按格式输出
timeText.text = System.TimeSpan.FromSeconds(clearTime).ToString(@"mm\:ss\:ff");
}
void LevelStart()
{//开始游戏
stop = false;//开始计时
}
void levelCleared()
{//过关
HideUI();
cleardTimeTextEventChannel.Broadcast(timeText.text);
}
void HideUI()
{
stop = true;//计时停止
GetComponent<Canvas>().enabled = false;//关闭ui显示
}
}

过关时间显示在Victory Screen

说明:为角色胜利镜头做特殊定制

image-20221026021132507

follow属性用玩家对象

image-20221026021156345

过关功能实现

说明:过关时开启ui,切换状态为vitory,落地后再播放动画。

VictoryScreen中增加代码:订阅按钮功能,唤出鼠标指针。

using UnityEngine;
using UnityEngine.UI;
public class VictoryScreen : MonoBehaviour
{
[SerializeField] VoidEventChannel levelClearedEventChannel;//获取事件频道
[SerializeField] Button nextLevelButton;
private void OnEnable()
{
levelClearedEventChannel.AddListener(ShowUI);
nextLevelButton.onClick.AddListener(SceneLoader.LoadNextScene);//订阅下一关按钮功能
}
private void OnDisable()
{
levelClearedEventChannel.RemoveListener(ShowUI);
nextLevelButton.onClick.RemoveListener(SceneLoader.LoadNextScene);//订阅下一关按钮功能
}
private void ShowUI()
{
GetComponent<Canvas>().enabled = true;
GetComponent<Animator>().enabled = true;
Cursor.lockState = CursorLockMode.None;
}
}

说明:玩家碰到尖刺或者被黑球撞到就会死亡

功能实现

尖刺碰撞

首先选中所有尖刺,为他们添加脚本Spike

说明:开始游戏时播放ui动画,放完后摧毁红色闸门。游戏结束时(吃完红宝石),弹出用时、结束画面。

image-20220921170427534

image-20220921171040912

开始画面