Assignment 3

简答题

  1. 游戏对象运动的本质是什么?

​ 利用矩阵的变换,如平移、旋转、缩放等,来改变游戏对象的控件属性。具体而言,是Transform中的position和rotation两个属性,通过修改它们的值属性,进而改变其绝对坐标和旋转方向。

  1. 请用三种方法以上方法,实现物体的抛物线运动。(如,修改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相加,和第一种方法很像。

  1. 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

首先,我们先建立如上的一个太阳系,创建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相关推荐

  1. MATH6005 Final Assignment MATH6005 2018-19

    MATH6005 2018-19 MATH6005 Final Assignment 1. Instructions Your Assignment 3 should consist of three ...

  2. React | Expected an assignment or function call and instead saw.....

      记一个 react 程序报的错误:Expected an assignment or function call and instead saw an expression,直译是:需要是一个函数 ...

  3. python list越界原因(list assignment index out of range)

    分析: list assignment index out of range:列表超过限制 情况1:list[index]index超出范围 情况2:list是一个空的,没有一个元素,进行list[0 ...

  4. SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment?

    SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment? 比如如下交货单, 完成了WM层面的拣配,分配了2个HU号码.完成了过账后来取消了PGI,并且使用LT09 ...

  5. 不允许 ASSIGNMENT 语句中包含 FOR XML 子句。

    DECLARE @guidList NVARCHAR(max) SELECT   @guidList=( CAST(OrderGUID AS nvarchar(max)) +',')  FROM Or ...

  6. python UnboundLocalError: local variable 'log_f' referenced before assignment 错误

    在写一个python程序,用finally处理异常的时候,报了"UnboundLocalError: local variable 'log_f' referenced before ass ...

  7. CS224n Assignment 2

    为什么80%的码农都做不了架构师?>>>    本文由码农场同步,最新版本请查看原文:http://www.hankcs.com/nlp/cs224n-assignment-2.ht ...

  8. assignment makes pointer from integer without a...

    2019独角兽企业重金招聘Python工程师标准>>> warning: assignment makes pointer from integer without a cast 今 ...

  9. 2015 Multi-University Training Contest 1 - 1002 Assignment

    Assignment Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值 ...

  10. JStorm与Storm源码分析(二)--任务分配,assignment

    mk-assignments主要功能就是产生Executor与节点+端口的对应关系,将Executor分配到某个节点的某个端口上,以及进行相应的调度处理.代码注释如下: ;;参数nimbus为nimb ...

最新文章

  1. 王坚十年前的坚持,才有了今天世界顶级大数据计算平台MaxCompute...
  2. 总线的性能指标,包括总线频率,宽度,和带宽(微机接口技术)
  3. Java各版本的重大改变
  4. 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
  5. 汇编语言 条件转移指令JCXZ
  6. sqlserver日志文件过大的处理方法
  7. python打包的exe开机自动启动(windows)
  8. oracle 数据库新建实例导入数据
  9. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
  10. 信号与槽是如何实现的_苹果iPhone 12信号仍弱?网友反馈打不进电话需重启解决...
  11. 菜鸟驿站:今年双11期间全国站点将普遍延长营业时间
  12. 软件测试基础课程学习笔记7---如何撰写测试报告
  13. iOS开发那些事-iOS应用本地化-文本信息本地化
  14. 谷歌首页被别的网站篡改
  15. 17082 两个有序数序列中找第k小(优先做)
  16. Java中super()的用法。主类和子类的继承关系。(2)
  17. 5G WiFi频段介绍
  18. 在Android开发中遇到的MediaPlayer问题
  19. 物联网-移远M26模块初识及资料分享
  20. 兼容android 6.0以上获取设备编号等权限

热门文章

  1. 互联网运营打造个人微博之道
  2. CodeForces 687B(剩余定理)
  3. html 色值转换器,颜色转换工具
  4. PyTorch中的No module named models?
  5. 【VSCode】推荐一个超好看的主题
  6. Ocelot的使用(基本使用)
  7. POI 读取excel文档中输入日期格式为字符串
  8. 如何基于 Agora Android SDK 在应用中实现视频通话?
  9. 准备选择计算机方向,该怎样快速学习电脑知识?零基础到精通入门!
  10. 对STDOUT_FILENO的理解