密室逃脫——收集版修改測試

一、原版修改
1、導入資源

Unity Learn | 3D Beginner: Complete Project | URP

2、設置Scene

刪除SampleScene,打開UnityTechnologies-3DBeginnerComplete下的MainScene

3、降低音量

(1) 打開Hierarchy面板上的Audio降低音量

(2) 打開Prefabs文件夾,找到Ghost,降低音量

4、給FaderCanvas添加組件

(1) Canvas Scaler

(2) Graphic Raycaster

二、編輯答題面板

(1) UI-Image,命名為Questions。

(2) 選中導入的圖片,然后在Inspector面板中將Texture Type設置為Sprite (2D and UI)

(3) 更改Questions的Image,Transform

(4) 添加按鈕,QuitBtn(以隱藏答題面板)

(5) 添OptionBtnA(ABCD)

(6) 新增文本:TipAnswerText、TitleText

三、建立和調用題庫
1、創建Question.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Question
{public string titleIndex, questiont, correctOptionIndex; // 題號,問題文本, 正確答案的索引(1表示A,2表示B,依此類推)public string optionA, optionB, optionC, optionD;// 選項// 構造函數(可選),用于初始化問題public Questions(string titleInx, string q, string optsA, string optsB, string optsC, string optsD, string correctIndex){titleIndex = titleInx;questiont = q;optionA = optsA;optionB = optsB;optionC = optsC;optionD = optsD;correctOptionIndex = correctIndex;}// 檢查答案是否正確public bool CheckAnswer(string playerChoice){return playerChoice == correctOptionIndex;}
}

或——建議這個

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class Question
{public string questionTitle, questionTitleIndex; // 問題文本、題號public string[] options = new string[4]; // 選項數組,假設每個問題都有4個選項public int correctOptionIndex; // 正確答案的索引(1表示A,2表示B,依此類推)// 構造函數(可選),用于初始化問題public Question(string questionID, string questionText, string[] options, int correctOptionIndex){this.questionTitleIndex = questionID;this.questionTitle = questionText;this.options = options;this.correctOptionIndex = correctOptionIndex;}
}
2、加載題庫并隨機顯示
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using TMPro;
using UnityEngine;public class LoadQuestions : MonoBehaviour
{//存放問題的容器public TextMeshProUGUI titleText, optionTextA, optionTextB, optionTextC, optionTextD;private void Start(){LoadQuestionsFromFile("YW");}public void LoadQuestionsFromFile(string filePath){//加載位于Resources文件夾中的YW文件TextAsset textFile = Resources.Load<TextAsset>("YW");//若文件加載成功if (textFile != null){Debug.Log("YW文件加載成功");//將textFile中儲存的文本按行拆分成一個字符串數組,每個數組元素都表示一行文本("\n":換行符)//string[] lines = textFile.text.Split("new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None");//不同系統或編輯器可能使用的不同換行符格式string[] lines = textFile.text.Split("\n");// 獲取一個隨機的索引int randomIndex = UnityEngine.Random.Range(0, lines.Length);//從lines中獲取一個隨機元素,將之賦值給linestring line = lines[randomIndex];//解析line中的字段string[] fields = line.Split(":");// 創建問題對象Questions question = new(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6]);titleText.text = question.questiont;optionTextA.text = question.optionA;optionTextB.text = question.optionB;optionTextC.text = question.optionC;optionTextD.text = question.optionD;}else { Debug.Log("YW文件加載失敗"); }}
}

