Assignment 3
Assignment 3
简答题
- 游戏对象运动的本质是什么?
利用矩阵的变换,如平移、旋转、缩放等,来改变游戏对象的控件属性。具体而言,是Transform中的position和rotation两个属性,通过修改它们的值属性,进而改变其绝对坐标和旋转方向。
- 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)
方法一:直接改变transform中x和y的位置。
根据物理学中的抛体运动的原理,水平方向速度不变,竖直方向速度加上加速度G,两个方向运动的合成即为抛物线,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move: MonoBehaviour
{// Start is called before the first frame updatepublic float g = 10;public float v_y = -30;public float v_x = 10;void Start(){}// Update is called once per framevoid Update(){this.transform.position += Vector3.down * Time.deltaTime * v_y / 1000;this.transform.position += Vector3.right * Time.deltaTime * v_x;v_y +=g;}
}
除以1000是为了更好地看到物体的变化,否则目标物体运动太快会直接消失看不见。
方法二:利用Vector3.Lerp(Vector3 a,Vector3 b,float t)
基本原理和方法一一样,只不过是利用了Lerp函数来实现,而不是直接更改位置,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move: MonoBehaviour
{// Start is called before the first frame updatepublic float g = 1;public float v_y = -3;public float v_x = 1;void Start(){}// Update is called once per framevoid Update(){Vector3 vec = new Vector3(Time.deltaTime * v_x, Time.deltaTime * v_y / 1000, 0);transform.position = Vector3.Lerp(transform.position, transform.position + vec, 1);v_y += g;}
}
对参数进行了微调,但内容上还是差不多。这里对Leap函数做个简单的说明,根据unity官方的手册,第三个参数为插值t,根据这一值在a和b之间进行线性插值,当t=1时,返回第二个参数,t=0时,返回第一个参数,t=0.5时,返回a和b中间的点。
方法三:直接相加。
本方法和方法二很相似,区别在于方法二利用Leap函数,而本方法直接相加,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move: MonoBehaviour
{// Start is called before the first frame updatepublic float g = 1;public float v_y = -3;public float v_x = 1;void Start(){}// Update is called once per framevoid Update(){Vector3 vec = new Vector3(Time.deltaTime * v_x, Time.deltaTime * v_y / 1000, 0);transform.position += vec;v_y += g;}
}
这里将目标的transform内的position属性直接和vec相加,和第一种方法很像。
- 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
首先,我们先建立如上的一个太阳系,创建Sphere对象并对其命名,将其他所有星球作为太阳的子对象加入到场景中,并加上贴图,表明各自所代表的星球。在这里我按实际的比例给每个星球设置大小。
其次编写代码,让所有的星球围绕着太阳(即最左边那个星球)公转,同时,各个星球都还需要自转,因此需要实现上述两个功能。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Sum : MonoBehaviour
{// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){GameObject earth = GameObject.Find("Earth");earth.transform.Rotate(Vector3.up * Time.deltaTime);earth.transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 30 * Time.deltaTime);GameObject mercury = GameObject.Find("Mercury");mercury.transform.Rotate(Vector3.up * Time.deltaTime);mercury.transform.RotateAround(Vector3.zero, new Vector3(0, 2, 0), 120 * Time.deltaTime);GameObject venus = GameObject.Find("Venus");venus.transform.Rotate(Vector3.up * Time.deltaTime);venus.transform.RotateAround(Vector3.zero, new Vector3(0, 0, 1), 60 * Time.deltaTime);GameObject mars = GameObject.Find("Mars");mars.transform.Rotate(Vector3.up * Time.deltaTime);mars.transform.RotateAround(Vector3.zero, new Vector3(1, 1, 0), 30 * Time.deltaTime);GameObject jupiter = GameObject.Find("Jupiter");jupiter.transform.Rotate(Vector3.up * Time.deltaTime);jupiter.transform.RotateAround(Vector3.zero, new Vector3(0, 1, 1), 20 * Time.deltaTime);GameObject saturn = GameObject.Find("Saturn");saturn.transform.Rotate(Vector3.up * Time.deltaTime);saturn.transform.RotateAround(Vector3.zero, new Vector3(1, 0, 1), 20 * Time.deltaTime);GameObject uranus = GameObject.Find("Uranus");uranus.transform.Rotate(Vector3.up * Time.deltaTime);uranus.transform.RotateAround(Vector3.zero, new Vector3(1, 1, 1), 10 * Time.deltaTime);GameObject neptune = GameObject.Find("Neptune");neptune.transform.Rotate(Vector3.up * Time.deltaTime);neptune.transform.RotateAround(Vector3.zero, new Vector3(0, 0, 2), 10 * Time.deltaTime);}
}
我实现上述两个功能的思路就是,先利用GameObject.Find()的API找到之前画出来的各个星球,然后利用transform.Rotate()函数实现自转,因为是绕着自己的,因此就用了Vector3.up代表自己的自转轴,最后利用transform.RotateAround()实现公转,因为是不同法平面,则所有的星球都需要绕着不同的轴公转,因此我设定了每个星球围绕的旋转轴的坐标,同时公转速度因为万有引力的存在,越靠近太阳的星球公转越快,所以我粗略地调整了他们的速度来表现这一点。
具体的实现效果截图如下:
编程实践题
代码的很多地方参考了师兄们的写法,虽然我的工作很大程度上是搬砖(),但也学到了不少的东西。
首先需要使用CVM框架编写,所以先创建Model.cs、Controller.cs以及View.cs三个脚本文件。
创建几个3d Object,分别命名为Boat,Cube,Devil,Priest和River,分别代表图上的木船,海岸,恶魔,神父和河。
接下来编写三个脚本
Model.cs
Model.cs文件内定义并实现了所需的核心功能,大致可分为载入模型预设、检测失败或成功以及上下船。
接下来对其内部的函数进行简单的阐述。
Update函数
void Update(){//设置位置,其中StartPos和EndPos是定义的常量。ForwardPosition(start_priests, priestsStartPos, "Priest");BackwardPosition(end_priests, priestsEndPos, "Priest");ForwardPosition(start_devils, devilsStartPos, "Devil");BackwardPosition(end_devils, devilsEndPos, "Devil");//更新船的位置,利用MoveTowards接口完成。if (one.state == State.SE_move){boat_obj.transform.position = Vector3.MoveTowards(ship_obj.transform.position, boatEndPos, Time.deltaTime * speed);if (boat_obj.transform.position == boatEndPos){one.state = State.End;}}else if (one.state == State.ES_move){boat_obj.transform.position = Vector3.MoveTowards(ship_obj.transform.position, boatStartPos, Time.deltaTime * speed);if (boat_obj.transform.position == boatStartPos){one.state = State.Start;}}else //验证游戏是否结束{check();}}
LoadSrc()
void loadSrc(){//设置海岸的坐标Vector3 CubeStartPos = new Vector3(-5, -2, 0);Vector3 CubeEndPos = new Vector3(5, -2, 0);//初始化海岸和河的位置Instantiate(Resources.Load("Prefabs/Cube"), CubeStartPos, Quaternion.identity);Instantiate(Resources.Load("Prefabs/Cube"), CubeEndPos, Quaternion.identity);Instantiate(Resources.Load("Prefabs/River"), RiverPos, Quaternion.identity);//初始化船的位置boat_obj = Instantiate(Resources.Load("Prefabs/Boat"), boatStartPos, Quaternion.identity) as GameObject;//将恶魔和神父压入栈中存储for (int i = 0; i < 3; i++){start_priests.Push(Instantiate(Resources.Load("Prefabs/Priest")) as GameObject);start_devils.Push(Instantiate(Resources.Load("Prefabs/Devil")) as GameObject);}}
ForwardPosition()和BackwardPosition()
//为了设置位置的方便,设置了两个函数,一个在左侧河岸时调用,另一个在右侧河岸时调用
void ForwardPosition(Stack<GameObject> obj, Vector3 pos,string name){GameObject[] temp = obj.ToArray();for (int i = 0; i < obj.Count; i++){temp[i].transform.position = pos + new Vector3(-gap * i, 0, 0);temp[i].tag = name;Debug.Log(temp[i].tag);}}void BackwardPosition(Stack<GameObject> obj, Vector3 pos,string name){GameObject[] temp = obj.ToArray();for (int i = 0; i < obj.Count; i++){temp[i].transform.position = pos + new Vector3(gap * i, 0, 0);}}
在初始化设置时,我给每个对象加了个tag,便于后续的判断。然后需要注意的是需要在Project Setting里加入这个tag,否则找不到
CheckEmpty()
int checkEmpty(){int num = 0;for (int i = 0; i < 2; i++){if (boat[i] == null){num++;}}return num;}
验证船是否满载,并返回空的位置。
getOnBoat()和getOffBoat()
void getOnTheBoat(GameObject obj){obj.transform.parent = boat_obj.transform;if (checkEmpty() != 0){if (boat[0] == null){boat[0] = obj;obj.transform.localPosition = new Vector3(-0.4f, 0.75f, 0);}else{boat[1] = obj;obj.transform.localPosition = new Vector3(0.4f, 0.75f, 0);}}}public void getOffTheBoat(int side){if (boat[side] != null){boat[side].transform.parent = null;if (one.state == State.Start){if (boat[side].tag == "Priest"){start_priests.Push(boat[side]);}else{start_devils.Push(boat[side]);}}else if (one.state == State.End){if (boat[side].tag == "Priest"){end_priests.Push(boat[side]);}else{end_devils.Push(boat[side]);}}boat[side] = null;}}
check()
void check(){if (end_devils.Count == 3 && end_priests.Count == 3){one.state = State.Win;return;}//计算船上有几个神父和恶魔int priestOnBoat = 0, devilOnBoat = 0;for (int i = 0; i < 2; i++){if (boat[i] != null && boat[i].tag == "Priest"){priestOnBoat++;}else if (boat[i] != null && boat[i].tag == "Devil"){devilOnBoat++;}}//计算左边和后边的神父和恶魔的数量int leftPriestCount = 0, leftDevilCount = 0, rightPriestCount = 0, rightDevilCount = 0;if (one.state == State.Start){leftPriestCount = start_priests.Count + priestOnBoat;rightPriestCount = end_priests.Count;leftDevilCount = start_devils.Count + devilOnBoat;rightDevilCount = end_devils.Count;}else if (one.state == State.End){leftPriestCount = start_priests.Count;rightPriestCount = end_priests.Count + priestOnBoat;leftDevilCount = start_devils.Count;rightDevilCount = end_devils.Count + devilOnBoat;}//恶魔比神父多则判定失败if ((leftPriestCount != 0 && leftPriestCount < leftDevilCount) || (rightPriestCount != 0 && rightPriestCount < rightDevilCount)){one.state = State.Lose;}}
上船的相关函数
public void priLeft(){if (start_priests.Count != 0 && checkEmpty() != 0 && one.state == State.Start){getOnTheBoat(start_priests.Pop());}}public void priRight(){if (end_priests.Count != 0 && checkEmpty() != 0 && one.state == State.End){getOnTheBoat(end_priests.Pop());}}public void delLeft(){if (start_devils.Count != 0 && checkEmpty() != 0 && one.state == State.Start){getOnTheBoat(start_devils.Pop());}}public void delRight(){if (end_devils.Count != 0 && checkEmpty() != 0 && one.state == State.End){getOnTheBoat(end_devils.Pop());}}
Reset()
public void Reset_all(){boat_obj.transform.position = boatStartPos;int num1 = end_devils.Count, num2 = end_priests.Count;for (int i = 0; i < num1; i++){start_devils.Push(end_devils.Pop());}for (int i = 0; i < num2; i++){start_priests.Push(end_priests.Pop());}getOffTheBoat(0);getOffTheBoat(1);}
全部代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using mygame;public class Model : MonoBehaviour
{Stack<GameObject> start_priests = new Stack<GameObject>();Stack<GameObject> end_priests = new Stack<GameObject>();Stack<GameObject> start_devils = new Stack<GameObject>();Stack<GameObject> end_devils = new Stack<GameObject>();GameObject[] boat = new GameObject[2];GameObject boat_obj;public float speed = 10f;SSDirector one;float gap = 1.0f;Vector3 boatStartPos = new Vector3(-1f, 0.5f, 0);Vector3 boatEndPos = new Vector3(1f, 0.5f, 0);Vector3 priestsStartPos = new Vector3(-2.5f,1.25f, 0);Vector3 priestsEndPos = new Vector3(2.5f, 1.25f, 0);Vector3 devilsStartPos = new Vector3(-6f, 1.25f, 0);Vector3 devilsEndPos = new Vector3(5.5f,1.25f, 0);Vector3 RiverPos = new Vector3(0, -2.4f, 0);// Use this for initializationvoid Start(){one = SSDirector.GetInstance();one.setModel(this);loadSrc();}// Update is called once per framevoid Update(){ForwardPosition(start_priests, priestsStartPos, "Priest");BackwardPosition(end_priests, priestsEndPos, "Priest");ForwardPosition(start_devils, devilsStartPos, "Devil");BackwardPosition(end_devils, devilsEndPos, "Devil");if (one.state == State.SE_move){boat_obj.transform.position = Vector3.MoveTowards(boat_obj.transform.position, boatEndPos, Time.deltaTime * speed);if (boat_obj.transform.position == boatEndPos){one.state = State.End;}}else if (one.state == State.ES_move){boat_obj.transform.position = Vector3.MoveTowards(boat_obj.transform.position, boatStartPos, Time.deltaTime * speed);if (boat_obj.transform.position == boatStartPos){one.state = State.Start;}}else{check();}}//加载游戏对象void loadSrc(){Vector3 CubeStartPos = new Vector3(-5, -2, 0);Vector3 CubeEndPos = new Vector3(5, -2, 0);Instantiate(Resources.Load("Prefabs/Cube"), CubeStartPos, Quaternion.identity);Instantiate(Resources.Load("Prefabs/Cube"), CubeEndPos, Quaternion.identity);Instantiate(Resources.Load("Prefabs/River"), RiverPos, Quaternion.identity);boat_obj = Instantiate(Resources.Load("Prefabs/Boat"), boatStartPos, Quaternion.identity) as GameObject;for (int i = 0; i < 3; i++){start_priests.Push(Instantiate(Resources.Load("Prefabs/Priest")) as GameObject);start_devils.Push(Instantiate(Resources.Load("Prefabs/Devil")) as GameObject);}}void ForwardPosition(Stack<GameObject> obj, Vector3 pos,string name){GameObject[] temp = obj.ToArray();for (int i = 0; i < obj.Count; i++){temp[i].transform.position = pos + new Vector3(-gap * i, 0, 0);temp[i].tag = name;Debug.Log(temp[i].tag);}}void BackwardPosition(Stack<GameObject> obj, Vector3 pos,string name){GameObject[] temp = obj.ToArray();for (int i = 0; i < obj.Count; i++){temp[i].transform.position = pos + new Vector3(gap * i, 0, 0);}}//判断船上是否有空位int checkEmpty(){int num = 0;for (int i = 0; i < 2; i++){if (boat[i] == null){num++;}}return num;}//上船void getOnTheBoat(GameObject obj){obj.transform.parent = boat_obj.transform;if (checkEmpty() != 0){if (boat[0] == null){boat[0] = obj;obj.transform.localPosition = new Vector3(-0.4f, 0.75f, 0);}else{boat[1] = obj;obj.transform.localPosition = new Vector3(0.4f, 0.75f, 0);}}}//船移动public void moveBoat(){if (checkEmpty() != 2){if (one.state == State.Start){one.state = State.SE_move;}else if (one.state == State.End){one.state = State.ES_move;}}}//下船public void getOffTheBoat(int side){if (boat[side] != null){boat[side].transform.parent = null;if (one.state == State.Start){if (boat[side].tag == "Priest"){start_priests.Push(boat[side]);}else{start_devils.Push(boat[side]);}}else if (one.state == State.End){if (boat[side].tag == "Priest"){end_priests.Push(boat[side]);}else{end_devils.Push(boat[side]);}}boat[side] = null;}}void check(){if (end_devils.Count == 3 && end_priests.Count == 3){one.state = State.Win;return;}int priestOnBoat = 0, devilOnBoat = 0;for (int i = 0; i < 2; i++){if (boat[i] != null && boat[i].tag == "Priest"){priestOnBoat++;}else if (boat[i] != null && boat[i].tag == "Devil"){devilOnBoat++;}}int leftPriestCount = 0, leftDevilCount = 0, rightPriestCount = 0, rightDevilCount = 0;if (one.state == State.Start){leftPriestCount = start_priests.Count + priestOnBoat;rightPriestCount = end_priests.Count;leftDevilCount = start_devils.Count + devilOnBoat;rightDevilCount = end_devils.Count;}else if (one.state == State.End){leftPriestCount = start_priests.Count;rightPriestCount = end_priests.Count + priestOnBoat;leftDevilCount = start_devils.Count;rightDevilCount = end_devils.Count + devilOnBoat;}if ((leftPriestCount != 0 && leftPriestCount < leftDevilCount) || (rightPriestCount != 0 && rightPriestCount < rightDevilCount)){one.state = State.Lose;}}//上船public void priLeft(){if (start_priests.Count != 0 && checkEmpty() != 0 && one.state == State.Start){getOnTheBoat(start_priests.Pop());}}public void priRight(){if (end_priests.Count != 0 && checkEmpty() != 0 && one.state == State.End){getOnTheBoat(end_priests.Pop());}}public void delLeft(){if (start_devils.Count != 0 && checkEmpty() != 0 && one.state == State.Start){getOnTheBoat(start_devils.Pop());}}public void delRight(){if (end_devils.Count != 0 && checkEmpty() != 0 && one.state == State.End){getOnTheBoat(end_devils.Pop());}}//重置游戏public void Reset_all(){boat_obj.transform.position = boatStartPos;int num1 = end_devils.Count, num2 = end_priests.Count;for (int i = 0; i < num1; i++){start_devils.Push(end_devils.Pop());}for (int i = 0; i < num2; i++){start_priests.Push(end_priests.Pop());}getOffTheBoat(0);getOffTheBoat(1);}
}
Controller.cs
这个文档中定义了用户的接口,便于与用户交互
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using mygame;namespace mygame
{public enum State { Start, SE_move, ES_move, End, Win, Lose };public interface UserAction{//仅是作为接口,可以直接调用之前在Model内写好了的接口void priestSOnB(); //左侧神父上船void priestEOnB(); //右侧神父上船void devilSOnB(); //左侧恶魔上船void devilEOnB(); //右侧恶魔上船void moveBoat(); //移动船void offBoatL(); //左侧下船void offBoatR(); //右侧下船void reset(); //重置游戏}public class SSDirector : System.Object, UserAction{private static SSDirector _instance;public Controller currentScenceController;public State state = State.Start;private Model game_obj;public static SSDirector GetInstance(){if (_instance == null){_instance = new SSDirector();}return _instance;}public Model getModel(){return game_obj;}internal void setModel(Model someone){if (game_obj == null){game_obj = someone;}}//直接引用即可。public void priestSOnB(){game_obj.priLeft();}public void priestEOnB(){game_obj.priRight();}public void devilSOnB(){game_obj.delLeft();}public void devilEOnB(){game_obj.delRight();}public void moveBoat(){game_obj.moveBoat();}public void offBoatL(){game_obj.getOffTheBoat(0);}public void offBoatR(){game_obj.getOffTheBoat(1);}public void reset(){//_instance = null;state = State.Start;game_obj.Reset_all();}}}public class Controller : MonoBehaviour
{// Use this for initializationvoid Start(){SSDirector one = SSDirector.GetInstance();}}
View.cs
主要涉及到画面上的按钮。
其中的GUI.depth = 0是我在尝试能不能改变其中一个按钮的深度去覆盖它下面的按钮,但最后没能实现,就将之前重叠的几个按钮分开了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using mygame;public class View : MonoBehaviour
{SSDirector one;UserAction action;// Use this for initializationvoid Start(){one = SSDirector.GetInstance();action = SSDirector.GetInstance() as UserAction;}private void OnGUI(){GUI.skin.label.fontSize = 30;GUI.depth = 0;if (one.state == State.Win){if (GUI.Button(new Rect(0, 0, 300, 100), "胜利!\n(点我一键重开)")){action.reset();}}GUI.depth = 0;if (one.state == State.Lose){if (GUI.Button(new Rect(0, 0, 300, 100), "失败!\n(点我一键重开)")){action.reset();}}GUI.depth = 0;if (GUI.Button(new Rect(500, 50, 100, 50), "开船!")){action.moveBoat();}GUI.depth = 1;if (GUI.Button(new Rect(450, 300, 75, 50), "左侧下船")){action.offBoatL();}GUI.depth = 10;if (GUI.Button(new Rect(550, 300, 75, 50), "右侧下船")){action.offBoatR();}GUI.depth = 0;if (GUI.Button(new Rect(200, 150, 75, 50), "恶魔上船")){action.devilSOnB();}GUI.depth = 0;if (GUI.Button(new Rect(350 , 150, 75, 50), "神父上船")){action.priestSOnB();}GUI.depth = 0;if (GUI.Button(new Rect(650, 150, 75, 50), "神父上船")){action.priestEOnB();}GUI.depth = 0;if (GUI.Button(new Rect(800, 150, 75, 50), "恶魔上船")){action.devilEOnB();}}
}
演示
演示视频如下:
https://www.bilibili.com/video/BV1u14y1j7e1/?spm_id_from=333.999.0.0
Assignment 3相关推荐
- MATH6005 Final Assignment MATH6005 2018-19
MATH6005 2018-19 MATH6005 Final Assignment 1. Instructions Your Assignment 3 should consist of three ...
- React | Expected an assignment or function call and instead saw.....
记一个 react 程序报的错误:Expected an assignment or function call and instead saw an expression,直译是:需要是一个函数 ...
- python list越界原因(list assignment index out of range)
分析: list assignment index out of range:列表超过限制 情况1:list[index]index超出范围 情况2:list是一个空的,没有一个元素,进行list[0 ...
- SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment?
SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment? 比如如下交货单, 完成了WM层面的拣配,分配了2个HU号码.完成了过账后来取消了PGI,并且使用LT09 ...
- 不允许 ASSIGNMENT 语句中包含 FOR XML 子句。
DECLARE @guidList NVARCHAR(max) SELECT @guidList=( CAST(OrderGUID AS nvarchar(max)) +',') FROM Or ...
- python UnboundLocalError: local variable 'log_f' referenced before assignment 错误
在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...
- CS224n Assignment 2
为什么80%的码农都做不了架构师?>>> 本文由码农场同步,最新版本请查看原文:http://www.hankcs.com/nlp/cs224n-assignment-2.ht ...
- assignment makes pointer from integer without a...
2019独角兽企业重金招聘Python工程师标准>>> warning: assignment makes pointer from integer without a cast 今 ...
- 2015 Multi-University Training Contest 1 - 1002 Assignment
Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值 ...
- JStorm与Storm源码分析(二)--任务分配,assignment
mk-assignments主要功能就是产生Executor与节点+端口的对应关系,将Executor分配到某个节点的某个端口上,以及进行相应的调度处理.代码注释如下: ;;参数nimbus为nimb ...
最新文章
- 王坚十年前的坚持,才有了今天世界顶级大数据计算平台MaxCompute...
- 总线的性能指标,包括总线频率,宽度,和带宽(微机接口技术)
- Java各版本的重大改变
- 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
- 汇编语言 条件转移指令JCXZ
- sqlserver日志文件过大的处理方法
- python打包的exe开机自动启动(windows)
- oracle 数据库新建实例导入数据
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
- 信号与槽是如何实现的_苹果iPhone 12信号仍弱?网友反馈打不进电话需重启解决...
- 菜鸟驿站:今年双11期间全国站点将普遍延长营业时间
- 软件测试基础课程学习笔记7---如何撰写测试报告
- iOS开发那些事-iOS应用本地化-文本信息本地化
- 谷歌首页被别的网站篡改
- 17082 两个有序数序列中找第k小(优先做)
- Java中super()的用法。主类和子类的继承关系。(2)
- 5G WiFi频段介绍
- 在Android开发中遇到的MediaPlayer问题
- 物联网-移远M26模块初识及资料分享
- 兼容android 6.0以上获取设备编号等权限