有限状态机
一、状态模式状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理。
状态模式的类图
二、引例在游戏开发中,经常会遇到一下场景,按下方向键时人物左右移动,按下空格键人物跳跃,一般可以用简单的if-else语句实现
123456789 velocity.x = Input.GetAxis("Horizontal") * speed;if (Input.GetKey(right)) { transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0)); } else if (Input.GetKey(left)) ...
Unity协程
本文参考:
https://blog.csdn.net/huang9012/article/details/38492937
https://blog.csdn.net/weixin_44079314/article/details/84997940
协程是什么协程不是进程,也不是线程,它就是一个函数,一个特殊的函数——可以在某个地方挂起,并且可以重新在挂起处继续运行。
协程方法与普通方法的区别:
被调用时:普通方法被调用时,原来执行的部分保留现场,停止执行,然后去执行要调用的方法,并且,被调用的方法执行完之后才能返回到调用前的状态接着往下执行。协同方法的执行是不用等协同方法执行完再执行调用之前原来方法的代码。 而是两者异步执行。
协程的使用Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器。在Unity中只要继承MonoBehaviour就可以使用协程
123456IEnumerator DelayCoroutine() { // work before delay yield return new ...
剑指58-67
58 对称二叉树题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
示例1
输入:
1{8,6,6,5,7,7,5}
返回值:
1true
示例2
输入:
1{8,6,9,5,7,7,5}
返回值:
1false
思路:
判断左子树和右子树是否对称,相当对判断左子树的左孩子和右子树的右孩子是否相等,左子树的右孩子和右子树的左孩子是否相等。
采用队列存取每个结点
12345678910111213141516171819202122232425262728293031323334353637/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solutio ...
事件数据-EventData
BaseEventData:基础事件数据——事件数据的基类,和EventSystem配合使用
PointerEventData:指针事件数据——鼠标与触摸事件的相关数据(点击、抬起、拖动等),UGUI中大部分事件数据类型都是PointerEventData类型
button:该属性有3个取值。分别是Left(鼠标左键)、Right(鼠标右键)、Middle(鼠标中键)
clickCount:连续点击的次数
clickTime:发送点击事件的时间
delta:当前帧与上一帧的位置差值
dragging:是否为拖拽状态
position:指针当前位置
pressPosition:指针按下时的位置
scrollDelta:当前帧与上一帧的滚动量差值
useDragThreshold:是否使用拖动阈值(DragThreshold)
worldNormal:射线检测到的第一个物体的法线
worldPosition:射线检测到的第一个物体的世界坐标
lastPress:最后按下的游戏物体
pointerDrag:拖拽的游戏物体
pointerEnter:指针进入的游戏物体
pointerPr ...
UnityEvent和事件系统
本文参考:
https://blog.csdn.net/qq_28849871/article/details/78366236
https://blog.csdn.net/soul900524/article/details/79173354
UnityEvent和C# EventUnityEvent是基于Unity引擎对C# Event特性进行了一些更适合开发游戏的改变。了解Event特性要从Delegate(委托)说起
Delegate(委托)C#中提供了一种可以存放方法的容器,也就是委托。一般来说,变量是程序在内存中为数据开辟的一块空间,变量可以存放某一具体数值,或某个对象的引用。C#则让Delegate可以存放函数。
使用Delegate一般分为三步:
定义一种委托类型
声明一个该类型的委托变量
通过声明的委托调用函数执行相关操作
下面是在Unity中使用Delegate的一个实例
12345678910111213141516171819202122232425262728293031using System.Collections;using System.C ...
剑指53-57
53 表示数值的字符串题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
示例1
输入:
1"123.45e+6"
返回值:
1true
示例1
输入:
1"1.2.3"
返回值:
1false
思路:
设置3个标志位检查数字,小数点和e是否出现当前字符是数字,isNum=true当前字符是小数点,那么只有小数点第一次出现且小数点前面没有e的时候isPoint=true。当前字符是e,只有前面出现过数字时e才能标为true,然后isNum要置为false,防止123e这种输入出现‘+’和‘-’只能在字符串首为和e后面出现去掉字符串前后的空格其他情况均为非法
123456789101112131415161718192021222324252627class Solution {public: bool isNume ...
五子棋AI
需要用到的知识博弈树极大极小值搜索算法评估函数Alpha-Beta剪枝算法
博弈树博弈树是指由于动态博弈参与者的行动有先后次序,因此可以依次将参与者的行动展开成一个树状图形,顾名思义,博弈树就对博弈双方以相同的次数轮流进行决策行为的图形描述。对于任何一种博弈竞赛,我们都可以将其构建成一颗博弈树,其节点对应某一种局面,其分支表示进行一步决策,博弈树的根表示开始位置,叶子节点表示博弈到此结束。
极大极小值搜索算法我们需要对博弈树进行深度搜索,对此采用极大极小值搜索算法。
假设在博弈树中,从根节点为0开始,奇数层表示电脑可能的走法,偶数层表示玩家可能的走法。我们规定对电脑越有利,分数越大,对玩家越有利,分数越小,分数的起点是0。
电脑走棋的层我们称为 MAX层,这一层电脑要保证自己利益最大化,那么就需要选分最高的节点。
玩家走棋的层我们称为MIN层,这一层玩家要保证自己的利益最大化,那么就会选分最低的节点。
此图中甲是电脑,乙是玩家,那么在甲层的时候,总是选其中值最大的节点,乙层的时候,总是选其中最小的节点。
也就是说在电脑落子前会遍历所有可走的位置,模拟玩家落子,预判多步以后的局 ...
剑指47-52
47 求1+2+3…+n题目描述
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例1
输入:
15
返回值:
115
思路:
题目限制不能使用乘除法和条件判断语句,所以只能使用递归来计算
1234567class Solution {public: int Sum_Solution(int n) { if(n==1)return n; return n+Sum_Solution(n-1); }};
48 不用加减乘除做加法题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
示例1
输入:
11,2
返回值:
13
思路:
不能用四则运算符号,所以要使用位运算。
两个整数&运算,等于1的位需要向前进一位,两个整数^运算,等于1的是不需要进位的位
把进位后的数和不需要进位的数再次&运算,循环执行直到没有需要进位的位
1234567891011clas ...
剑指42-46
42 和为S的两个数字题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
示例1
输入:
1[1,2,4,7,11,15],15
返回值:
1[4,11]
思路:
由于数组是增序排列,设置l,r两个指针,指向数组的起点和末尾位置,若这两个数的和小于S,左指针右移,若两数和大于S,右指针左移。
12345678910111213141516171819class Solution {public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { int l=0,r=array.size()-1; vector<int> res; while(l<r){ if(array[l]+array[r]>sum)r--; else if(array[l]+array ...
剑指36-41
36 两个链表的第一个公共节点题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:
先求出两个链表的长度,让较长的链表先走两链表长度差的距离,然后两个链表同时走,直到遇到公共节点。
123456789101112131415161718192021222324252627282930class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(!pHead1||!pHead2)return nullptr; int len1=0,len2=0; ListNode* h1=pHead1,*h2=pHead2; while(h1->next||h2->next){ if(h1->next){ h ...