或 ——建議下面這個(需要在Unity編輯器中設置選項按鈕的On Click

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class LoadQuestions : MonoBehaviour
{public Text titleText;public Button[] optionButtons;private string[] lines; // 保存所有問題的數組private List<Question> questions = new List<Question>(); // 問題列表private Question currentQuestion;private void Start(){LoadQuestionsFromFile();UpdateQuestionUI();}//加載題庫public void LoadQuestionsFromFile(){TextAsset textFile = Resources.Load<TextAsset>("test_01");if (textFile != null){lines = textFile.text.Split("\n");for (int i = 0; i < lines.Length; i++){string[] fields = lines[i].Split(":");if (fields.Length >= 7){string questionID = fields[0];string questionTitle = fields[1];string[] options = new string[] { fields[2], fields[3], fields[4], fields[5] };//int correctOptionIndex = int.Parse(fields[6]); // 將正確答案的索引作為整數類型存儲int correctOptionIndex;if (int.TryParse(fields[6], out correctOptionIndex)) // 使用 TryParse 避免異常{questions.Add(new Question(questionID, questionTitle, options, correctOptionIndex));}else{Debug.LogError("文件格式錯誤:第 " + (i + 1) + " 行中的正確答案索引不是有效的整數");}}else{Debug.LogError("文件格式錯誤:第 " + (Array.IndexOf(lines, lines) + 1) + " 行沒有足夠的字段");}}}}//隨機顯示public void UpdateQuestionUI(){int randomIndex = UnityEngine.Random.Range(0, questions.Count - 1);currentQuestion = questions[randomIndex];string question = currentQuestion.questionTitle;string[] options = currentQuestion.options; // 獲取選項數組int correctIndex = currentQuestion.correctOptionIndex; // 獲取正確選項的索引titleText.text = question;for (int i = 0; i < optionButtons.Length; i++){optionButtons[i].onClick.RemoveAllListeners();int index = i; // 創建局部變量保存索引值optionButtons[i].GetComponentInChildren<Text>().text = options[i];}}
}
3、判斷正誤
    public void CheckAnswer(int optionIndex){if (optionIndex == currentQuestion.correctOptionIndex){Debug.Log("回答正確!" + optionIndex + currentQuestion.correctOptionIndex);}else{Debug.Log("回答錯誤!" + optionIndex + currentQuestion.correctOptionIndex);}}
4、禁用按鈕
public void UpdateQuestionUI()
{int randomIndex = UnityEngine.Random.Range(0, questions.Count - 1);currentQuestion = questions[randomIndex];string question = currentQuestion.questionTitle;string[] options = currentQuestion.options; // 獲取選項數組int correctIndex = currentQuestion.correctOptionIndex; // 獲取正確選項的索引titleText.text = question;for (int i = 0; i < optionButtons.Length; i++){optionButtons[i].onClick.RemoveAllListeners();int index = i; // 創建局部變量保存索引值optionButtons[i].GetComponentInChildren<Text>().text = options[i];optionButtons[i].interactable = true; // 啟用按鈕}
}
public void CheckAnswer(int optionIndex)
{for (int i = 0; i < optionButtons.Length; i++){optionButtons[i].interactable = false; // 禁用按鈕}if (optionIndex == currentQuestion.correctOptionIndex){Debug.Log("回答正確!" + optionIndex + currentQuestion.correctOptionIndex);}else{Debug.Log("回答錯誤!" + optionIndex + currentQuestion.correctOptionIndex);}
}
5、記錄答過的題目,并從題庫中清除
public void LoadQuestionsFromFile()
{TextAsset textFile = Resources.Load<TextAsset>("test_01");if (textFile != null){//確保跨平臺兼容性拆分文本string[] lines = textFile.text.Split(new string[] { System.Environment.NewLine }, System.StringSplitOptions.RemoveEmptyEntries);for (int i = 0; i < lines.Length; i++){string[] fields = lines[i].Split(':');if (questions.Count > 0){usedQuestions.Clear();}if (fields.Length >= 7){string questionID = fields[0];string questionTitle = fields[1];string[] options = new string[] { fields[2], fields[3], fields[4], fields[5] };int correctOptionIndex;if (int.TryParse(fields[6], out correctOptionIndex)){questions.Add(new Question(questionID, questionTitle, options, correctOptionIndex));}else{Debug.LogErrorFormat("文件格式錯誤:第 {0} 行中的正確答案索引不是有效的整數", i + 1);}}else{Debug.LogErrorFormat("文件格式錯誤:第 {0} 行沒有足夠的字段", i + 1);}}}else{Debug.LogError("找不到文本文件 test_01");}
}

?完整腳本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class LoadQuestions : MonoBehaviour
{public Text titleText;public Button[] optionButtons;private string[] lines; // 保存所有問題的數組private List<Question> questions = new List<Question>(); // 問題列表private Question currentQuestion;private void Start(){LoadQuestionsFromFile();UpdateQuestionUI();}public void LoadQuestionsFromFile(){TextAsset textFile = Resources.Load<TextAsset>("test_01");if (textFile != null){lines = textFile.text.Split("\n");for (int i = 0; i < lines.Length; i++){string[] fields = lines[i].Split(":");if (fields.Length >= 7){string questionID = fields[0];string questionTitle = fields[1];string[] options = new string[] { fields[2], fields[3], fields[4], fields[5] };//int correctOptionIndex = int.Parse(fields[6]); // 將正確答案的索引作為整數類型存儲int correctOptionIndex;if (int.TryParse(fields[6], out correctOptionIndex)) // 使用 TryParse 避免異常{questions.Add(new Question(questionID, questionTitle, options, correctOptionIndex));}else{Debug.LogError("文件格式錯誤:第 " + (i + 1) + " 行中的正確答案索引不是有效的整數");}}else{Debug.LogError("文件格式錯誤:第 " + (Array.IndexOf(lines, lines) + 1) + " 行沒有足夠的字段");}}}}public void UpdateQuestionUI(){int randomIndex = UnityEngine.Random.Range(0, questions.Count - 1);currentQuestion = questions[randomIndex];string question = currentQuestion.questionTitle;string[] options = currentQuestion.options; // 獲取選項數組int correctIndex = currentQuestion.correctOptionIndex; // 獲取正確選項的索引titleText.text = question;for (int i = 0; i < optionButtons.Length; i++){optionButtons[i].onClick.RemoveAllListeners();int index = i; // 創建局部變量保存索引值optionButtons[i].GetComponentInChildren<Text>().text = options[i];optionButtons[i].interactable = true; // 啟用按鈕}}public void CheckAnswer(int optionIndex){for (int i = 0; i < optionButtons.Length; i++){optionButtons[i].interactable = false; // 禁用按鈕}if (optionIndex == currentQuestion.correctOptionIndex){Debug.Log("回答正確!" + optionIndex + currentQuestion.correctOptionIndex);}else{Debug.Log("回答錯誤!" + optionIndex + currentQuestion.correctOptionIndex);}}
}
四、收集事件
1、新增文本

(1) 新增文本:ItemsText, TipText(可設置有透明度的黑色背景)

(2) 給JohnLemon添加標簽Player

2、更改Enemies下的子物體

(1) 復制PointOfView預制體,重命名為ExitEventTriggers

(2) 刪除Ghost (3)的PointOfView子物體,在該位置添加ExitEventTriggers子物體

(3) 編輯PointOfView預制體,刪除Observer.cs組件,添加CollectedItems.cs組件

3、新建CollectedItems.cs

(1) 設置隱藏答題面板按鈕,同時調用新題目

public GameObject questionsPanel;
public Button quitBtn;
public LoadQuestions LoadQuestions;void Start()
{questionsPanel.SetActive(false);
}public void HideQuestionPanel()
{if (questionsPanel != null){questionsPanel.SetActive(false); // 隱藏物體LoadQuestions.UpdateQuestionUI();}
}

(2) 增加顯示背包物品

public Text itemsText;
static int nucleus = 0, mitochondria = 0, GolgiApparatus = 0, endoplasmicReticulum = 0, ribosome = 0;void Start()
{ItemsUpdate();
}void ItemsUpdate()
{itemsText.text = "當前持有:……" + nucleus + ";……" + mitochondria + ";……" + GolgiApparatus + ";……" + endoplasmicReticulum + ";……" + ribosome;
}

(3) 增加冷卻事件

bool canTriggerEffect = true;void RandomEvent()
{if (canTriggerEffect){//執行接觸事件……else{tipText.text = "你什么都沒有發現……";StartCoroutine(ClearTextRoutine(2f));//2秒后文本消失} canTriggerEffect = false;StartCoroutine(CooldownRoutine());}
}IEnumerator CooldownRoutine()//接觸事件有1分鐘的冷卻時間
{yield return new WaitForSeconds(60f); // 等待1分鐘canTriggerEffect = true; // 冷卻結束,可以再次觸發效果
}
IEnumerator ClearTextRoutine(float delay)//提示文本顯示后消失
{yield return new WaitForSeconds(delay);tipText.text = "";
}

(4) 增加收集事件

    void Start(){if (itemsText == null || tipText == null){Debug.LogError("ItemsText 或 TipText 未被正確分配!");}questionsPanel.SetActive(false);}private void OnTriggerEnter(Collider other){if (other.CompareTag("Player")){RandomEvent();}}void RandomEvent(){int numericValue = Random.Range(0, 100);if (numericValue < 5 && nucleus == 0){nucleus = 1;tipText.text = "你發現了nucleus!";}else if (numericValue < 26){mitochondria++;tipText.text = "你得到了mitochondria!";}else if (numericValue < 41){endoplasmicReticulum++;tipText.text = "你得到了endoplasmicReticulum*1!";}else if (numericValue < 56){GolgiApparatus++;tipText.text = "你得到了GolgiApparatus*1!";}else if (numericValue < 76){ribosome++;tipText.text = "你得到了ribosome*1!";}else if (numericValue < 86){questionsPanel.SetActive(true);}else{tipText.text = "你什么都沒有發現……";}ItemsUpdate();}void ItemsUpdate(){itemsText.text = "當前持有:nucleus" + nucleus + ";……" + mitochondria + ";……" + GolgiApparatus + ";……" + endoplasmicReticulum + ";……" + ribosome;}
}

本節完整腳本

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;public class CollectedItems : MonoBehaviour
{public Text itemsText;public Text tipText;static int nucleus = 0, mitochondria = 0, GolgiApparatus = 0, endoplasmicReticulum = 0, ribosome = 0;public GameObject questionsPanel;public Button quitBtn;public LoadQuestions LoadQuestions;bool canTriggerEffect = true;void Start(){if (itemsText == null || tipText == null){Debug.LogError("ItemsText 或 TipText 未被正確分配!");}questionsPanel.SetActive(false);ItemsUpdate();}private void OnTriggerEnter(Collider other){if (other.CompareTag("Player")){RandomEvent();}}void RandomEvent(){if (canTriggerEffect){int numericValue = Random.Range(0, 100);if (numericValue < 5 && nucleus == 0){nucleus = 1;tipText.text = "你發現了nucleus!";StartCoroutine(ClearTextRoutine(2f));}else if (numericValue < 26){mitochondria++;tipText.text = "你得到了mitochondria!";StartCoroutine(ClearTextRoutine(2f));}else if (numericValue < 41){endoplasmicReticulum++;tipText.text = "你得到了endoplasmicReticulum*1!";StartCoroutine(ClearTextRoutine(2f));}else if (numericValue < 56){GolgiApparatus++;tipText.text = "你得到了GolgiApparatus*1!";StartCoroutine(ClearTextRoutine(2f));}else if (numericValue < 76){ribosome++;tipText.text = "你得到了ribosome*1!";StartCoroutine(ClearTextRoutine(2f));}else if (numericValue < 86){questionsPanel.SetActive(true);}else{tipText.text = "你什么都沒有發現……";StartCoroutine(ClearTextRoutine(2f));}ItemsUpdate();canTriggerEffect = false;StartCoroutine(CooldownRoutine());}}void ItemsUpdate(){itemsText.text = "當前持有:nucleus" + nucleus + ";mitochondria" + mitochondria + ";GolgiApparatus" + GolgiApparatus + ";endoplasmicReticulum" + endoplasmicReticulum + ";ribosome" + ribosome;}IEnumerator CooldownRoutine(){yield return new WaitForSeconds(60f); // 等待1分鐘canTriggerEffect = true; // 冷卻結束,可以再次觸發效果}IEnumerator ClearTextRoutine(float delay){yield return new WaitForSeconds(delay);tipText.text = "";}public void HideQuestionPanel(){if (questionsPanel != null){questionsPanel.SetActive(false); // 隱藏物體LoadQuestions.UpdateQuestionUI();//調用新題目}}
}
五、增加生命系統
1、新建PlayerHealth.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class PlayerHealth : MonoBehaviour
{public int maxHealth = 3;private int currentHealth;public Text life;public GameEnding gameEndings;private void Start(){currentHealth = maxHealth; // 先設置currentHealth的值UpdateHealthText();}public void AddHealth(){if (currentHealth < maxHealth){currentHealth++;UpdateHealthText();}}public void RemoveHealth(){if (currentHealth > 0){currentHealth--;UpdateHealthText();if (currentHealth == 0){gameEndings.CaughtPlayer(); // 玩家死亡}}}private void UpdateHealthText(){life.text = "當前生命" + currentHealth.ToString();}
}
2、增加文本顯示生命值

(1) 增加顯示當前生命值文本

(2) 增加減少生命值提醒圖片

3、處理加減生命的方法
public class LoadQuestions : MonoBehaviourpublic PlayerHealth PlayerHealth;public void CheckAnswer(int optionIndex)
{
if (optionIndex == currentQuestion.correctOptionIndex)
{Debug.Log("回答正確!" + optionIndex + currentQuestion.correctOptionIndex);PlayerHealth.AddHealth();TipAnswerText.text = "回答正確!生命值+1!退出按Quit";
}
else
{Debug.Log("回答錯誤!" + optionIndex + currentQuestion.correctOptionIndex);PlayerHealth.RemoveHealth();TipAnswerText.text = "回答錯誤!生命值-1!\n+退出按Quit";
}
}
六、?更改死亡事件
using UnityEngine;
using UnityEngine.SceneManagement;public class GameEnding : MonoBehaviour
{public float fadeDuration = 1f;public float displayImageDuration = 1f;public GameObject player;public CanvasGroup exitBackgroundImageCanvasGroup;public AudioSource exitAudio;public CanvasGroup caughtBackgroundImageCanvasGroup;public AudioSource caughtAudio;bool m_IsPlayerAtExit;bool m_IsPlayerCaught;float m_Timer;bool m_HasAudioPlayed;void OnTriggerEnter (Collider other){if (other.gameObject == player){m_IsPlayerAtExit = true;}}public void CaughtPlayer (){m_IsPlayerCaught = true;}void Update (){if (m_IsPlayerAtExit){EndLevel (exitBackgroundImageCanvasGroup, false, exitAudio);}else if (m_IsPlayerCaught){EndLevel (caughtBackgroundImageCanvasGroup, true, caughtAudio);}}void EndLevel (CanvasGroup imageCanvasGroup, bool doRestart, AudioSource audioSource){if (!m_HasAudioPlayed){audioSource.Play();m_HasAudioPlayed = true;}m_Timer += Time.deltaTime;imageCanvasGroup.alpha = m_Timer / fadeDuration;if (m_Timer > fadeDuration + displayImageDuration){if (doRestart){//SceneManager.LoadScene ("MainScene1");Application.Quit();//退出游戲}else{Application.Quit ();}}}
}
七、增加敵人,增加隨機死亡事件
八、添加手柄

(1) 下載并導入??資源包?

(2) 打開Prefabs 文件夾,將 Fixed Joystick 拖放到Hierarchy面板的Canvas下,調整大小和位置

(3) 調整腳本

public FixedJoystick fixedJoystick;
public float moveSpeed = 1f;void Start()
{……fixedJoystick = GameObject.FindObjectOfType<FixedJoystick>();
}private void FixedUpdate()
{// 手柄控制代碼
if (fixedJoystick != null)
{float joystickHorizontal = fixedJoystick.Horizontal;float joystickVertical = fixedJoystick.Vertical;if (!Mathf.Approximately(joystickHorizontal, 0f) || !Mathf.Approximately(joystickVertical, 0f)){horizontal = joystickHorizontal;vertical = joystickVertical;m_Movement.Set(horizontal, 0f, vertical);m_Movement.Normalize();}
}
}

完整代碼

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;public class PlayerMovement : MonoBehaviour
{public FixedJoystick fixedJoystick;public InputAction MoveAction;public float turnSpeed = 20f;public float moveSpeed = 1f;Animator m_Animator;Rigidbody m_Rigidbody;AudioSource m_AudioSource;Vector3 m_Movement;Quaternion m_Rotation = Quaternion.identity;void Start (){m_Animator = GetComponent<Animator> ();m_Rigidbody = GetComponent<Rigidbody> ();m_AudioSource = GetComponent<AudioSource> ();MoveAction.Enable();fixedJoystick = GameObject.FindObjectOfType<FixedJoystick>();}void FixedUpdate(){// 原有的鍵盤控制代碼float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");m_Movement.Set(horizontal, 0f, vertical);m_Movement.Normalize();// 手柄控制代碼if (fixedJoystick != null){float joystickHorizontal = fixedJoystick.Horizontal;float joystickVertical = fixedJoystick.Vertical;if (!Mathf.Approximately(joystickHorizontal, 0f) || !Mathf.Approximately(joystickVertical, 0f)){horizontal = joystickHorizontal;vertical = joystickVertical;m_Movement.Set(horizontal, 0f, vertical);m_Movement.Normalize();}}bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);bool hasVerticalInput = !Mathf.Approximately(vertical, 0f);bool isWalking = hasHorizontalInput || hasVerticalInput;m_Animator.SetBool("IsWalking", isWalking);if (isWalking){if (!m_AudioSource.isPlaying){m_AudioSource.Play();}}else{m_AudioSource.Stop();}Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);m_Rotation = Quaternion.LookRotation(desiredForward);// 移動角色m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * moveSpeed * Time.fixedDeltaTime);}void OnAnimatorMove (){m_Rigidbody.MovePosition (m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);m_Rigidbody.MoveRotation (m_Rotation);}
}
九、發布

1、安裝 WebGL Build Support

2、更改Color Space(other……)下

3、在File下進行打包

4、在publish中上傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41216.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lnmp php7 安裝ssh2擴展

安裝ssh2擴展前必須安裝libssh2包 下載地址: wget http://www.libssh2.org/download/libssh2-1.11.0.tar.gzwget http://pecl.php.net/get/ssh2-1.4.tgz &#xff08;這里要換成最新的版本&#xff09; 先安裝 libssh2 再安裝 SSH2: tar -zxvf libssh2-1.11.0.tar.gzcd libss…

若依框架(RuoYi)中實現部門及子部門用戶查詢的SQL邏輯解析

前言 在基于若依框架&#xff08;RuoYi&#xff09;的項目開發中&#xff0c;經常會遇到需要根據部門ID查詢其下屬所有用戶的需求&#xff0c;包括直接隸屬于該部門的用戶以及屬于其子部門的所有用戶。這一需求在組織架構管理、權限分配等場景中尤為常見。本文將深入解析一段典…

【深入理解計算機系統——2信息的表示和處理】

計算機的本質就是二進制&#xff0c;0/1&#xff0c;稱之為bit&#xff08;位&#xff09;&#xff0c;一個位沒有什么意義&#xff0c;當同時擁有多個位&#xff0c;并且加上某種解釋&#xff0c;就可以表示任何有限集合的元素。&#xff08;為什么是有限&#xff1f;因為用bi…

【日志信息管理】管理日志信息的類

日志用于記錄程序的執行記錄包括程序的出錯記錄&#xff0c;程序致命退出原因&#xff0c;程序的正常執行記錄。這樣我們就可以很快的察覺程序的錯誤原因、執行狀況等等&#xff0c;因此管理日志信息是非常重要的。 日志一般由以下部分組合&#xff1a; 日志時間、日志等級、…

Java 基礎--File - IO流(2)

I/O流 定義 數據從硬盤流向內存為輸入流&#xff0c;數據從內存流向硬盤為輸出流。輸入也叫讀取數據&#xff0c;輸出也叫寫出數據。 IO分類 1.按照數據的流向分為&#xff1a;輸入流和輸出流 ①輸入流&#xff1a;把數據從其他設備上讀取到內存中的流 ②輸出流&#xff1…

Qt 基礎組件速學 事件過濾器

學習目標&#xff1a;理解事件過濾器 前置環境 運行環境:qt creator 4.12 學習內容和效果演示&#xff1a; Qt 提供了事件過濾器的機制,允許我們在事件到達目標對象之前對事件進行攔截和處理。這在以下情況下非常有用: 全局事件處理: 我們可以在應用程序級別安裝一個事件過…

工控人最愛的PLC觸摸屏一體機,有多香

PLC觸摸屏一體機是什么 PLC觸摸屏一體機&#xff0c;聽起來可能有點技術化&#xff0c;但簡單來說&#xff0c;它就是一個集成了可編程邏輯控制器&#xff08;PLC&#xff09;和觸摸屏的智能設備。這種設備不僅能夠執行自動化控制任務&#xff0c;還能實時顯示和操作設備狀態&a…

JVM原理(十九):JVM虛擬機內存模型

1. 硬件的效率與一致性 數據不安全的原因&#xff1a;緩存一致性的問題 共享內存多核系統&#xff1a;在多路處理器系統中&#xff0c;每個處理器都有自己的高速緩存&#xff0c;而他們又共享同一主內存。 線程先后執行結果不一致問題&#xff1a;除了增加高速緩存之外&#…

【Python】已解決:nltk.download(‘stopwords‘) 報錯問題

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決&#xff1a;nltk.download(‘stopwords’) 報錯問題 一、分析問題背景 在使用Python的自然語言處理庫NLTK&#xff08;Natural Language Toolkit&#xff09;時&#xff0c…

后端開發常見錯誤

1、解析json字符串要考慮格式不正確&#xff0c;空值情況 2、解析時間字符串要考虎格式和空值 3、使用mybatis的foreach的時候要考慮拼接sql的耗時&#xff0c;尤其是超過10條數據 4、表字段長度&#xff0c;在接口層校驗字段長度&#xff0c; 調用三方系統的報錯要截取報錯…

CentOS 7安裝Elasticsearch7.7.0和Kibana

一. 準備安裝包 elasticsearch和kibana&#xff1a;官網歷史版本找到并下載&#xff08;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff09;ik分詞器&#xff1a;GitHub下載&#xff08;https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨獸:解讀評估LLM性能的關鍵技術指標

衡量巨獸&#xff1a;解讀評估LLM性能的關鍵技術指標 引言一、困惑度&#xff1a;語言模型的試金石1.1 定義與原理1.2 計算公式1.3 應用與意義 二、BLEU 分數&#xff1a;翻譯質量的標尺2.1 定義與原理2.2 計算方法2.3 應用與意義 三、其他評估指標&#xff1a;綜合考量下的多元…

設計模式之狀態機模式

一、狀態機模式介紹 狀態機模式&#xff08;State Machine Pattern&#xff09;是一種用于描述對象行為的軟件設計模式&#xff0c;屬于行為型設計模式。在狀態機模式中&#xff0c;對象的行為取決于其內部狀態&#xff0c;并且在不同的狀態下&#xff0c;對象可能會有不同的行…

STM32F103C8T6核心板原理圖和PCB分享

PCB圖 原理圖 資料下載地址&#xff1a; 原理圖PCB庫: https://545c.com/d/45573183-61875742-29897c?p7526 (訪問密碼: 7526)

[go-zero] 簡單微服務調用

文章目錄 1.注意事項2.服務劃分及創建2.1 用戶微服務2.2 訂單微服務 3.啟動服務3.1 etcd 服務啟動3.2 微服務啟動3.3 測試訪問 1.注意事項 go-zero微服務的注冊中心默認使用的是Etcd。 本小節將以一個訂單服務調用用戶服務來簡單演示一下&#xff0c;其實訂單服務是api服務&a…

Java 使用sql查詢mongodb

在現代應用開發中&#xff0c;關系型數據庫和NoSQL數據庫各有千秋。MongoDB作為一種流行的NoSQL數據庫&#xff0c;以其靈活的文檔模型和強大的擴展能力&#xff0c;受到廣泛歡迎。然而&#xff0c;有時開發者可能更熟悉SQL查詢語法&#xff0c;或者需要在現有系統中復用SQL查詢…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超優先級中斷詳細介紹】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 Interrupt superpriority超優先級中斷的特性和應用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

進程控制-wait和waitpid進程回收

wait 阻塞函數 函數作用&#xff1a; 1. 阻塞并等待子進程退出 2. 回收子進程殘留資源 3. 獲取子進程結束狀態&#xff08;退出原因&#xff09; pid_t wait(int *wstatus); 返回值&#xff1a; ‐1 : 回收失敗&#xff0c;已經沒有子進程了 >0 : 回收子進程對應的…

一種非凸全變差正則化的信號降噪方法(以模擬信號和軸承振動信號為例,MATLAB)

以旋轉機械振動信號為例&#xff0c;由于旋轉機械運行中背景噪聲較強&#xff0c;振動信號需要進行降噪處理。常用的小波閾值降噪會在信號的不連續處產生虛假的波峰和偽吉布森震蕩&#xff0c;而奇異值分解SVD去噪容易產生虛假分量&#xff0c;全變差去噪則不會出現這樣的情況&…

美國大選特色

美國總統是間接民選的。選民不直接投票選舉總統&#xff0c;而是通過選舉一個稱為選舉人團&#xff08;Electoral College&#xff09;的機構成員來間接決定總統。具體過程如下&#xff1a; 1. **選民投票**&#xff1a;在11月的大選日&#xff0c;選民投票選舉他們所在州的選…